Logica voor Informatica 13 Prolog Wouter Swierstra University of Utrecht 1
Programmeren met Logica Propositielogica is niet geschikt voor programmeren er is nauwlijkst iets interessants uit te drukken. Toch zie je het wel terugkomen b.v. om ingewikkelde condities in een if of while statement eenvoudiger te beschrijven. 2
Programmeren met Logica Propositielogica is niet geschikt voor programmeren er is nauwlijkst iets interessants uit te drukken. Toch zie je het wel terugkomen b.v. om ingewikkelde condities in een if of while statement eenvoudiger te beschrijven. Met behulp van predikatenlogica kun je meer interessante stellingen uitdrukken maar opeens is het slechts semi-beslisbaar om vast te stellen of een bewering waar is of niet. 2
Programmeren met Logica Propositielogica is niet geschikt voor programmeren er is nauwlijkst iets interessants uit te drukken. Toch zie je het wel terugkomen b.v. om ingewikkelde condities in een if of while statement eenvoudiger te beschrijven. Met behulp van predikatenlogica kun je meer interessante stellingen uitdrukken maar opeens is het slechts semi-beslisbaar om vast te stellen of een bewering waar is of niet. Welk fragment van de predikatenlogica is beslisbaar en geschikt om ermee te programmeren? 2
Logisch programmeren Het programma is een eindige consistente verzameling formules die feiten en regels van een bepaalde probleemdomein modelleren. Automatische deductie (afleiding) mechanisme wordt gebruikt om problemen op te lossen (vragen te beantwoorden). Het algemene programmeerschema is Π ϕ waar Π een programma, ϕ een vraag, en een deductie (afleiding) mechanisme. 3
PROLOG man(willem_alexander). man(claus). man(bernhard). vrouw(beatrix). vrouw(juliana). ouder_van(claus,willem_alexander). ouder_van(beatrix,willem_alexander). ouder_van(juliana,beatrix). ouder_van(bernhard,beatrix). vader_van(x,y) :- man(x), ouder_van(x,y). x, y ( man(x) ouder_van(x, y) vader_van(x, y) ) 4
PROLOG Vraag: Hoe zou je de moeder-van relatie definieren? Welke predikatenlogische formule hoort hierbij? 5
PROLOG Vraag: Hoe zou je de moeder-van relatie definieren? Welke predikatenlogische formule hoort hierbij? moedervan(x,y) :- vrouw(x), oudervan(x,y). x, y ( vrouw(x) ouderv an(x, y) moederv an(x, y) ) 5
PROLOG Een Prolog regel bestaat uit: een conclusie zoals man(claus) of vadervan(x,y) een aantal aannames. Dit kunnen er nul zijn (zoals bij man(claus)), maar ook meerdere. Let op: variabelen geschreven met een hoofdletter, zoals X of Y, zijn universeel gekwantificeerde variabelen; een variabele geschreven met een kleine letter is een constante, zoals claus of beatrix, of definieert een relatie, zoals moedervan. Een verzameling regels wordt ook wel de knowledge base genoemd. 6
PROLOG vader_van(x,y) :- man(x), ouder_van(x,y). x, y ( man(x) ouder_van(x, y) vader_van(x, y) ) moeder_van(x,y) :- vrouw(x), ouder_van(x,y). x, y ( vrouw(x) ouder_van(x, y) moeder_van(x, y) ) 7
PROLOG vader_van(x,y) :- man(x), ouder_van(x,y). x, y ( man(x) ouder_van(x, y) vader_van(x, y) ) moeder_van(x,y) :- vrouw(x), ouder_van(x,y). x, y ( vrouw(x) ouder_van(x, y) moeder_van(x, y) ) En grootmoedervan dan? 7
PROLOG vader_van(x,y) :- man(x), ouder_van(x,y). x, y ( man(x) ouder_van(x, y) vader_van(x, y) ) moeder_van(x,y) :- vrouw(x), ouder_van(x,y). x, y ( vrouw(x) ouder_van(x, y) moeder_van(x, y) ) En grootmoedervan dan? grootmoeder_van(x,y) :- moeder_van(x,z), ouder_van(z,y). Waar komt de variabele Z vandaan? x, y, z ( moeder_van(x, z) ouder_van(z, y) grootmoeder_van(x, y) ) 7
PROLOG vrouw(beatrix). vrouw(juliana). ouder_van(juliana,beatrix). ouder_van(bernhard,beatrix). moeder_van(x,y) :- vrouw(x), ouder_van(x,y). Alle expressies rechts van het scheidingsteken :- zijn impliciet verbonden door conjuncties. Anderzijds, een bewering als vrouw(x) geldt alleen als vrouw(beatrix) of vrouw(juliana). 8
PROLOG - queries Knowledge Base vrouw(beatrix). vrouw(juliana). ouder_van(juliana,beatrix). ouder_van(bernhard,beatrix). moeder_van(x,y) :- vrouw(x), ouder_van(x,y). Maar hoe voeren we zo n programma uit? Tot dusver hebben we alleen relaties en constantes gedefinieerd Het uitvoeren van zo n programma bestaat uit een query die vraagt of een bepaalde bewering waar is (of waar gemaakt kan worden). 9
PROLOG - queries Knowledge Base vrouw(beatrix). vrouw(juliana). ouder_van(juliana,beatrix). ouder_van(bernhard,beatrix). moeder_van(x,y) :- vrouw(x), ouder_van(x,y). Query?- vrouw(juliana). true.?- moeder_van(bernard,beatrix). false. 10
PROLOG Knowledge Base vrouw(beatrix). vrouw(juliana). ouder_van(juliana,beatrix). ouder_van(bernhard,beatrix). moeder_van(x,y) :- vrouw(x), ouder_van(x,y). Query Maar het wordt pas interessanter als onze queries ook variabelen bevatten. Bij voorbeeld welke mensen zijn allemaal een vrouw? 11
PROLOG Knowledge Base vrouw(beatrix). vrouw(juliana). ouder_van(juliana,beatrix). ouder_van(bernhard,beatrix). moeder_van(x,y) :- vrouw(x), ouder_van(x,y). Query welke mensen zijn een vrouw??- vrouw(x). X = beatrix ; X = juliana. 12
PROLOG Knowledge Base vrouw(beatrix). vrouw(juliana). ouder_van(juliana,beatrix). ouder_van(bernhard,beatrix). moeder_van(x,y) :- vrouw(x), ouder_van(x,y). Query wie zijn allemaal moeders??- moeder_van(x,y). X = beatrix, Y = willem_alexander ; X = juliana, Y = beatrix. 13
PROLOG Knowledge Base vrouw(beatrix). vrouw(juliana). ouder_van(juliana,beatrix). ouder_van(bernhard,beatrix). moeder_van(x,y) :- vrouw(x), ouder_van(x,y). Als een query geen variabelen bevat, checkt Prolog of de bewering waar is of niet; Als een query variabelen bevat, probeert Prolog een bedeling te vinden zodanig dat de bewering waar gemaakt wordt. 14
Fragment van Predikatenlogica Horn Fragment: Een Horn zin is een formule van de vorm x 1... x m ((A 1... A n ) A) waar A, A 1,..., A n atomaire formules zijn waarin hoogstens variabelen x 1,..., x m vrij voorkomen. Als n = 0, dan de Horn zin x 1... x m A wordt een feit genoemd; anders is het een regel. 15
Fragment van Predikatenlogica In het algemeen is predikatenlogica niet beslisbaar. Daarom beperkt Prolog zich tot Horn zinnen. De Horn zin (regel) x 1... x m ((A 1... A n ) A) wordt in PROLOG genoteerd als regel A :- A1,,An. De Horn zin (feit) x 1... x m A wordt in PROLOG genoteerd als feit A. 16
PROLOG: Data Structuur Functie Symbolen Constanten en variabelen zijn termen. Als t 1,..., t n termen zijn, dan is f(t 1,..., t n ) ook een term. Voorbeeld natuurlijk getallen: 0 is een constante s is een functiesymbool met één argument (successor) s(0), s(s(s(0))), s(s(x)), s(y ),... Maar hoe kunnen we nou functies definieren die met deze getallen werken? 17
PROLOG: Data Structuur Knowledge Base We definieren de relatie plus(x,y,z) om aan te modelleren dat X + Y = Z. plus(x,0,x). plus(x,s(y),s(z)) :- plus(x,y,z). 18
PROLOG: Data Structuur Knowledge Base We definieren de relatie plus(x,y,z) om aan te modelleren dat X + Y = Z. plus(x,0,x). plus(x,s(y),s(z)) :- plus(x,y,z). x plus(x, 0, x) x, y, z ( plus(x, y, z) plus(x, s(y), s(z)) ) 18
PROLOG: Data Structuur Knowledge Base We definieren de relatie plus(x,y,z) om aan te modelleren dat X + Y = Z. plus(x,0,x). plus(x,s(y),s(z)) :- plus(x,y,z). x plus(x, 0, x) x, y, z ( plus(x, y, z) plus(x, s(y), s(z)) ) Query?- plus( s(s(0)), s(s(s(0))), X). X = s(s(s(s(s(0))))). 18
Vermenigvuldigen Vraag: Hoe definieer je vermenigvuldigen (als herhaald optellen)? 19
Vermenigvuldigen Vraag: Hoe definieer je vermenigvuldigen (als herhaald optellen)? mult(x,0,0). mult(x,s(y),z) :- mult(x,y,u), plus(x,u,z). x mult(x, 0, 0) x, y, z ( mult(x, y, u) plus(x, u, z) plus(x, s(y), z) ) 19
Andere queries plus(x,0,x). plus(x,s(y),s(z)) :- plus(x,y,z). Met zo n definitien kunnen we meer dan alleen optellen. Aftrekken:?- plus( s(s(0)), X, s(s(s(0)))). X = s(0). Vraag: Wat is het resultaat van de query plus(x,y,s(s(s(0))))? 20
PROLOG: Lijsten Lijst in Prolog Lijst is een term die een lijst van elementen representeert. Als t 1,..., t n termen zijn, dan is de lijst [t 1,..., t n ] ook een term. Voorbeeld: [a, b, c], [[a], [b, c], [d, e], [a]], [1, 2, [a, b], [piet, eva]] [ ] [Head T ail] [Head1, Head2 T ail] 21
PROLOG Knowledge Base element(x,[x R]). element(x,[y R]):- element(x,r). omkeren([],[]). omkeren([h T],L):- omkeren(t,l1), voegeind(l1,h,l). voegeind([],e,[e]). voegeind([h T],E,[H R]):- voegeind(t,e,r). Query?- element(b,[1,2,b,3]). true.?- element(b,[1,2,3]). false. 22
PROLOG Knowledge Base element(x,[x R]). element(x,[y R]):- element(x,r). omkeren([],[]). omkeren([h T],L):- omkeren(t,l1), voegeind(l1,h,l). voegeind([],e,[e]). voegeind([h T],E,[H R]):- voegeind(t,e,r). Query?- omkeren([1,2,3],l). L=[3,2,1]. 23
PROLOG: deductie mechanisme Prolog programma s hebben een declaratieve en een procedurele interpretatie. De volgorde van Horn zinnen is belangrijk. De volgorde van atomen in Horn zinnen is belangrijk. child(anne,bridget). child(bridget,donna). child(anne,bridget). child(bridget,donna). afstammen(x,y):- child(x,y). afstammen(x,y):- child(x,z), afstammen(z,y). afstammen(x,y):- afstammen(z,y), child(x,z). afstammen(x,y):- child(x,y). 24
PROLOG: deductie mechanisme Gegeven een query, zoals afstammen(anne,y) hoe vindt Prolog een geschikte keuze voor Y zodat de bewering waar wordt? Dit proces heet resolutie. En gebruikt de regels en feiten die gedefinieerd zijn om de query waar te maken. 25
Resolutie idee Invoer: een lijst met openstaande doelen en verzameling regels/feiten. Uitvoer: de bedeling die nodig is om een bewijs te vinden. Idee: Is de lijst met doelen leeg dan zijn we klaar. Anders, pak het eerste doel en kijk één voor één welke regels gebruikt kunnen worden om dit doel te bewijzen. Als er meerdere regels geschikt zijn pak de eerste. Mocht er geen regel geschikt zijn, krabbel terug naar het vorige keuze punt, en probeer een nieuwe regel. 26
Resolutie Gegeven de knowledge base: a :- b,c. b. c. Prolog Query?- a Hoe vind ik een bewijs van a? 27
Nog een voorbeeld element(x,[x R]). element(x,[y R]):- element(x,r).?- element(2,[1,2,3]). true. 28
Nog een voorbeeld child(anne,bridget). child(bridget,donna). afstammen(x,y):- child(x,y). afstammen(x,y):- child(x,z),afstammen(z,y).?- afstammen(anne,donna) 29
Andersom? Als we de volgorde van de regels aanpassen, krijgen we dan hetzelfde resultaat? child(anne,bridget). child(bridget,donna). afstammen(x,y):- afstammen(z,y), child(x,z). afstammen(x,y):- child(x,y).?- afstammen(anne,donna) 30
Depth-first search Prolog resolutie bouwt een zoekboom op om een query te proberen te bewijzen. Deze boom wordt vervolgens links-omlaag doorlopen om te proberen een antwoord te vinden. Maar dit kan tot oneindige lussen leiden zelfs als er wel een bewijs bestaat. 31
Depth-first search Prolog resolutie bouwt een zoekboom op om een query te proberen te bewijzen. Deze boom wordt vervolgens links-omlaag doorlopen om te proberen een antwoord te vinden. Maar dit kan tot oneindige lussen leiden zelfs als er wel een bewijs bestaat. Een vraag die nog open blijft wanneer kunnen we een regel gebruiken om een doel waar te maken? 31
PROLOG: Unification of Terms Als t 1 en t 2 dezelfde constanten zijn. Als t 1 een variabele en t 2 een willekeurige term, dan t 1 en t 2 unificeren en t 1 is geïnstantieerd met t 2 (zijn ze beide variabelen, dan instantiëren ze elkaar). Als t 1 en t 2 complexe termen zijn, dan ze unificeren desda: 1. ze hebben dezelfde functiesymbool en zelfde aantal argumenten, 2. de corresponderende argumenten unificeren, en 3. de variabel instantietjes van verschillende argument paren zijn compatible. (bijv. het is niet mogelijk X in een paar argumenten met a te instantiëren en met b in een ander paar argumenten). 32
PROLOG: Unification of Terms Unificatie( P (X, f(y )), P (a, Z) ) is succesvol. [X a, Z f(y )] Unificatie( P (f(g(x), X)), P (f(y, a)) ) is succesvol. [X a, Y g(a)] Unificatie( P (f(g(a), X)), P (f(a, b)) ) is NIET succesvol. Unificatie( P (f(x, b)), P (f(a, X)) ) is NIET succesvol. Unificatie( P (f(x, Y )), P (g(a, b)) ) is NIET succesvol. 33
Prolog semantiek Het zoeken naar oplossing is een implementatie strategie. Kunnen we ook een semantiek geven voor Prolog? Wat is een geschikte notie van model? 34
PROLOG: Programma Modellen Herbrand Universum is de verzameling van alle variabelvrije termen in de taal van het programma. vrouw(beatrix). vrouw(juliana). ouder_van(juliana,beatrix). ouder_van(bernhard,beatrix). moeder_van(x,y) :- vrouw(x), ouder_van(x,y). HU = {beatrix, juliana, bernard }{{} } Domain Elementen 35
PROLOG: Programma Modellen Herbrand Universum is de verzameling van alle variabelvrije termen in de taal van het programma. plus(x,0,x). plus(x,s(y),s(z)):- plus(x,y,z). HU = {0, s(0), s(s(0)), s(s(s(s(0)))),... }{{} } Domain Elementen 36
PROLOG: Programma Modellen Herbrand Base van een programma is de verzameling van atomaire formules, geconstrueerd door predikaten in het programma toe te passen op het Herbrand Universum van het programma. plus(x,0,x). plus(x,s(y),s(z)):- plus(x,y,z). HB = {plus(0, 0, 0), plus(s(0), 0, 0), plus(s(0), s(0), s(s(0)),...} Herbrand Modellen van een programma zijn deelverzamelingen van de Herbrand Base (H Π ) voor het programma. 37
PROLOG: Programma Modellen Stelling Voor elk programma Π geldt dat het bijbehorend Herbrand Base het programma waar maakt, met andere woorden: H Π = Π Het bewijs is niet heel spannend als je nog weet wat de modellen van de predikatenlogica zijn. 38
PROLOG: Programma Modellen Stelling: Het Kleinste Herbrand Model van een programma is de doorsnede van alle Herbrand modellen van het programma. Stelling: Voor elke atomaire formule ϕ en elk Prolog programma Π geldt: Π ϕ ϕ is waar in het kleinste Herbrand model van Π. 39
Afronding Vandaag behandeld: eerste deel Hoofdstuk 14. Volgende week dinsdag het laatste stukje uit het diktaat. 40