Logikprogrammering Undervisningsmaterialet NYTT för 2013: Learn Prolog Now! SWI Prolog-tolk, startas under tuxedo/ pingvinerna med swipl!
Learn Prolog Now!
SWI Prolog Gratis Prolog-tolk Lesser GNU Public License Fungerar på Linux, Windows Mac OS Det finns många olika Prolog-tolkar Alla följer inte ISO-standarden
Föreläsning 1 Teori Introduktion till Prolog Fakta, regler och förfrågningar. Prologs syntax Exercises ( hemläxa ) Praktisk träning
FL 1: innehåll Ge några enkla exempel på Prologprogram Presentera Prologs tre grundstrukturer: Fakta (Facts) Regler (Rules) Förfrågningar (Queries) Introducera andra begrepp, bl a logikens roll unifiering mha variabler Börja studera Prolog systematiskt genom att definiera termer, atomer och variabler.
Prolog "Programming with Logic" Deklarativt Mycket olikt andra (procedurala) programmeringsspråk Bra för kunskapsintensiva uppgifter
Prologs historia första Prolog-tolken av Colmerauer och Roussel 1972 1977 1980 1980s/1990s 2005
Prologs historia implementation av en DEC10-kompilator av Warren 1972 1977 1980 1980s/1990s 2005
Prologs historia Definite Clause Grammars implementation av Pereira och Warren 1972 1977 1980 1980s/1990s 2005
Prologs historia Prolog blir mera populärt, speciellt i Europa och Japan 1972 1977 1980 1980s/1990s 2005
Prologs historia Prolog används för att programmera naturligt språk-gränssnitt i International Space Station av NASA 1972 1977 1980 1980s/1990s 2005
Prologs grundidé Beskriv den relevanta situationen Ställ en fråga Prolog härleder logiskt nya fakta gällande den situation vi beskrivit Prolog delger oss sina slutsatser som svar
Konsekvenser Tänk deklarativt, inte proceduralt Utmanande Requires a different mindset Högnivåspråk Inte så effektivt som ex. C Bra när det gäller att producera snabba prototyper Nyttigt i många AI-applikationer
Kunskapsbas 1 woman(mia). woman(jody). woman(yolanda). playsairguitar(jody). party. Ska skrivas in i en separat fil, som laddas med ex.?- [prolog/lesson1]. filen i exemplet skulle heta prolog/lesson1.pl ej med
Kunskapsbas 1 woman(mia). woman(jody). woman(yolanda). playsairguitar(jody). party.?-
Kunskapsbas 1 woman(mia). woman(jody). woman(yolanda). playsairguitar(jody). party.?- woman(mia).
Kunskapsbas 1 woman(mia). woman(jody). woman(yolanda). playsairguitar(jody). party.?- woman(mia). yes?-
Kunskapsbas 1 woman(mia). woman(jody). woman(yolanda). playsairguitar(jody). party.?- woman(mia). yes?- playsairguitar(jody).
Kunskapsbas 1 woman(mia). woman(jody). woman(yolanda). playsairguitar(jody). party.?- woman(mia). yes?- playsairguitar(jody). yes?-
Kunskapsbas 1 woman(mia). woman(jody). woman(yolanda). playsairguitar(jody). party.?- woman(mia). yes?- playsairguitar(jody). yes?- playsairguitar(mia). no
Kunskapsbas 1 woman(mia). woman(jody). woman(yolanda). playsairguitar(jody). party.?- tattoed(jody).
Kunskapsbas 1 woman(mia). woman(jody). woman(yolanda). playsairguitar(jody). party.?- tattoed(jody). no?-
Kunskapsbas 1 woman(mia). woman(jody). woman(yolanda). playsairguitar(jody). party.?- tattoed(jody). ERROR: predicate tattoed/1 not defined.?-
Kunskapsbas 1 woman(mia). woman(jody). woman(yolanda). playsairguitar(jody). party.?- party.
Kunskapsbas 1 woman(mia). woman(jody). woman(yolanda). playsairguitar(jody). party.?- party. yes?-
Kunskapsbas 1 woman(mia). woman(jody). woman(yolanda). playsairguitar(jody). party.?- rockconcert.
Kunskapsbas 1 woman(mia). woman(jody). woman(yolanda). playsairguitar(jody). party.?- rockconcert. no?-
Kunskapsbas 2 happy(yolanda). listens2music(mia). listens2music(yolanda):- happy(yolanda). playsairguitar(mia):- listens2music(mia). playsairguitar(yolanda):- listens2music(yolanda).
Kunskapsbas 2 happy(yolanda). listens2music(mia). fact listens2music(yolanda):- happy(yolanda). playsairguitar(mia):- listens2music(mia). playsairguitar(yolanda):- listens2music(yolanda).
Kunskapsbas 2 happy(yolanda). listens2music(mia). fact fact listens2music(yolanda):- happy(yolanda). playsairguitar(mia):- listens2music(mia). playsairguitar(yolanda):- listens2music(yolanda).
Kunskapsbas 2 happy(yolanda). listens2music(mia). fact fact listens2music(yolanda):- happy(yolanda). playsairguitar(mia):- listens2music(mia). playsairguitar(yolanda):- listens2music(yolanda). rule
Kunskapsbas 2 happy(yolanda). listens2music(mia). fact fact listens2music(yolanda):- happy(yolanda). rule rule playsairguitar(mia):- listens2music(mia). playsairguitar(yolanda):- listens2music(yolanda).
Kunskapsbas 2 happy(yolanda). listens2music(mia). fact fact listens2music(yolanda):- happy(yolanda). rule rule playsairguitar(mia):- listens2music(mia). playsairguitar(yolanda):- listens2music(yolanda). rule
Kunskapsbas 2 happy(yolanda). listens2music(mia). listens2music(yolanda):- happy(yolanda). playsairguitar(mia):- listens2music(mia). playsairguitar(yolanda):- listens2music(yolanda). head body
Kunskapsbas 2 happy(yolanda). listens2music(mia). listens2music(yolanda):- happy(yolanda). playsairguitar(mia):- listens2music(mia). playsairguitar(yolanda):- listens2music(yolanda).?-
Kunskapsbas 2 happy(yolanda). listens2music(mia). listens2music(yolanda):- happy(yolanda). playsairguitar(mia):- listens2music(mia). playsairguitar(yolanda):- listens2music(yolanda).?- playsairguitar(mia). yes?-
Kunskapsbas 2 happy(yolanda). listens2music(mia). listens2music(yolanda):- happy(yolanda). playsairguitar(mia):- listens2music(mia). playsairguitar(yolanda):- listens2music(yolanda).?- playsairguitar(mia). yes?- playsairguitar(yolanda). yes
Satser (clauses) happy(yolanda). listens2music(mia). listens2music(yolanda):- happy(yolanda). playsairguitar(mia):- listens2music(mia). playsairguitar(yolanda):- listens2music(yolanda). Det finns fem satser i den här kunskapsbasen: två fakta och tre regler. Slutet på en sats markeras med en punkt.
Predikat happy(yolanda). listens2music(mia). listens2music(yolanda):- happy(yolanda). playsairguitar(mia):- listens2music(mia). playsairguitar(yolanda):- listens2music(yolanda). Det finns tre predikat i den här kunskapsbasen: happy, listens2music, och playsairguitar
Kunskapsbas 3 happy(vincent). listens2music(butch). playsairguitar(vincent):- listens2music(vincent), happy(vincent). playsairguitar(butch):- happy(butch). playsairguitar(butch):- listens2music(butch).
Att uttrycka konjunktion happy(vincent). listens2music(butch). playsairguitar(vincent):- listens2music(vincent), happy(vincent). playsairguitar(butch):- happy(butch). playsairguitar(butch):- listens2music(butch). Kommat, uttrycker konjunktion (and/och) i Prolog
Kunskapsbas 3 happy(vincent). listens2music(butch). playsairguitar(vincent):- listens2music(vincent), happy(vincent). playsairguitar(butch):- happy(butch). playsairguitar(butch):- listens2music(butch).?- playsairguitar(vincent). no?-
Kunskapsbas 3 happy(vincent). listens2music(butch). playsairguitar(vincent):- listens2music(vincent), happy(vincent). playsairguitar(butch):- happy(butch). playsairguitar(butch):- listens2music(butch).?- playsairguitar(butch). yes?-
Att uttrycka disjunktion (eller/or) happy(vincent). listens2music(butch). playsairguitar(vincent):- listens2music(vincent), happy(vincent). playsairguitar(butch):- happy(butch). playsairguitar(butch):- listens2music(butch). happy(vincent). listens2music(butch). gärna playsairguitar(vincent):- listens2music(vincent), happy(vincent). playsairguitar(butch):- happy(butch); listens2music(butch).
Prolog och Logik Prolog har klart något med logik att göra... Operatorer Implikation :- (P -> Q: Q :- P) Konjunktion, (och) Disjunktion ; (eller) Använder modus ponens Negation A -> B A Q om P B
Kunskapsbas 4 woman(mia). woman(jody). woman(yolanda). loves(vincent, mia). loves(marsellus, mia). loves(pumpkin, honey_bunny). loves(honey_bunny, pumpkin).
Prologs variabler woman(mia). woman(jody). woman(yolanda). loves(vincent, mia). loves(marsellus, mia). loves(pumpkin, honey_bunny). loves(honey_bunny, pumpkin).?- woman(x). Stor begynnelsebokstav signalerar variabel
Instantiering av variabler woman(mia). woman(jody). woman(yolanda). loves(vincent, mia). loves(marsellus, mia). loves(pumpkin, honey_bunny). loves(honey_bunny, pumpkin).?- woman(x). X=mia X instantieras till första värdet som hittas i kunskapsbasen som gör påståendet sant.
Att fråga efter alternativ woman(mia). woman(jody). woman(yolanda). loves(vincent, mia). loves(marsellus, mia). loves(pumpkin, honey_bunny). loves(honey_bunny, pumpkin).?- woman(x). X=mia; Tryck på semikolon eller spacebar!
Att fråga efter alternativ woman(mia). woman(jody). woman(yolanda). loves(vincent, mia). loves(marsellus, mia). loves(pumpkin, honey_bunny). loves(honey_bunny, pumpkin).?- woman(x). X=mia; X=jody
Att fråga efter alternativ woman(mia). woman(jody). woman(yolanda). loves(vincent, mia). loves(marsellus, mia). loves(pumpkin, honey_bunny). loves(honey_bunny, pumpkin).?- woman(x). X=mia; X=jody; X=yolanda
Att fråga efter alternativ woman(mia). woman(jody). woman(yolanda). loves(vincent, mia). loves(marsellus, mia). loves(pumpkin, honey_bunny). loves(honey_bunny, pumpkin).?- woman(x). X=mia; X=jody; X=yolanda; no no signalerar att det inte finns flera svar
Kunskapsbas 4 woman(mia). woman(jody). woman(yolanda). loves(vincent, mia). loves(marsellus, mia). loves(pumpkin, honey_bunny). loves(honey_bunny, pumpkin).?- loves(marsellus,x), woman(x). Finns det nån kvinna som marsellus älskar?
Kunskapsbas 4 woman(mia). woman(jody). woman(yolanda). loves(vincent, mia). loves(marsellus, mia). loves(pumpkin, honey_bunny). loves(honey_bunny, pumpkin).?- loves(marsellus,x), woman(x). X=mia yes?-
Kunskapsbas 4 woman(mia). woman(jody). woman(yolanda). loves(vincent, mia). loves(marsellus, mia). loves(pumpkin, honey_bunny). loves(honey_bunny, pumpkin).?- loves(pumpkin,x), woman(x).
Kunskapsbas 4 woman(mia). woman(jody). woman(yolanda). loves(vincent, mia). loves(marsellus, mia). loves(pumpkin, honey_bunny). loves(honey_bunny, pumpkin).?- loves(pumpkin,x), woman(x). no?-
Kunskapsbas 5 loves(vincent,mia). loves(marsellus,mia). loves(pumpkin, honey_bunny). loves(honey_bunny, pumpkin). jealous(x,y):- loves(x,z), loves(y,z).?- jealous(marsellus,w).
Kunskapsbas 5 loves(vincent,mia). loves(marsellus,mia). loves(pumpkin, honey_bunny). loves(honey_bunny, pumpkin). jealous(x,y):- loves(x,z), loves(y,z).?- jealous(marsellus,w). W=vincent?-
Kunskapsbas 5 loves(vincent,mia). loves(marsellus,mia). loves(pumpkin, honey_bunny). loves(honey_bunny, pumpkin). jealous(x,y):- loves(x,z), loves(y,z). En aningen speciell definition av svartsjuka; X är svarsjuk på Y ifall både X och Y älskar samma Z. X Z Y
Kunskapsbas 5 loves(vincent,mia). loves(marsellus,mia). loves(pumpkin, honey_bunny). loves(honey_bunny, pumpkin). jealous(x,y):- loves(x,z), loves(y,z). Hur skulle du ändra predikatet jealous för att beskriva situationen där man är svartsjuk på den som älskas av den som man själv älskar?
Kunskapsbas 5 Hur skulle du ändra predikatet jealous för att beskriva situationen där man är svartsjuk på den som älskas av den som man själv älskar? jealous(x,y):- loves(x,z), loves(z,y). X Z Y
Kunskapsbas 5 jealous(x,y):- loves(x,z), loves(z,y). X Z Obs! Eftersom Prologs unifiering fungerar såsom den fungerar, kommer denna definition också att innebära att man är svartsjuk på sig själv, ifall kärleken är besvarad; det finns ingenting som hindrar X och Y från att bindas till samma objekt! Y
Kunskapsbas 5 jealous(x,y):- loves(x,z), loves(z,y). X Y Z fallet X = Y
Kunskapsbas 5 jealous(x,y):- loves(x,z), loves(z,y). X Y Z fallet X = Z = Y Ifall vår kunskapsbas innehåller fall där någon älskar sig själv (mycket psykologiskt sunt nog!), får vi ännu konstigare situationer...
Kunskapsbas 5 jealous(x,y):- loves(x,z), loves(z,y). X Z fallet X = Z Denna person skulle också vara patologiskt svartsjuk på alla de andra personer han/hon älskar... Y
Kunskapsbas 5 jealous(x,y):- loves(x,z), loves(z,y). X Y Z fallet X = Z = Y För att undvika dessa tolkningar måste vi explicit förbjuda vissa bindningar i reglerna, ex. X \= Y. Vi ska se närmare på dessa i nästa kapitel, unifiering.
Strangelove...(konstiga bindningar)?- [strangelove].! % strangelove compiled 0.00 sec, 7 clauses! true.!?- listing.! jealous(a, C) :-!!loves(a, B),!!loves(B, C).! loves(jason, medeia).! loves(medeia, jason).! loves(medeia, khrysis).! loves(jason, jason).! true.! jason krysis medeia
Strangelove...(konstiga bindningar)?- jealous(medeia, X). X = medeia ; X = jason ; false. jason krysis medeia
Strangelove...(konstiga bindningar) [trace]?- jealous(medeia, X). Call: (6) jealous(medeia, _G337)? creep Call: (7) loves(medeia, _G407)? creep Exit: (7) loves(medeia, jason)? creep Call: (7) loves(jason, _G337)? creep Exit: (7) loves(jason, medeia)? creep Exit: (6) jealous(medeia, medeia)? creep jason X = medeia ; medeia som älskar jason är svartsjuk på den som jason älskar (= medeia) krysis medeia
Strangelove...(konstiga bindningar) Redo: (7) loves(jason, _G337)? creep Exit: (7) loves(jason, jason)? creep Exit: (6) jealous(medeia, jason)? creep X = jason ; medeia som älskar jason är svartsjuk på den som jason älskar (= jason) jason krysis medeia
Strangelove...(konstiga bindningar) Redo: (7) loves(medeia, _G407)? creep Exit: (7) loves(medeia, khrysis)? creep Call: (7) loves(khrysis, _G337)? creep Fail: (7) loves(khrysis, _G337)? creep Fail: (6) jealous(medeia, _G337)? creep false. Eftersom khrysis som medeia också älskar inte älskar någon, behöver medeia inte vara svartsjuk på denna någon. jason krysis medeia
Vad lär vi oss om detta? ALLT du skriver i reglerna tar Prolog bokstavligen. Prolog kommer att hitta alla de konstiga konsekvenser som dina regler kan ha. På detta sätt hjälper Prolog dig att skriva logiska definitioner utan luckor. Om du inte lär dig att täcka luckorna blir du snart din egen syster eller farfar.
Kunskapsbas 5 loves(vincent,mia). loves(marsellus,mia). loves(pumpkin, honey_bunny). loves(honey_bunny, pumpkin). jealous(x,y):- loves(x,z), loves(y,z). Observera att det är vi/ programmeraren som ger mening åt predikaten och dess argument, inte systemet!
Prologs syntax Vad exakt består fakta, regler och förfrågningar av? Terms Simple Terms Constants Variables Atoms Numbers Complex Terms
Atomer En sekvens av stora och små bokstäver, siffror eller understreck som börjar med en liten bokstav Exempel: butch, big_kahuna_burger, playguitar En arbiträr sekvens av tecken innesluten inom apostrofer Exempel: 'Vincent', 'Five dollar shake', '@$%' En sekvens av specialtecken Exempel: :, ;. :-
Tal Integers: 12, -34, 22342 Floats: 34573.3234
Variabler En teckensekvens som kan bestå av stora eller små bokstäver, siffror och _ och börjar med antingen en stor bokstav eller _. Exempel: Stor begynnelsebokstav signalerar ALLTID en variabel! X, Y, Variable, Vincent, _tag
Komplexa termer Atomer, tal och variabler är byggklossar för komplexa termer Komplexa termer byggs av en funktor som direkt åtföljs av en sekvens av argument Argumenten ges inom vanliga parenteser (), och separeras av kommatecken Funktorn måste vara en atom
Exempel på komplexa termer Exempel vi redan sett : playsairguitar(jody) loves(vincent, mia) jealous(marsellus, W) Komplexa termer inne i komplexa termer: hide(x,father(father(father(butch))))
Aritet Antalet argument en komplex term kräver kallas för dess aritet Exempel: woman(mia) är en term med aritet 1 loves(vincent,mia) har aritet 2 father(father(butch)) har aritet 1
Aritet är viktig I Prolog kan du definiera två predikat med samma funktor men med olika aritet Prolog skulle betrakta dessa som två olika predikat I Prolog-dokumentation anges ariteten av ett predikat vanligtvis med suffixet "/ efterföljt av ett nummer som representerar antalet argument
Exempel på aritet happy(yolanda). listens2music(mia). listens2music(yolanda):- happy(yolanda). playsairguitar(mia):- listens2music(mia). playsairguitar(yolanda):- listens2music(yolanda). Den här kunskapsbasen definierar happy/1 listens2music/1 playsairguitar/1
Övningar Inför nästa föreläsning ska du bekanta dig med Prolog-tolken swipl. Fundera genom (åtminstone) övningarna 1.1-1.2 från boken: Jobba genom practical session efter kapitel 1 i boken:
Sammandrag Enkla exempel på Prologprogram Introducerade tre baskonstruktioner i Prolog: Fakta Regler Förfrågningar Diskuterade andra begrepp, såsom logikens roll unifiering mha variabler Definition av Prologs byggstenar: termer, atomer och variabler
Nästa föreläsning Diskuterar unifiering i Prolog Prologs sökstrategi