815338A Ohjelmointikielten periaatteet 2015-2016 VII Logiikkaohjelmointi
Sisältö 1. Johdanto 2. Predikaattilogiikan käsitteistöä 3. Prolog 815338A Ohjelmointikielten periaatteet, Logiikkaohjelmointi 2
VII.1. Johdanto Logiikkaohjelmointi = symboliseen logiikkaan perustuva ohjelmointi Käytetty kieli = logiikkaohjelmointikieli Joissakin yhteyksissä deklaratiivinen kieli = logiikkaohjelmointikieli 815338A Ohjelmointikielten periaatteet, Logiikkaohjelmointi 3
VII.1. Johdanto (2) Ohjelmoija ei määrittele ratkaisuun johtavia toimenpiteitä, vaan ratkaisuun johtavia ominaisuuksia eli väittämiä Ohjelma pyrkii päättelemään oikeellisuuden vertailemalla niitä tunnettuihin tosiasioihin Tulos: true -> väittämä on oikea, false -> väittämää ei pystytty todistamaan oikeaksi Tavoite: ohjelmoijan ei tarvitse keskittyä ratkaisuun johtavien toimenpiteiden ohjelmoimiseen vaan ratkaisun löytämisen logiikkaan 815338A Ohjelmointikielten periaatteet, Logiikkaohjelmointi 4
VII.1. Johdanto (3) Perustuu vahvasti symbolisen logiikan käyttöön Sovelluskohteita Tekoälysovellukset: Luonnollisen kielen käsittely, Asiantuntijajärjestelmät Relaatiotietokantojen käsittely 815338A Ohjelmointikielten periaatteet, Logiikkaohjelmointi 5
VII.2. Predikaattilogiikan käsitteistöä Predikaattilogiikkaa käsitellään Diskreettien rakenteiden kurssissa (moniste, luku 3) Propositio on looginen väittämä, jolla on totuusarvo Propositio- eli lauselogiikka, ei muuttujia Propositio on suljettu lause Symbolinen logiikka: esitetään propositioiden välisiä suhteita ja johdetaan uusia väittämiä olemassa olevista 815338A Ohjelmointikielten periaatteet, Logiikkaohjelmointi 6
VII.2. Predikaattilogiikan käsitteistöä (2) Propositiosymbolit Usein jokin tulkinta, esimerkiksi On kylmä tai Sataa Yhdistellään käyttämällä loogisia konnektiiveja (negaatio, konjunktio, disjunktio, ekvivalenssi ja implikaatio) Päättelyoperaattoreiden => ja <=> avulla päättelyketjuja, joista uusia lauseita 815338A Ohjelmointikielten periaatteet, Logiikkaohjelmointi 7
VII.2. Predikaattilogiikan käsitteistöä (2) Loogiset konnektiivit Nimi Symboli Esimerkki Semantiikka Negaatio a ei a Konjunktio a b a ja b Disjunktio a b a tai b Implikaatio tai a b a b a:sta seuraa b b:stä seuraa a Ekvivalenssi a b a ja b yhtäpitävät 815338A Ohjelmointikielten periaatteet, Logiikkaohjelmointi 8
VII.2. Predikaattilogiikan käsitteistöä (2) Päättelystä: Päättelyoperaattorit => ja <=> Näiden avulla päättelyketjuja: On kylmä Palelee On kylmä => Palelee 815338A Ohjelmointikielten periaatteet, Logiikkaohjelmointi 9
VII.2. Predikaattilogiikan käsitteistöä (2) Predikaattilogiikka Tarvitaan logiikkaohjelmoinnissa Voidaan muodostaa ilmauksia, jotka koskevat propositiojoukkoja Käytetään muuttujia ja kvanttoreita ja Kvanttorit universaalikvanttori eksistenssikvanttori Esimerkki. Y:P Kaikilla arvoilla Y P on tosi Z:Q On olemassa sellainen Z että Q on tosi Predikaatti on avoin lause (sisältää muuttujia) 815338A Ohjelmointikielten periaatteet, Logiikkaohjelmointi 10
VII.2.1. Predikaattilogiikan perusosat Vakiot Edustavat tunnettuja alkioita Merkitään pienillä kirjaimilla alkavilla tunnisteilla Kokonaisluvut Muuttujat Edustavat tuntemattomia alkioita Merkitään isoilla kirjaimilla alkavilla tunnisteilla 815338A Ohjelmointikielten periaatteet, Logiikkaohjelmointi 11
VII.2.1. Predikaattilogiikan perusosat (2) Funktiosymbolit eli funktorit Predikaattisymbolit eli predikaatit Muodostetaan alkioiden väliset relaatiot Voidaan tulkita totuusarvon tuottavan funktion nimeksi Esim. > : p(x,y) = X > Y Termit Lausekkeita jotka koostuvat vakioista, muuttujista ja funktoreista (ei kvanttoreita tai predikaatteja) Esim. f(x)+1 815338A Ohjelmointikielten periaatteet, Logiikkaohjelmointi 12
VII.2.1. Predikaattilogiikan perusosat (3) Atomikaavat Koostuvat predikaatista, jonka argumenttina voi olla termi Esim. Z < 0 f(y)-2 > 1 Kaavat Saadaan yhdistelemällä atomikaavoja loogisilla konnektiiveilla ja kvanttoreillla Esim. (f(x) < 1) (Y > 0) 815338A Ohjelmointikielten periaatteet, Logiikkaohjelmointi 13
VII.2.2. Atomiset propositiot Yksinkertaisimpia logiikkaohjelmoinnin lauseita Koostuvat yhdistetyistä termeistä Yhdistetty termi muodostuu kahdesta osasta; funktorista ja järjestetystä parametrilistasta: lammas(dolly) syö(dolly,ruoho) -> relaatio lammas sisältää alkion {dolly} ja relaatio syö järjestetyn kaksikon {dolly,ruoho} Eivät sisällä tulkintaa Voivat sisältää muuttujia 815338A Ohjelmointikielten periaatteet, Logiikkaohjelmointi 14
VII.2.3. Kootut propositiot *x++=*y++ Muodostetaan atomisista propositioista konnektiivien avulla: lammas(dolly) nisäkäs(dolly) syö(dolly,x) liha(x) 815338A Ohjelmointikielten periaatteet, Logiikkaohjelmointi 15
VII.2.4. Logiikkaohjelmoinnin mekanismeista *x++=*y++ Logiikkaohjelmoinnin sisällettävä mekanismeja, joiden avulla johdetaan uusia sääntöjä Sääntö voidaan johtaa annetuista tosista lauseista soveltamalla niihin äärellistä määrää peräkkäisiä päättelyjä Logiikkaohjelmoinnissa päättelymekanismit perustuvat modus ponens-sääntöön ja universaalikvanttorin eliminointiin. Modus ponens: A (A B) voidaan korvata B :llä 815338A Ohjelmointikielten periaatteet, Logiikkaohjelmointi 16
VII.2.4. Logiikkaohjelmoinnin mekanismeista (2) Universaalikvanttorin eliminoimissääntö: X:A(X) voidaan korvata lauseella, jossa kaikki muuttujan X vapaat esiintymät on korvattu jollakin termillä Koneellisen loogisen päättelyn ongelma: keskenään ekvivalenttien lauseiden joukko (kooltaan valtava) -> tarvitaan standardimuoto, propositioille -> klausuuli B 1 B 2... B N A 1 A 2... A M 815338A Ohjelmointikielten periaatteet, Logiikkaohjelmointi 17
VII.2.4. Logiikkaohjelmoinnin mekanismeista (2) Hornin klausuuli: B A 1 A 2... A M Siis klausuulin erikoistapaus Jos oikea puoli tyhjä, kyseessä fakta Esimerkki Hornin klausuulista syö(dolly,timotei) syö(dolly,ruoho) ruoho(timotei) 815338A Ohjelmointikielten periaatteet, Logiikkaohjelmointi 18
VII.2.4.1. Resoluutio Resoluutioperiaate: Alan Robinson vuonna 1965 Tutki mahdollisuuksia automatisoida lauseiden todistusmekanismeja Päättelymekanismi, jonka avulla annetuista propositioista johdetaan uusia 815338A Ohjelmointikielten periaatteet, Logiikkaohjelmointi 19
VII.2.4.1. Resoluutio (2) Periaate yksinkertaisesti: säännöt P Q (1) R P (2) Saadaan sääntö: R Q (3) Mekaanisesti supistamissääntö yhdistetään säännöt 1 ja 2: P R Q P Supistetaan P pois ja saadaan sääntö 3 815338A Ohjelmointikielten periaatteet, Logiikkaohjelmointi 20
VII.2.4.1. Resoluutio (2) Mekanismilla voidaan mekaanisesti todistaa lauseita Logiikkaohjelmoinnissa tarvitaan vielä universaalikvanttorin eliminointia Käyttö, kun halutaan todistaa jokin väite: 1.Esitetään väite Hornin klausuulin oikeana puolena 2.Klausuuli yhdistetään tunnettuihin sääntöihin 3.Resoluutiolla tyhjä klausuuli -> väite on tosi Väitettä voidaan myös nimittää kyselyksi (query) 815338A Ohjelmointikielten periaatteet, Logiikkaohjelmointi 21
VII.2.4.1. Resoluutio (Esimerkki) Oletetaan säännöt (1) jalat(x,2) nisäkäs(x) kädet(x,2) (2) jalat(x,4) nisäkäs(x) kädet(x,0) (3) nisäkäs(lammas) (4) kädet(lammas,0) Halutaan todistaa väite jalat(lammas,4) 1. Kirjoitetaan Hornin klausuulin oikeana puolena jalat(lammas,4) 815338A Ohjelmointikielten periaatteet, Logiikkaohjelmointi 22
VII.2.4.1. Resoluutio (Esimerkki) 2. Yhdistellään tunnettuihin sääntöihin. Yhdistetään sääntöön (2) jalat(x,4) nisäkäs(x) kädet(x,0) jalat(lammas,4) Korvataan x vakiolla lammas jalat(lammas,4) nisäkäs(lammas) kädet(lammas,0) jalat(lammas,4) Resoluutio, supistetaan jalat(lammas,4) nisäkäs(lammas) kädet(lammas,0) 815338A Ohjelmointikielten periaatteet, Logiikkaohjelmointi 23
VII.2.4.1. Resoluutio (Esimerkki) Yhdistetään sääntöön (3) nisäkäs(lammas) nisäkäs(lammas) kädet(lammas,0) Resoluutio, supistetaan nisäkäs(lammas) kädet(lammas,0) Yhdistetään sääntöön (4) kädet(lammas,0) kädet(lammas,0) 3. Resoluutio, supistetaan kädet(lammas,0) Saatiin tyhjä lause, joten väite on tosi 815338A Ohjelmointikielten periaatteet, Logiikkaohjelmointi 24
VII.3. Prolog Yleisin logiikkaohjelmointikieli Suunnittelijat Colmerauer, Roussel ja Kowalski Ensimmäinen Prolog tulkki implementoitiin Marseillessa vuonna 1972 Monia murteita, syntaksit vaihtelevat Edinburghin yliopiston versio jonkinlaisen standardin asemassa Olemassa myös ISO-standardi Ei puhtaasti logiikkaohjelmointikieli Imperatiivisia piirteitä 815338A Ohjelmointikielten periaatteet, Logiikkaohjelmointi 25
VII.3. Prolog (2) Perustuu Hornin klausuuleihin Notaatio: esi_isa(x,y) vanhempi(x,z) esi_isa(z,y) kirjoitetaan Prologissa esi_isa(x,y) :- vanhempi(x,z), esi_isa(z,y). Nimeäminen: Muuttujien nimet alkavat isolla kirjaimella Muuten alkukirjain pieni Prologin jokainen lause päättyy pisteeseen 815338A Ohjelmointikielten periaatteet, Logiikkaohjelmointi 26
VII.3.1. Prolog-ohjelmoinnin perusteet Peruslauseista oletetun tiedon tietokanta Voidaan johtaa uutta tietoa Prologin peruslausetyypit Lauseet, jotka vastaavat Hornin klausuulien vasenta puolta Katsotaan faktoiksi, ts. tulkitaan loogisesti tosiksi lauseiksi Lauseet jotka vastaavat varsinaisia Hornin klausuuleja Sanotaan myös säännöiksi Kysely (query) eli maalilause (goal) Väite, joka halutaan todistaa Esitetään tulkille samassa muodossa kuin faktat 815338A Ohjelmointikielten periaatteet, Logiikkaohjelmointi 27
VII.3.1. Prolog-ohjelmoinnin perusteet (2) Esimerkki. Oletetaan, että tietokantaan on syötetty lauseet esi_isa(x,y) :- vanhempi(x,z), esi_isa(z,y). esi_isa(x,x). vanhempi(nooa,haam). Kyselyt esi_isa(nooa,haam) -> yes esi_isa(haam,nooa) -> no esi_isa(x,haam) -> X=nooa 815338A Ohjelmointikielten periaatteet, Logiikkaohjelmointi 28
VII.3.1. Prolog-ohjelmoinnin perusteet (3) Aritmetiikka Prologissa Sisältää määrittelyt aritmeettisille operaatiolle ja lausekkeiden evaluoinnille On kerrottava, milloin aritmeettista lauseketta tarkastellaan lausekkeena ja milloin se on evaluoitava, esim. write(5+6). -> (5+6) X is 5+6, write(x). -> X=11 3+5 = 5+3 -> no (vertaillaan lausekkeina) Voidaan kirjoittaa vertailupredikaatti sama_arvo(termi1,termi2) :- X is Termi1, Y is Termi2, X=Y. sama_arvo(3+5,5+3) -> yes 815338A Ohjelmointikielten periaatteet, Logiikkaohjelmointi 29
VII.3.2. Prologin toimintamekanismista Instantiointi (instantiation) Muuttujalle annetaan tyyppi ja arvo Liittäminen (unification) Prosessi, jolla kaksi muuttujaa instantioidaan niin, että muuttujat täsmäävät resoluutiossa -> Ovat jossakin mielessä samat Ilmaistaan yhtäsuuruudella (=) 815338A Ohjelmointikielten periaatteet, Logiikkaohjelmointi 30
VII.3.2. Prologin toimintamekanismista (2) Esimerkkejä liittämisestä a = a -> yes (liittäminen onnistui) *x++=*y++ a = b -> no (eri vakioiden liittäminen ei onnistu) a = X -> X = a (muuttuja, jota ei ole instantioitu, liittyy mihin tahansa ja instantioituu tällä) f(a,z) = f(y,b) -> Z = b -> Y = a (liittäminen onnistuu kun Z=b ja Y = a) f(x) = g(x) -> no (kahden eri funktion liittäminen ei onnistu) 815338A Ohjelmointikielten periaatteet, Logiikkaohjelmointi 31
VII.3.2. Prologin toimintamekanismista (3) Resoluutio Prologissa Strategia, jolla johdetaan kyselyn tulos Hakustrategia syvyyssuntainen (depth-first) Resoluutiota sovelletaan täysin lineaarisesti siten, että maaleja korvataan vasemmalta oikealle ja tietokannan klausuuleja käydään läpi ylhäältä alaspäin Tehokas menetelmä *x++=*y++ 815338A Ohjelmointikielten periaatteet, Logiikkaohjelmointi 32
Esimerkki. Tietokannassa lauseet (1) esi_isa(x,y) :- vanhempi(x,z), esi_isa(z,y). (2) esi_isa(x,x). (3) vanhempi(nooa,haam). Annettu maali esi_isa(x,haam) -> saadaan alimaalien hakupuu Lause 3 Lause 1 Lause 1 vanhempi(x,z), esi_isa(z,haam) esi_isa(haam,haam) {X=nooa} esi_isa(x,haam) Lause 2 Lause 2 {X=haam} success vanhempi(haam,z), esi_isa(z,haam) fail {X=nooa} success 815338A Ohjelmointikielten periaatteet, Logiikkaohjelmointi 33
VII.3.2. Prologin toimintamekanismista (4) Perääntyminen (backtracking) Prolog palauttaa ensimmäisen vastaantulevan ratkaisun *x++=*y++ Jos ratkaisuja halutaan lisää, puussa peräydytään kunnes löydetään uusia haaroja, joita voidaan kulkea Peräytymismekanismia voidaan käyttää silmukoiden ja toistuvien hakujen toteuttamiseen Pakotetaan etsinnän jatkaminen, vaikka ratkaisu löytyykin (predikaatti fail) Haku katkaistaan operaattorilla! -> ikuiset hakuprosessit voidaan ehkäistä 815338A Ohjelmointikielten periaatteet, Logiikkaohjelmointi 34
VII.3.3. Prologin listat Perusrakenteita Prologissa Muistuttavat syntaksiltaan Haskellin listoja Lista = [eka, toka, kolmas]. Listojen purkumekanismi: merkintä [H T] lista, jonka pää on H ja häntä T. Listojen yhdistäminen: funktio append append($lista,[nelj],klista). -> Klista = [eka, toka, kolmas, nelj]. 815338A Ohjelmointikielten periaatteet, Logiikkaohjelmointi 35
VII.3.3. Prologin listat (2) Voidaan käyttää liittämistä:?-append(x,y,[1,2]). X = [], Y = [1, 2]; X = [1], Y = [2]; X = [1, 2], Y = []; false. 815338A Ohjelmointikielten periaatteet, Logiikkaohjelmointi 36
VII.3.3. Prologin listat (3) Esimerkki. Listan kääntämisoperaatio kaanna([],[]). kaanna([h T],K) :- kaanna(t,k1),append(k1,[h],k). 815338A Ohjelmointikielten periaatteet, Logiikkaohjelmointi 37
VII.3.4. Prologin puutteita Syvyyssuuntaisen hakustrategian puutteet Tehokas, mutta ei kestä vasemmanpuoleista rekursiota Liittämisalgoritmin ongelmat Prologin liittämisalgoritmi oikeastaan epäkorrekti Joutuu tietyissä tapauksissa ikuiseen rekursioon Tehokkaat korrektit algoritmit monimutkaisia 815338A Ohjelmointikielten periaatteet, Logiikkaohjelmointi 38
VII.3.3. Prologin puutteita (2) Negaatio ei ole looginen negaatio Suljetun maailman oletus : Jos väitettä ei voida todistaa oikeaksi, se oletetaan vääräksi Vastaus no tarkoittaa ainoastaan, että lausetta ei voitu johtaa -> ei tarkoita että olisi epätosi Ratkaisun spesifiointi ei yleensä riitä Voi johtaa verrattoman tehottomiin ratkaisuihin (esimerkiksi lajittelussa) -> Ohjelmoijan kirjoitettava ratkaisun yksityiskohdat -> Alkaa muistuttaa perinteisempää ohjelmointia 815338A Ohjelmointikielten periaatteet, Logiikkaohjelmointi 39