TIEA241 Automaatit ja kieliopit, syksy 2015 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 2. marraskuuta 2015
Sisällys
Opettajat Vastuuopettaja, luennoija Antti-Juhani Kaijanaho, antti-juhani.kaijanaho@jyu.fi tohtorikoulutettava, filosofian lisensiaatti väitöskirjan Evidence-Based Programming Language Design: A Philosophical and Methodological Exploration tarkastustilaisuus 4.12.2015 klo 12 vanhassa juhlasalissa (S212) vapaaohjelmistokehittäjä: Debian-kehittäjä 1999 2014 dctrl-tools-työkalupaketin pääkehittäjä toipilas vatsan ohitusleikkauksesta 5.10.2015 Tuntiopettaja (demotilaisuudet) Pyry Kotilainen, pyry.j.p.kotilainen@student.jyu.fi
Kurssin käytännöt Kurssin sivuilla http://users.jyu.fi/~antkaij/opetus/auki/2015/ Kysymys Tarvitaanko IRC-kanava, Slack tms?
Kirjallisuutta Luentojen pohjana: Michael Sipser: Introduction to the Theory of Computation. Second Edition, International Edition. Thompson 2006. John E. Hopcroft, Rajeev Motwani, Jeffrey D. Ullman: Introduction to Automata Theory, Languages, and Computation. Third Edition, Pearson International Edition. Addison Wesley, 2007. Täydentävää lukemista Alfred V. Aho, Monica S. Lam, Ravi Sethi, Jeffrey D. Ullman: Compilers Principles, Techniques, & Tools. Second Edition. Addison Wesley, 2007. Pekka Orponen: Laskennan teoria. Luentomoniste. http://users.ics.tkk.fi/orponen/ lectures/lte.pdf
Tämän kurssin ongelma tärkeää asiaa alan keskeistä teoriaa runsaasti sovelluksia tosin yleensä piilotettu kirjastojen ja apuohjelmien sisään tilaisuus tutustua alan perinteiseen tutkimusotteeseen olemme yliopistossa tärkeys vaikea nähdä opiskelijan roolissa havaittu joka kurssilla! itsekin tajusin kurssin tärkeyden vasta valmistumisen jälkeen
Tapahtui jokunen vuosi sitten Facebookissa Vesa Kaihlavirta Yksi tärkeimmistä kursseista. Pistä ne punnertamaan :P Antti-Juhani Kaijanaho Vesa, saako tuon kommentin näyttää opiskelijoille? Ja jos saa, niin kerkeäisitkö vielä vähän avaamaan miksi pidät tuota yhtenä tärkeimmistä kursseista. Vesa Kaihlavirta No jos luulet, että siitä on jotain hyötyä, niin siitä vain :) Vesa Kaihlavirta Se antaa hyvää ja Ihan Oikeasti sovellettavaa pohjaa ohjelmistosuunnitelussa tapahtuvalle formalisoinnille. (Meinasin tähän lisätä, että "Ei siis mitään oliosuunnittelun, UML:n ja muun sellaisen sonnan kaltaista vaan jotain Oikeaa." mutta ehkä se meni liian pitkälle) Lisäksi regexpien osaaminen on käytännöllisesti katsoen taikuutta tietämättömien näkökulmasta.
Tietotekniikan kolme traditiota 1 matemaattinen formaali verifiointi tietojenkäsittelyteoria tämä kurssi luonnontieteellinen tieteellinen metodi harvemmin oikeasti noudatettu, yleisemmin vain julistettu teknillinen insinöörinäkökulma luodaan artefakteja ehkä yleisin käytännössä 1 Matti Tedre & Erkki Sutinen: Three traditions of computing: what educators should now. Computer Science Education 18 (3), 153 170, 2008.
Perinteikästä asiaa Kurssin peruskäsitteet peräisin vuosilta 1936 1956 Kurssin asiasisältö vakiintui 1970-luvulla. Edelleen relevanttia! kaikki tietotekninen asia ei vanhene nopeasti!
Kolme laskennan mallia kuvitteellisia (abstrakteja) koneita eli automaatteja lukevat syötteen vastaavat kyllä tai ei merkkijonotulostus ym. mahdollista mutta sivuutetaan tällä kurssilla interaktiivisuus sivuutetaan tällä kurssilla erona käytettävissä oleva muisti
Automaatit äärelliset automaatit etukäteen rajattu muistin kapasiteetti pinoautomaatit äärellinen muisti lisäksi FIFO-periaatteella toimiva rajoittamaton pinomuisti Turingin koneet / RA-koneet äärellinen muisti lisäksi rajoittamaton nauhamuisti / hajasaantimuisti
Äärelliset automaatit tehokas merkkijonohaku, jos haku kohdistetaan isoon valmistelemattomaan aineistoon hakuehto on monimutkaisempi kuin pelkkä sana tai fraasi verkkoprotokollien mallinnukseen Ks. esim. RFC 3501, sivu 15 pelin NPC:iden toiminnan ohjelmointi 2 variantteja käytössä mm. suomen kielen oikeinkirjoituksen tarkistimissa 2 Ks. esim. Alexander Nareyek: AI in Computer Games. Queue 1 (10), 59 65, 2004.
Turingin koneet vanhin laskennan matemaattinen malli (1936) käsin laskennan matemaattinen malli laadittu ratkaisemaan ns. Entscheidungproblem, ratkeavuusongelma Mitä menetelmää noudattamalla ihminen voi ratkaista minkä tahansa matemaattisen ongelman? Turing vastasi: haluttua menetelmää ei ole. Turingin teesi: mikä tahansa käsin laskettava lukuteoreettinen funktio voidaan laskea jollakin Turingin koneella ei matemaattisesti todistettavissa Kaikki lukuteoreettiset funktiot, jotka voidaan laskea tietokoneella, voidaan laskea Turingin koneella. ei matemaattisesti todistettavissa yleisesti hyväksytty tietotekniikan perusolettamus!
Kieliopit Noam Chomskyn esitteli 1950-luvulla ns. lauserakennekieliopit kielioppi on joukko uudelleenkirjoitussääntöjä, joka tuottaa merkkijonoja säännöille esitetyt rajoitteet muodostavat kielioppien hierarkian (Chomskyn hierarkia): tyypin 0 kieliopit eli yleiset kieliopit tyypin 1 kieliopit eli kontekstiset kieliopit tyypin 2 kieliopit eli kontekstittomat kieliopit tyypin 3 kieliopit eli säännölliset kieliopit
Kontekstittomat kieliopit Käytetään yleisesti ohjelmointikielten syntaksin kuvaamiseen BNF, EBNF, ratakiskot jne ovat tapoja kirjoittaa kontekstiton kielioppi
Automaatit ja kieliopit Voidaan osoittaa ekvivalenssit: Kielioppityyppi yleinen kielioppi (tyyppi 0) kontekstiton kielioppi (tyyppi 2) säännollinen kielioppi (tyyppi 3) Automaattityyppi Turingin kone pinoautomaatti äärellinen automaatti
Säännölliset lausekkeet eli regexpit yleisesti käytetty tyypin 3 kieliopin tilalla sama ilmaisuvoima, helpompi käyttää kirjastototeutus löytyy useimmista ohjelmointikielistä käytössä myös monissa ohjelmissa hyvä tapa testata on käyttää Unixin egrep-ohjelmaa. tarkka syntaksi vaihtelee toteutuksesta riippuen
3 Regexp on yksinkertainen kieli, jolla voidaan kuvata monia merkkijonohakutehtäviä. Pääsääntöisesti regexp on merkkijono, jonka tulee löytyä sellaisenaan etsinnän kohdemerkkijonosta. Poikkeuksia on runsaasti: Piste (.) edustaa yhtä mielivaltaista merkkiä. Sulkeita (()) voidaan käyttää ryhmittelyyn. Kahden regexpin väliin voidaan laittaa pystyviiva ( ) tarkoittamaan vaihtoehtoisuutta. Regexpin perään voidaan laittaa kysymysmerkki (?) tarkoittamaan valinnaisuutta. Regexpin perään voidaan laittaa plusmerkki (+) tarkoittamaan mielivaltaista toistoa. Myös tähteä käytetään toistomerkkinä: X* tarkoittaa samaa kuin (X? X+) 3 Nämä ovat ns. laajennettuja POSIX-regexpejä.
Regexpeistä lisää Tähti, kysymysmerkki ja plusmerkki vaikuttavat mahdollisimman lyhyeeseen edeltävään regexpiin. ab+ tarkoittaa yhtä a:ta, jota seuraa yksi tai useampi b. (ab)+ tarkoittaa yhtä tai useampaa ab:tä. Pystyviiva vaikuttaa molemmilla puolilla mahdollisimman pitkään regexpiin. (ab cd)e tarkoittaa ab:tä tai cd:tä, jota (kumpaa tahansa) seuraa e. Mielivaltainen merkkijono kirjoitetaan.* (mielivaltainen merkki, joka voi puuttua tai toistua mielivaltaisen monta kertaa).
Ja vähän vielä regexpeistä Kenoviiva erikoismerkin edessä poistaa sen erityismerkityksen: \ tarkoittaa pelkkää pystyviivaa ilman mitään erityismerkitystä. Hakasulkeissa voidaan luetella merkkejä; tämä tarkoittaa mitä tahasa luetelluista merkeistä mutta vain yhtä niistä. Esim. a[bcd] tarkoittaa samaa kuin a(b c d). Luettelon aloittaminen sirkumfleksillä ^tekee negaation: [^bc] tarkoittaa mitä tahansa merkkiä paitsi b:tä ja c:tä. Viiva luettelon sisällä tarkoittaa merkkiväliä: [a-za-z] hyväksyy minkä tahansa ison tai pienen kirjaimen ääkkösiä lukuunottamatta.
Regexp-esimerkkejä (yksi kaksi kolme)+ \(0[0-9]+\) [0-9 ]+ [a-za-z_][a-za-z_0-9]* [+-]?([0-9]+\.[0-9]* [0-9]*\.[0-9]+)
Luentotehtävä Miten ohjelmoisit seuraavan hakutehtävän ilman regexpejä? (kissa koira)+kouluttajat?