815338A Ohjelmointikielten periaatteet

Samankaltaiset tiedostot
815338A Ohjelmointikielten periaatteet: Logiikkaohjelmointi. Logiikkaohjelmointi

Prolog kielenä Periaatteet Yhteenveto. Prolog. Toni ja Laura Fadjukoff. 9. joulukuuta 2010

LOGIIKKA johdantoa

811120P Diskreetit rakenteet

FI3 Tiedon ja todellisuuden filosofia LOGIIKKA. 1.1 Logiikan ymmärtämiseksi on tärkeää osata erottaa muoto ja sisältö toisistaan:

Predikaattilogiikkaa

Insinöörimatematiikka A

Nimitys Symboli Merkitys Negaatio ei Konjuktio ja Disjunktio tai Implikaatio jos..., niin... Ekvivalenssi... jos ja vain jos...

Loogiset konnektiivit


-Matematiikka on aksiomaattinen järjestelmä. -uusi tieto voidaan perustella edellisten tietojen avulla, tätä kutsutaan todistamiseksi

Lisää kvanttoreista ja päättelyä sekä predikaattilogiikan totuustaulukot 1. Negaation siirto kvanttorin ohi

PROPOSITIOLOGIIKAN RIITTÄMÄTTÖMYYS

T Syksy 2004 Logiikka tietotekniikassa: perusteet Laskuharjoitus 7 (opetusmoniste, kappaleet )

815338A Ohjelmointikielten periaatteet Harjoitus 7 Vastaukset

Logiikan kertausta. TIE303 Formaalit menetelmät, kevät Antti-Juhani Kaijanaho. Jyväskylän yliopisto Tietotekniikan laitos.

Diskreetit rakenteet. 3. Logiikka. Oulun yliopisto Tietojenkäsittelytieteiden laitos 2015 / 2016 Periodi 1

T Syksy 2005 Logiikka tietotekniikassa: perusteet Laskuharjoitus 8 (opetusmoniste, kappaleet )

811120P Diskreetit rakenteet

Logiikka 1/5 Sisältö ESITIEDOT:

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

Pikapaketti logiikkaan

Johdatus logiikkaan I Harjoitus 4 Vihjeet

Kesälukio 2000 PK2 Tauluharjoituksia I Mallivastaukset

T Kevät 2006 Logiikka tietotekniikassa: perusteet Laskuharjoitus 8 (opetusmoniste, kappaleet )

HY / Matematiikan ja tilastotieteen laitos Johdatus logiikkaan I, syksy 2018 Harjoitus 4 Ratkaisuehdotukset

MS-A0402 Diskreetin matematiikan perusteet

T Kevät 2009 Logiikka tietotekniikassa: perusteet Laskuharjoitus 8 (Predikaattilogiikka )

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 8. syyskuuta 2016

Luonnollisen päättelyn luotettavuus

1 Logiikkaa. 1.1 Logiikan symbolit

Ratkaisu: Käytetään induktiota propositiolauseen A rakenteen suhteen. Alkuaskel. A = p i jollain i N. Koska v(p i ) = 1 kaikilla i N, saadaan

T kevät 2007 Laskennallisen logiikan jatkokurssi Laskuharjoitus 1 Ratkaisut

13. Loogiset operaatiot 13.1

Approbatur 3, demo 1, ratkaisut A sanoo: Vähintään yksi meistä on retku. Tehtävänä on päätellä, mitä tyyppiä A ja B ovat.

3. Predikaattilogiikka

T Kevät 2005 Logiikka tietotekniikassa: erityiskysymyksiä I Kertausta Ratkaisut

811120P Diskreetit rakenteet

missä on myös käytetty monisteen kaavaa 12. Pistä perustelut kohdilleen!

Predikaattilogiikan malli-teoreettinen semantiikka

Kirjoita käyttäen propositiosymboleita, konnektiiveja ja sulkeita propositiologiikan lauseiksi:

1. Logiikan ja joukko-opin alkeet

5.1 Semanttisten puiden muodostaminen

T Logiikka tietotekniikassa: perusteet Kevät 2008 Laskuharjoitus 5 (lauselogiikka ) A ( B C) A B C.

T Syksy 2004 Logiikka tietotekniikassa: perusteet Laskuharjoitus 12 (opetusmoniste, kappaleet )

Algebralliset tietotyypit ym. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Matematiikan johdantokurssi, syksy 2016 Harjoitus 11, ratkaisuista

13. Loogiset operaatiot 13.1

T Logiikka tietotekniikassa: perusteet Kevät 2008 Laskuharjoitus 11 (predikaattilogiikka )

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

Todistamisessa on tärkeää erottaa tapaukset, kun sääntö pätee joillakin tai kun sääntö pätee kaikilla. Esim. On olemassa reaaliluku x, jolle x = 5.

MS-A0401 Diskreetin matematiikan perusteet Yhteenveto, osa I

Ratkaisu: Yksi tapa nähdä, että kaavat A (B C) ja (A B) (A C) ovat loogisesti ekvivalentit, on tehdä totuustaulu lauseelle

T Syksy 2004 Logiikka tietotekniikassa: perusteet Laskuharjoitus 2 (opetusmoniste, lauselogiikka )

Toinen muotoilu. {A 1,A 2,...,A n,b } 0, Edellinen sääntö toisin: Lause 2.5.{A 1,A 2,...,A n } B täsmälleen silloin kun 1 / 13

MS-A0402 Diskreetin matematiikan perusteet Esimerkkejä, todistuksia ym., osa I

TAMPEREEN YLIOPISTO Pro gradu -tutkielma. Roosa Niemi. Riippuvuuslogiikkaa

MS-A0402 Diskreetin matematiikan perusteet Esimerkkejä, todistuksia ym., osa I

Johdatus matematiikkaan

Tehtävä 1. Päättele resoluutiolla seuraavista klausuulijoukoista. a. 1 {p 3 } oletus. 4 {p 1, p 2, p 3 } oletus. 5 { p 1 } (1, 2) 7 (4, 6)

LOGIIKKA, TIETÄMYS JA PÄÄTTELY

Rakenteiset päättelyketjut ja avoin lähdekoodi

Tehtäväsarja I Seuraavissa tehtävissä harjoitellaan erilaisia todistustekniikoita. Luentokalvoista 11, sekä voi olla apua.

Todistusmenetelmiä Miksi pitää todistaa?

Unify( Tuntee(Jussi, x), Tuntee(y, z) ) { y/jussi, z/x } { y/jussi, x/jussi, z/jussi }

missä on myös käytetty monisteen kaavaa 12. Pistä perustelut kohdilleen!

Todistusteoriaa. Kun kielen syntaksi on tarkasti määritelty, voidaan myös määritellä täsmällisesti, mitä pätevällä päättelyllä tarkoitetaan.

Entscheidungsproblem

811120P Diskreetit rakenteet

ITKP102 Ohjelmointi 1 (6 op)

2. Minkä joukon määrittelee kaava P 0 (x 0 ) P 1 (x 0 ) mallissa M = ({0, 1, 2, 3}, P M 0, P M 1 ), kun P M 0 = {0, 1} ja P M 1 = {1, 2}?

Entscheidungsproblem

Karteesinen tulo. Olkoot A = {1, 2, 3, 5} ja B = {a, b, c}. Näiden karteesista tuloa A B voidaan havainnollistaa kuvalla 1 / 21

Rekursio. Funktio f : N R määritellään yleensä antamalla lauseke funktion arvolle f (n). Vaihtoehtoinen tapa määritellä funktioita f : N R on

MS-A0402 Diskreetin matematiikan perusteet Yhteenveto, osa I

b) Määritä myös seuraavat joukot ja anna kussakin tapauksessa lyhyt sanallinen perustelu.

Vaihtoehtoinen tapa määritellä funktioita f : N R on

4 Matemaattinen induktio

815338A Ohjelmointikielten periaatteet

Propositiot: Propositiot ovat väitelauseita. Totuusfunktiot antavat niille totuusarvon T tai E.

Lauselogiikka Tautologia

Opintomoniste logiikan ja joukko-opin perusteista

Kieli merkitys ja logiikka

TIEA241 Automaatit ja kieliopit, kevät 2011 (IV) Antti-Juhani Kaijanaho. 16. maaliskuuta 2011

Johdatus matemaattiseen päättelyyn

Vastaoletuksen muodostaminen

Reaalifunktioista 1 / 17. Reaalifunktioista

Algoritmit. Ohjelman tekemisen hahmottamisessa käytetään

Reaalilukuvälit, leikkaus ja unioni (1/2)

ALGORITMI- MATEMATIIKKA. Keijo Ruohonen

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

TAMPEREEN YLIOPISTO Pro gradu -tutkielma. Heidi Luukkonen. Sahlqvistin kaavat

Lause 5. (s. 50). Olkoot A ja B joukkoja. Tällöin seuraavat ehdot ovat

Matematiikan tukikurssi

TIEA341 Funktio-ohjelmointi 1, kevät 2008

Konnektiivit. On myös huomattava, että vain joillakin luonnollisen kielen konnektiiveilla on vastineensa lauselogiikassa.

11.4. Context-free kielet 1 / 17

Matematiikan peruskurssi 2

Matematiikan tukikurssi, kurssikerta 1

HY / Matematiikan ja tilastotieteen laitos Johdatus logiikkaan I, syksy 2018 Harjoitus 5 Ratkaisuehdotukset

Transkriptio:

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