Prolog
Florent Capelli
mere(alice, bob).
pere(bob, carol).
parent(X,Y):-mere(X,Y).
parent(X,Y):-pere(X,Y).
gdparent(X,Y):-parent(X,Z),parent(Z,Y).
mere(alice,bob).
mere
est un prédicat
binaire et (alice, bob)
est dans mere
.pere(bob,carol).
pere
est un prédicat
binaire et (bob, carol)
est dans pere
.parent(X,Y):-pere(X,Y).
∀X∀Y.pere(X,Y) ⇒ parent(X,Y)gdparent(X,Y):-parent(X,Z),parent(Z,Y).
∀X∀Y∃Z.parent(X,Z) ∧ parent(Z,Y) ⇒ gdparent(X,Y)On définit une base de connaissances, aka une théorie!
mere(alice, bob).
pere(bob, carol).
parent(X,Y):-mere(X,Y).
parent(X,Y):-pere(X,Y).
gdparent(X,Y):-parent(X,Z),parent(Z,Y).
?- gdparent(A,B).
A = alice
B = carol
gdparent(A,B)
: trouver les assignations à A = va,
B = vb
tel que pour tout modèle M de
la théorie induite par le programme, (va,vb) ∈ gdparentM.Convention Prolog: les variables commencent par une majuscule ou _, les atomes (prédicats, constantes) par une minuscule.
Prolog ne considère que des modèles contenant des faits donnés dans la base de connaissances ou qu’on peut déduire de la base.
Les entiers de Peano en Prolog (aka encodage de Church) : on a une
constante z
(zéro) et on peut construire les
successeurs!
Comment définir les nombres impairs ?
Une base de connaissances en Prolog est un ensemble de formule de la forme:
∀x⃗(∃z⃗∧iPi(ti)) ⇒ Q(t)
où ti, t sont des termes sur les variables x⃗, z⃗.
C’est une clause de Horn.
gdparent(X,Y):-parent(X,Z),parent(Z,Y)
doit
se comprendre comme ∀X, Y(∃Z(parent(X,Z)∧parent(Z,Y)) ⇒ gdparent(X,Y)chien(medor).
sont des clauses de Horn un peu
particulière où le membre de gauche est vide! C’est un sucre syntaxique
pour chien(medor) :- .
.chien(X).
se lira ∀X(chien(X)).Base de connaissances :
Requête :
Y=z
, Z=f(f(z))
est une solution.Y=f(z)
, Z=f(f(f(z)))
aussi etc.t
, u
tels que
il existe un terme v
avec
r(f(Y),Z)[Y:=t, Z:=u]
=
r(f(X), f(f(X)))[X:=v]
.Problème très courant : l’unification !
Étant donné deux termes t1, t2, est-ce qu’il existe une substitution de leurs variables σ telle que
t1[σ] = t2[σ].
Unifiez (ou pas) :
x et f(y) ont une infinité d’unificateurs : {x := fi + 1(a), y := fi(a)}
Quel sont les meilleurs?
σ1 := {x ↦ f(y)} σ2 := {x ↦ f(z), y ↦ z}
Exemple:
Comment trouver un tel σ ?
Problème plus général : étant donné (u1=?t1, …, un=?tn trouver σ tels que pour tout i ti[σ] = ui[σ]
Si les termes sont unifiables, l’algorithme précédent termine sans FAIL et donne un ensemble de la forme x1=?t1, …, xk=?tk.
{x1 ↦ t1, …, xk ↦ tk} est un mgu idempotent!
Unifier f(h(y),h(z))=?f(x,x).
x ↦ h(y), z ↦ y est un MGU!
Unifier f(x,g(x))=?f(g(x),y).
Les termes ne sont pas unifiables !
Voir Chapitre 4, Terms rewriting and all that, Franz Baader, Tobias Nipkow.
On a des clauses de Horn H1, …, Hk en LPO :
On a une requête (appelé GOAL) : G(y⃗) formule du première ordre.
On va simplifier : le but est une conjonction G1 ∧ … ∧ Gp de buts de la forme Ri(ti) où Ri est un prédicat et ti un terme.
On veut trouver un terme satisfaisant un but G = R(t). Si on a :
En particulier, H[σ] ⇒ R[σ]
t[σ] est donc un modèle pour G si G1 := P1(t1[σ]), …, Gk := Pk(tk[σ]) ont un modèle.
On remplace donc le but G par des sous-buts G1, …, Gk jusqu’à n’avoir plus de but !
Si aucune clause de Horn ne peut être utilisée, on backtrack à la dernière fois où on a dû choisir une règle.
BUT : pair(s(s(s(s(z))))).
pair(z)
et
pair(s(s(s(s(z))))).
: pas
unifiablepair(s(s(X)))
s’unifie avec
pair(s(s(s(s(z)))))
avec X := s(s(z))
.pair(X)[X := s(s(z))]
donc pair(s(s(z)))
.pair(s(s(X)))
s’unifie avec
pair(s(s(z)))
avec X := z
.pair(z).
parent(alice, david). parent(alice, bob). parent(bob, carol). parent(bob, emily).
gdparent(X,Y):-parent(X,Z),parent(Z,Y).
BUT : gdparent(alice, C).
gdparent(alice, C).
s’unifie avec
gdparent(X,Y)
avec X := alice
,
Y:=C
parent(alice,Z)
, parent(Z,C)
.parent(alice,Z)
s’unifie avec
parent(alice, david)
avec Z := david
.parent(david,C)
.parent(david,C)
ne peut pas s’unifier ! Backtrack
à 3!parent(alice,Z)
, parent(Z,C)
.parent(alice,Z)
s’unifie avec
parent(alice, bob)
avec Z := bob
.parent(bob,C)
.parent(bob,C)
s’unifie avec
parent(bob, carol)
avec C := carol
! On a
gagné!Pour trouver tous les C
, on peut backtracker encore sur
8 et remarquer que parent(bob,C)
s’unifie avec
parent(bob,emily)
!
On a utilisé implicitement la règle de résolution :
A ⇒ B
A
B
Qui est complète pour la logique propositionnelle et aussi pour la logique du première ordre !
∀x⃗(A⇒B)
A[x⃗:=σ]
B[σ]