TIEA241 Automaatit ja kieliopit, kesä 2013 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 20. toukokuuta 2013
Sisällys
Luennoija yliopistonopettaja ja tohtorikoulutettava tutkimusalana ohjelmointikielten kehitys vapaaohjelmistokehittäjä: Debian-kehittäjä vuodesta 1999 dctrl-tools-työkalupaketin pääkehittäjä Alue-foorumialustan kehittäjä... vasta valmistumisen jälkeen tajusin kuinka tärkeä kurssi tämä oli!
Kurssin käytännöt Kurssin sivuilla http://users.jyu.fi/~antkaij/opetus/auki/2013/
Poikkeusjärjestelyitä 4. 7.6. Menen käräjäoikeuteen hoitamaan lautamiestehtävääni keskiviikkona 5.6. Luento tuolta päivältä siirtyy edelliselle päivälle 4.6. Kauppakorkeakoululla on 5. 7.6. konferenssi, jossa haluaisivat käyttää Delta-salia koko päivän. Emme voi vaihtaa salia, koska vain Deltassa on kurssin videointiin käytettävä salitallennusjärjestelmä eikä tällä luennolla käytettävä videointipalvelu ole käytettävissä tuolloin. Olemmeko ystävällisiä ja siirrämme omat luentomme ja demomme perjaintaille 7.6.? Vaihtoehtoisesti demo maanantaille ja luento tiistaille seuraavalla viikolla?
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
Tapahtui taannoin 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.
?! Kurssin aihepiirin teoria tuli ensin, sovellukset vasta sitten.
Matematiikan kriisi 1874 Cantor todisti, että äärettömyydet eivät ole samanlaisia ja aloitti näin joukko-opin tutkimusohjelman 1897 Burali-Forti esitti joukko-oppiparadoksinsa 1899 Cantor esitti joukko-oppiparadoksinsa 1901 Russell esitti joukko-oppiparadoksinsa
Matematiikka alkaa toipua 1908 Zermelo esitti joukko-oppiaksioomansa 1910 3 Russell ja Whitehead julkaisevat Principia Mathematican, joka oli ensimmäinen yritys rakentaa koko matematiikka pohjalta alkaen 1922 Fraenkel ja Skolem (toisistaan riippumatta) laajentavat Zermelon aksiomatisointia laajennus tunnetaan nimellä Zermelon Fraenkelin (ZF) joukko-oppi ks. MATS155 Aksiomaattinen joukko-oppi
Matematiikka kriisiytyy taas 1900 Hilbert esitti 23 ongelmaansa, joista toinen oli matematiikan ristiriidattomuuden osoittaminen 1931 Kurt Gödel julkaisee kuuluisan epätäydellisyyslauseensa Principia Mathematica (ja muut vastaavat) ei kykene todistamaan omaa ristiriidattomuuttaan tulkitaan usein Hilbertin toisen ongelman (epä)ratkaisuksi ks. MATS150 Logiikan jatkokurssi
Uudesta kriisistä tietojenkäsittelyteoria 1928 Hilbert esitti ongelman, joka tunnetaan nimellä Entscheidungsproblem (ratkeavuusongelma) Onko olemassa algoritmi, joka kykenee sanomaan mistä tahansa hyvin määritellystä matemaattisesta väitteestä, onko se tosi vai ei? 1936 Alonzo Church käyttää luomaansa λ-laskentoa ratkaisemaan Hilbertin ratkeavuusongelman: algoritmia ei ole λ-laskennolle muodostui myöhemmin merkittävä rooli ohjelmointikielten teoriassa (ks. TIES542 Ohjelmointikielten periaatteet) 1936 Alan Turing (Churchista riippumatta) käyttää luomaansa Turingin konetta ratkaisemaan Hilbertin ratkeavuusongelman: algoritmia ei ole teemme olennaisesti saman kurssin loppupuolella
Kehitys kehittyy 1951 Stephen Cole Kleene [kleini:] tutkii neuroverkkoja ja määrittelee äärellisen automaatin ja säännöllisen lausekkeen käsitteet sekä todistaa niiden perusominaisuudet 1956 Noam Chomsky tutkii englannin kielen kieliopin esitysmuotoja ja määrittelee kontekstittomien kielioppien käsitteen 1959 John Backus ja Peter Naur käyttävät kontekstittomia kielioppeja ohjelmointikielten (Fortran, Algol) syntaksin määrittelyyn 1968 Ken Thompson käyttää säännöllisiä lausekkeita tekstieditorin hakutoiminnossa 1 1 Dennis Ritchie: An incomplete history of the QED Text Editor, http://cm.bell-labs.com/cm/cs/who/dmr/qed.html
Historiallista? Kurssin keskeiset teoreettiset ideat ovat siis peräisin vuosilta 1936 1956. Tutkimusalana automaattien ja kielioppien teoria oli vilkas vielä 1980-luvulla mutta kurssin asiat ovat stabiloituneet kauan sitten. Nykytutkimus alalla perustuu kurssilla esitettävään perusteoriaan mutta menee pääosin reilusti kurssin vaatimustason yli. Silti tämä kaikki on edelleen hyvin relevanttia 2010-luvun ohjelmistoammattilaisille!... kuten tulemme huomaamaan.
Yksinkertaisia automaatteja on/off-kytkin kioskiautomaatti ydinvoimalan hätäpysäytysjärjestelmä
Yksinkertaisia kielenkuvauksia (throws)? catch E vakio E + E E E E E E/E (E)
Ratkeamattomia ongelmia Seuraaville tehtäville (muiden muassa) ei ole algoritmia: Täsmällisesti esitetyn matemaattisen väittämän tunnistaminen todeksi tai epätodeksi. (Hilbertin Entschedungsproblem) Tietokoneohjelman ja sille annetun syötteen tunnistaminen sellaiseksi, että ohjelma pysähtyy kyseisellä syötteellä taikka sellaiseksi, että se jää ikuiseen silmukkaan kyseisellä syötteellä. (Pysähtymisongelma)
Toistuva esimerkki: grep Globally search for a Regular Expression and Print the result Unixin ed-tekstieditorin komennosta g/re/p, jossa re oli etsittävä hahmo tulostaa annetusta tekstitiedostosta kaikki rivit, joista löytyy annettu merkkijonohahmo toteutuksessa tarvitaan käytännössä kaikkia kurssin alku- ja keskiosassa opetettavia asioita vastaava toiminnallisuus löytyy mm. LibreOfficen hakutoiminnosta ja useimpien ohjelmointikielten regexp-kirjastoista luentoesimerkkinä rakennetaan kurssin kuluessa ja kurssin tekniikoita käyttämällä grep-ohjelma
Merkkijonohahmot eli regexpit 2 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+) 2 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?
: Kurssin alkupään asiat tekstihakujen toteuttaminen verkkoprotokollien suunnittelu suomen kielen morfologinen analyysi (esim. oikolukua varten) tietokoneohjelmien leksikaalinen analyysi ohjainlaitteiden suunnittelu ohjelmien oikeellisuustarkastelu
: Kurssin keskivaiheen asiat suomen kielen syntaktinen analyysi tietokoneohjelmien syntaktinen analyysi kääntäjät!
: Kurssin loppupään asiat tietotekniikan rajojen tunnistaminen