Crash Course in Prolog Baran Çürüklü Introduktion till PROLOG, dvs. PROgramming in LOGic Prolog-programmen är deklarativa och består av egenskaper, relationer och regler. Lisp and Prolog är de vanligaste programmeringsspråken för symbolisk AI. Mycket bra för utforskning" och "prototyp programmering". Prolog bygger på Horn-satser, delmängd till första ordningens predikatlogiken. Viktiga begrepp/områden i Prolog Baskunskaper i Prolog: databaser, listor, metalogiska predikat, ackumulatorer, svansrekursion, (DCG), generateand-test, sökning. Anknytning till andra områden: Relationsdatabaser, Expertsystem, Formella språk och automata-teori, (Naturlig språkhantering). Att tänka deklarativt. Traditionell Programmering Imperativa programmeringsspråk: är i stort en abstraktion av turingmaskin (ett program är instruktioner till en turingmaskin). har en operationell semantik i termer av vad turingmaskinen ska utföra. är kontextberoende (vilka operationer som gjorts innan). Ett Logikprogram Logik och Programmering En beskrivning i en vald logik av en verklig eller tänkt värld. Beskrivning av allt relevant för att lösa uppgiften: ->relationer mellan objekten i världen (personer, tal, listor, träd, ). En logik har 4 delar syntax (för logiska formler) semantik (exakt betydelse) uppsättning axiom (tex. tautologier) inferensregler (exv modus ponens) Logiker: Satslogik, predikatlogik, typad logik, temporallogik (händelser, intervaller, ), modallogik (sanlikheter, kanske, sant i alla världar, ) 1
Dagsläge för Prolog & Logik : Prolog används för prototyper Större kommersiella system (länkas till.exe och användaren vet ej att systemet är implementerat i Prolog). Kompilatorer/Interpretatorer (Erlang interpretatorn utvecklades i Prolog). Grafiska paket, snabb exekvering, bra gränssnitt till andra programmeringsspråk (anropbart och kan anropa exv C/Java rutiner). Används im naturligt språk, tolkning, översättning etc. Gränssnitt till webben (exv. LPA-Prolog). Dagsläge för Logik och Logikprogrammering: formell verifiering av säkerhetskritiska system (landningsställ, ställverk/signalering för rälssystem, hårdvara, mm). Hårdvarudesign (TTL-logikkretsar, sant=1=5 volt, falskt=0=0 volt), predikatlogik, temporallogik, modallogik, fuzzy logic. Framtiden för Prolog? Kunskapsrepresentation (SDL, XML, Relationsdatabaser -> Kunskapsbaser, naturligt språk), temporallogik. Säkerhetskritiska system kräver i framtiden bevis för att de är korrekta. flyg, transport, telecom, medicin, mm (program i C är mycket svåra att testa!). Prolog utvecklas: Constraint Logic Programming (CLP): parallell-exekvering Agentprogrammering webb programmering Deklarativa och imperativa språk Filosofi Program Exempel Fördelar Imperativa språk Användaren talar om hur problemet ska lösas En sekvens av kommandon Basic, C, C++, Ada, Java, Perl, Phyton, Snabba och specialiserade program Deklarativa språk Användaren talar om vad problemet är En mängd påståenden Prolog, ML, Scheme, Gödel, mercury, Oz, (SQL), Generella, läsbara och möjlighet till korrekta program Olika språkparadigmer imperativa språk är tvingande, dvs en given exekveringsordning. högnivåinstruktioner till en processor. Ett deklarativt program: inget om hur det ska exekveras (sant i pure Prolog ). beskriver endast problemet och kunskapen om problemet. Ursprung i logik och hur människan resonerar logiskt. Några viktiga beteckningar (Logik) Predikatnamnär ett samlingsnamn för egenskaps- och relationsnamn. Predikatnamnet åtföljs av argumenten. Ställighet (=aritet) anger antal argument predikatet har. Ställighet = 0: satslogik (inga argument) Ställighet = 1: egenskap Ställighet = 2: relation Argumenten kallas för termer. En term kan vara konstant, variabel eller en struktur (sammansatt term). 2
Del 2: Testa Prolog Gratis Prolog för utbildning (Linux/Mac/Windows): http://www.swi-prolog.org/ Tar lite plats (ca 4 Meg). Många Prolog introduktioner på webben, sök med www.google.com efter Prolog tutorial introduction Prolog skiljer sig Prolog har inga globala variabler Inga tilldelningssatser Inga iterativa konstruktioner (t.ex. loopar) Inga if then satser Rekursion är central i Prolog Begrepp i Prolog Sant eller falskt, ett Prolog uttryck kan bara anta två värden, sant eller falskt Två argument kan vara lika eller olika. Likhet kan fås gem att fria variabler binds. Sökning, Prolog bygger på sökning, Prolog försöker hitta en lösning och testar olika vägar. Backtracking, om sökningen misslyckas, backar Prolog tillbaks och provar alternativa vägar. EGENSKAPER skrivs: man(adam). man(kalle). man(lasse). woman(lisa). woman(eva). RELATIONER skrivs: parent(adam,peter). % adam är förälder till peter parent(eva,kalle). parent(eva,lisa). parent(lisa,lasse). parent(kalle, knut). % Avsluta alltid raden med en punkt! Resterande text efter % är kommentar Definition av Regler Varje regel har ett huvud (head) namnet som definierar relationen. Varje regel har en kropp (body) själva definitionen av relationen. Definition av mor och far följer nedan: OM M är en kvinna och M är förälder till C så är M mor till C : mother(m,c):- woman(m), parent(m,c). OM F är en man och F är förälder till C så är F far till C : father(f,c):- man(f), parent(f,c). :- betyder (logisk implikation), betyder logiskt OCH, både man och parent måste vara sant för att father skall vara sant. Prolog Interpretatorn Fakta och regler skrivs i fil som har slutar på.pl Släpp filen på prolog ikonen eller ladda in (se manual). Fråga Prolog om det finns någon kvinna. woman(x). X = lisa? ; X = eva? ; Prolog Prompt: Prolog skriver alltid ut?-. Efter prompten ställer du din fråga. ; frågar efter fler lösningar (ger alternativ lösning om det finns). 3
Vi vill bara veta om det finns någon kvinna. woman(_). child(_). Prolog bygger på negation as failure, allt som man inte vet, är falskt (lite mer om det senare). Skriv in i en textfil som slutar med.pl ; whisky(bowmore). whisky(glenlivet). region(bowmore, islay). region(glenlivet, highland). age(bowmore, 12). Har vi whisky från Islay och i så fall hur gammal? region(w, islay), age(w, A). A = 12, W = bowmore? ; W instantieras (binds till) bowmore. whisky(bowmore). region(bowmore, islay). age(bowmore, 12). Har vi en whisky som är mer än 8 år gammal? whisky(w), age(w, A), A>8. A = 12, W = bowmore? ; Strukturer 3 sätt att skiva samma sak: smak(oban, 16, smak, torv, medel, roekig, medel, fyllig, medel). smak(oban, 12, [torv, me], [roekig, me], [fyllig, me]). smak(oban, 10, smak(torv(me), roekig(me), fyllig(me))). Varning, lätt att missförstå strukturer, det finns inga funktioner i Prolog! smak(oban, 10, smak(torv(me), roekig(me), fyllig(me))). smak(w, _, S). S = smak(torv(me), roekig(me), fyllig(me)), W = oban? ; smak(oban, 10, smak(torv(me), roekig(me), fyllig(me))). smak(w, _, smak(torv(t), _,_)). T = me, W = oban? ; 4
Mer REGLER whisky(bowmore). region(bowmore, islay). aalder(bowmore, 12). smak(bowmore,12, smak(torv(me), roekig(me), fyllig(me)). man(peter). % För alla män M och whisky W gäller det att % M gillar W. gillar(m, W) :- man(m), whisky(w). whisky(bowmore). region(bowmore, islay). aalder(bowmore, 12). smak(bowmore,12, smak(torv(me), roekig(me), fyllig(me)). man(peter). gillar(m, W) :- man(m), whisky(w). Vad gillar Peter? gillar(peter, X). X = bowmore? ; \+ gillar(peter,bowmore). Negation, det är inte sant, skrivs \+ Listor [ ] : en tom lista [1, 2, abba] : en lista som innehåller 3 element [[11, 12, 13], [21, 22, 23], [31, 32, 33]] : En 3x3 matris (en lista som innehåller 3 listor som...). Listor Huvud på listan, svansen på listan, jämför CAR och CDR i LISP Dessa två listor är identiska!?- [a,b,c] = [a [b,c]]. Yes Ger huvud och svans?- [a,b,c] = [Huvud Svans]. Huvud=a Svans=[b,c] Några enkla predikat: member % Predikatet medlem % X är medlem i listan om den står först i listan medlem(x, [X Rest]). % Annars är X i resten av listan. medlem(x, [F Rest]) :- medlem(x, Rest). ---- medlem(1, [abba, 1, 3]). Kallas svansrekursion om det sista en regel gör är att anropa sig själv. Detta blir lika effektivt som en loop skriven i C om man skulle vara intresserad av exekveringstid. medlem medlem(x, [X Rest]). medlem(x, [F Rest]) :- medlem(x, Rest). medlem(x, [abba, 1, 3]). X = abba? ; X = 1? ; X = 3? ; 5
medlem first, second, tail medlem(1, [A, B]). A = 1? ; B = 1? ; Luring, A och B är ju variabler och kan i detta exempel vara vad som helst, exempelvis 1. Därmed kan första elementet i listan vara 1 och andra elementet i listan kan även vara 1. % Det första elementet i listan. first(x, [X _]). % Det andra elementet i listan. second(x, [ _,X _ ]). % Resten av listan. tail(r, [ _ R]). Aritmetik och annat Villkor som är sanna eller falska: <, >, >=, =<, =:=, =\= (reducerar höger och vänsterleden). is (exempel?- X is 4 + 3) ==, \== (strikt likhet, olikhet) = (unifiering, det vill säga att Prolog försöker binda alla obundna variabler så långt det går. Lyckas det så lyckas unifieringen). +, -, *, /, sin, cos, tan 2 =< 4. 2+2 =:= 4. 2+2 =:= 5. 2+2 =\= sin(0), 0 + 0 =:= sin(0). Trace? - trace, X is sin(4/5), X>2. 1 1 Call: _59 is sin(4/5)? <ENTER> 1 1 Exit: 0.71735609 is sin(4/5)? <ENTER> 2 1 Call: 0.71735609 > 2? <ENTER> 2 1 Fail: 0.71735609 > 2? <ENTER> 1 1 Redo: 0.71735609 is sin(4/5)? <ENTER> 1 1 Fail: _59 is sin(4/5)? <ENTER> Redo betyder att Prolog interpretatorn backtrackar (backar ett eller flera steg för att försöker hitta alternativ lösning). A is B. Uttrycket B beräknas och unifieras med variabeln (eller konstanten) A.? - Area is 3.14 * 5 * 5. Area = 78.5? <ENTER>? - 4 is 4.? X is 2 + M. ERROR? M = 2, X is 2 + M. X = 4 För att högertsidan om is ska kunna beräknas får det inte finnas obundna variabler 6
Strikt likhet == V == Q. %variabel V är inte strikt samma som Q % man skulle kunna instantiera V = 1 och Q till 2 om man vill V = 5, Q = 5, V == Q. % nu är båda strikt lika (båda=5). 1+2 == 2+1. % strukturen 1+2 är inte strikt lik 2 + 1 1+2 == 1+2. Unifiering = Två predikat kan unifieras omm de har samma namn de har lika många termer termerna kan unifieras två termer kan unifieras omm den ena är en variabel både är samma konstant både är strukturer... Unifiering = fortsätter två strukturer kan unifieras omm de har samma konstruktor (namn) de har samma ställighet argumenten kan unifieras Exampel på unifiering-1 xx(left, 123, X) = xx(a,b,b). A = left, B = 123, X = 123? ; cbc = X. X = cbc? +(5,5) = 5 + 5 Misslyckade exempel: X = 5 + 5, X = 10. Exampel på unifiering-2 Exampel på unifiering-3a E = 1+2. E = 1+2? <ENTER> Yes (E har tilldelats strukturen 1+2 vilket är samma sak som +(1,2) p(p(p(p(0)))) = p(p(x)). X = p(p(0))? ; % predikatet lenght1 length1(0, [ ]). length1(n, [ F R]) :- length1(n2, R), N = N2+1. length1(x, [a,b,c]). X = 1+(1+(1+0))? ; 7
Exampel på unifiering-3b % predikatet lenght1 length1(0, [ ]). length1(n, [ F R]) :- length1(n2, R), N is N2+1. length1(x, [a,b,c]). X = 3; Syntax Predikat: mamma, mmm, _1_. Variabler: W, W12, _12 Konstanter: stefan, stefan, Stefan Strukturer: de(de(x,10,nil),12,nil). Listor: [], [1,2, [44, 55], 3], [a,n(1,2,3)] Aritmetik & annat: +, -, *, /, sin, cos, tan, <, >, >=, =<, =:=, =\=, ==, =, is Siffror och tal: 0,, 9, 123.31, 55.2e-3 Closed world assumption (CWA) Exempel: SJ uppger att det dagligen går ett tåg från Linköping till Stockholm kl. 9:22. Dock säger man inte explicit att det inte går ett tåg kl. 9:56 eller 10:24. Eftersom det inte är angivet ett tåg kl. 9:56 går det förmodligen inget tåg då. CWA: Det som inte kan visas är inte sant. Negation by Failure: NF: Det som Prologprogrammet inte kan härleda i ändlig tid är falskt. Negation i Prolog Negation by failure skrivs i prolog \+ Exempel:?- X = z, \+ member(x,[a,b,c]).?- X = c, \+ member(x,[a,b,c]). Hur hittar Prolog alla lösningar Djupet-först sökning med s k backtracking: När en lövd påträffas backar interpretatorn tillbaks till föregående förgrening och provar nästa alternativ. Problem: oändliga subträd oändlig loop. SLD-träd för medlem(x, [a, b, c]). X/a X/b Program: medlem(x, [X _]). medlem(x, [_ T]) :- medlem(x, T). medlem(x, [a, b, c]). medlem(x, [b, c]). medlem(x, [c]). medlem(x, []). X/c 8
Metalogiska predikat Prolog innehåller en uppsättning predikat som inte är strikt predikatlogiska. Man kan även skriva program som ändrar sin egen kod (viktig egenskap im AI).?- write( hello world ), writeln(5). hello world 5 var(x) - misslyckas om X är instansierad. Exempel:? X = Y, var(x).?- Z = hej, var(z).? var(sol). SLU T integer( X) -om X är bunden till ett heltal. atomic(x) -om X är bunden till en konstant. 9