Logikprogrammering och Prolog • Logikprogrammeringsparadigmen • Logikprogrammering – Relationer – Resolution • Prolog – – – – Variabler och termer Klausuler och relationer Kontroll ”Slutna-världen” antagandet Relation vs avbildning Relation Indata Indata Många till många Utdata Många till en Användning • Avbildning – Givet a bestäm m(a) • Relation : – – – – Relationer och avbildning Avbildning Utdata Givet a och b, bestäm om R(a,b) är sann. Givet a, finn alla y sådana att R(a,y) är sann. Givet b, finn alla x sådana att R(x,b) är sann. Finn alla x och y sådana att R(x,y) är sann Logikprogrammeringsparadigmen • Den logiska paradigmen ser ett program som en relation mellan invärde och utvärde. Den funktionella bygger på program som avbildningar. Båda är (mer eller mindre) deklarativa! • Eftersom relationer är mer generella än avbildningar skulle man kunna säga att logikprogrammering är på en högre abstraktionsnivå än funktionell och imperativ programmering. • Relationer i logikspråk har liknande betydelse som funktioner och procedurer i andra språk. • Låt S och T vara mängder. • R är en relation mellan S och T om för varje x ∈ S och y ∈ T så är R(x,y) antingen sann eller falsk. T ex: större än (>) för heltal. • m är en avbildning (funktion) mellan S och T om för (varje) x ∈ S existerar det ett m(x) ∈ T T ex: sin(x) Predikatlogik • Logiken som logikprogrammering bygger på är första ordningens predikatlogik • Det är ett sätt att beskriva logiska utsagor, relationer. natural(0) ∀n, natural(n) → natural(successor(n)) • Tillsammans med inferensregler (resolution) – Ett sätt att härleda eller bevisa nya utsagor. A ! B och B ! C A!C A och A ! C C Logikprogrammeringsspråk • Ett notationssystem för att skriva logiska utsagor tillsammans med specificerade algoritmer för att implementera inferensreglerna. • De utsagor som man utgår ifrån (axiom) kan ses som själva logikprogrammet. • De utsagor som man vill härleda är ”input” eller som det oftas kallas frågor (”queries”) eller mål (”goal”) Horn klausuler i logik språk • A0 if A1 and ... and An – Där Ai har formen R i (...) där Ri är namnet på en relation. – Betyder att om A1 ...An är sann så är A0 sann. – Specialfall när n = 0. A0. är sann. • Procedurell tolkning – För att bevisa A0 måste A 1 till An först bevisas. – A0 är ett procedurhuvud och A 1 till A n dess kropp Resolution • Testningen implementeras genom resolution. • Om programmet innehåller en klausul A0. som matchar A lyckas det. • Om programmet innehåller en klausul A0 if A 1 and ... and An. sådan att A 0 matchar A fortsätter vi att testa A1 till An separat som delmål. • Om alla lyckas drar vi slutsatsen att A är sann. Horn-klausuler • Vid automatisk härledning är det svårt att hantera hela första ordningens predikatlogik. • De flesta system är begränsade till en delmängd kallad Horn-klausuler. A1 and A2 and … and An → B natural(0). natural(x) → natural(successor(x)). Logikprogram • Ett logikprogram består av en samling Horn klausuler. – Begränsningen till Horn klausuler gör att logikprogram är implementerbara och tillåter implementationen att bli tämligen effektiv. • Beräkningen av ett program består av att testa ett givet antagande/mål (A). – Om vi kan härleda ur programmet att A är sann så säger vi att A lyckas (succeeds) annars misslyckas vi (fail). • Om vi misslyckas innebär det inte att A är falsk. Flera alternativa vägar • Om något Ai misslyckas måste vi se om det finns någon annan klausul som matchar Ai. • När ingen fler klausul matchar A har vi misslyckats. • Detta ger upphov till en sökgraf. • I logikprogrammering definieras inte hur sökningen ska gå till • I ett logikprogrammeringsspråk (Prolog) måste det definieras för att vara implementerbart Prolog • Prolog utvecklades gradvis under 70-talet och ett flertal dialekter uppstod. • Numera är Edinburgh-dialekten accepterad som standard. • Japan: Fifth Generation Computing System (80-talet) • Ett Prolog program består av en samling Horn klausuler som definierar relationer. • En strikt definition av hur inferensen ska ske. Typer • Prolog är otypat. • Tal, atomer och strukturer kan användas om varandra, ingen kontroll sker • Alla värden kan jämföras med varandra (m h a =) Listor • Listor är en delmängd av alla strukturer där – [] representerar tomma listan och – '.' är strukturtaggen. .(1,.(2,.(3,.(4,[])))) • Förkortade skrivformer [1,2,3,4] [x|xs] = .(x,xs) Grundläggande element • Prologs ”byggstenar” är konstanter (tal, atomer), variabler och strukturer. Listor är en speciell struktur (och strängar är en speciell sorts listor). • Atomer – Atomer har inga andra egenskaper än att de går att skilja från varandra. E x red, blue, green.... • Variabler; deklareras ej, kan vara instantierad eller oinstantierad • Strukturer – Strukturer är ”taggade tupler”. T ex data(2000, jan, 1) Strukturer • I grunden en relation (ett predikat) • Kan användas för att representera data - ses som tupler/records, eller ses som ”funktionsanrop” • ”Taggen” används för att skilja på strukturer som representerar olika data men har samma värden. (jfr konstruerare). T ex point(2,3), rational(2,3). • Strukturer kan vara nästade. Variabler • Prolog variabler betecknar ett fixt men okänt värde (ej uppdaterbart). • Börjar alltid på stor bokstav för att skiljas från strukturer och atomer. • Variabler deklareras implicit genom sin förekomst i klausuler och dess räckvidd är just den klausulen. Termer • En term kan vara en: – – – – variabel numerisk literal atom struktur (innehåller termer). • Termer är argument till relationerna. – R(t1 ,...,tn ) där t1 ... tn är termer. Klausuler och relationer • A0 :- A1, A2, ..., An. – ":-" står för if och "," står för and • A0 matchar ett påstående A om det existerar en substitution av termer för variabler sådan att A0 och A blir lika. A och A0 kan unifieras. • age(P,Y) matchar age(david,42) under {P = david,Y = 42} • age(P,33) matchar age(olof,A) under {P = olof, A = 33} • Räckvidden för varje relation är hela programmet. Exempel star(sun). star(sirius). star(betelegeus). ?- star(sun). Yes ?- star(jupiter). False Exempel planet(B) :- orbits(B,sun). ?- planet(venus). Yes ?- planet(B). B = mercury B = venus … Exemple orbits(mercury,sun). orbits(venus,sun) … ?- orbits(venus,sun). Yes ?- orbits(B,sun). B = mercury B = venus … Frågor • Fråga: existerar det instanser så att frågan blir sann. • Klausuler: A0 är sant för alla värden på variablerna sådana att A1 ...An är sanna. • Rekursiva klausuler: element(X,[X|Ys]). element(X,[Y|Ys]) :- X \== Y, element(X,Ys). Exempel Exempel append([],Xs,Xs). append([X|Xs],Ys,[X|Zs]) :append(Xs,Ys,Zs). • Sortering ?- append([1,2],[3,4],Zs). • Största gemensamma delare Zs = [1,2,3,4] ?- append([1,2],Ys,[1,2,3,4]). Ys = [3,4] ?- append(Xs,Ys,[1,2,3]). Xs = [] Ys = [1,2,3] Xs = [1] Ys = [2,3] sort(Xs,Ys) :permutation(Xs,Ys),sorted(Ys). gcd(X,0,X). gcd(X,Y,W) :Y \= 0,Z is X mod Y, gcd(Y,Z,W). … Kontroll • Beteendet hos Prolog-program beror på ordningen för resolutionen. neighbor(A,B) :- neighbor(B,A). neighbor(A,B) :- planet(A),orbits(B,A). • Om det icke rekursiva fallet används först hela tiden uppstår inga problem, men om det rekursiva fallet används först uppstår oändlig rekursion. • Generellt sett har användaren (på gott och ont) stor kontroll över effektiviteten Kontroll, forts. • Resolution botten-upp (forward chaining, börja i databasen) eller top-down (backward chaining, börja med frågan)? • Prolog: Backward chaining. Kontroll i Prolog Kontroll i Prolog • När en klausul har mer än ett mål bildar de möjliga sökningarna/matchningarna ett sökträd. Ska sökning göras djupet-först eller bredden-först? • Prolog använder djupet-först sökning • Kräver mindre resurser, men kan i elakartade fall leda till oändlig rekursion • Högerledet testas från vänster till höger i klausulerna, och om det finns flera klausuler för en relation testas de i ordning från första till sista. • Om beviset (matchningen) av ett delmål misslyckas (givet en viss instansiering av variablerna) måste bakåtspårning göras • ”Generate and test” programmeringsmetodik. • Bakåtspårning kan avbrytas mha ”cut”, ”!” Ex: a,b,!,c,d • Strider mot grundidén med Prolog. Kan missbrukas p.s.s som hopp Den slutna världen • Ett påstående misslyckas om vi inte kan härleda att det är sant. • Det innebär inte att det är falskt utan kan också innebära att det är okänt. • Prolog utgår från att alla relevant fakta finns i programmet, d v s allt som är sant går att härleda ur programmet. • Det kallas för den slutna-världen antagandet. Negation • Misslyckande medför att bundna variabler släpps fria. • Efter ett misslyckande kan en variabel tappa ett relevant värde. ?- star(X). X = sun ?- not(not(star(X)). X = _34 ?- X = 0, not(X = 1). X=0 ?- not(X = 1), X = 0. no Negation • Den slutna världen innebär att Prolog inte skiljer på falsk och okänt • Negationen av något okänt blir sant star(sun). star(betelegeus). ?- not(star(sirius)). yes Logikspråk vs funktionella språk • L:relationer, F:funktioner. Relationer kan användas på flera sätt. L potentiellt ickedeterministiska. Unifiering kraftfullare än mönstermatchning • F: ofta högre ordningens funktioner • F: ofta starkt typade. L: ofta otypade • F: enklare att implementera, enklare att förstå