Systèmes Logiques
Trouver un unificateur le plus général (mgu) pour les problèmes suivants s’il existe :
On remplace z: h(x)=?h(g(y,g(y,h(x)))) et z=?g(y,h(x))
On déconstruit h : x=?g(y,g(y,h(x))) et z=?g(y,h(x))
On échoue car x est dans le terme de droite.
On doit unifier x=?x et x=?h(x). On échoue pour la même raison.
On doit unifier x = u, y = u, h(x,y) = h(v,v).
On remplace x: x = u, y = u, h(u,y) = h(v,v).
On remplace y: x = u, y = u, h(u,u) = h(v,v).
On déconstruit x = u, y = u, u = v.
On remplace u : x = v, y = v, u = v. On ne peut plus progresser, on a trouvé un mgu!
On pourra utiliser https://swish.swi-prolog.org/ pour exécuter des programmes prolog.
On considère les données suivantes :
Définir des prédicats binaires mere
et pere
et y ajouter les données précédentes.
% Zeus est le père de : Apollon, Artemis, Hermès, Aphrodite et Dionysos.
, apollon).
pere(zeus, artemis).
pere(zeus, hermes).
pere(zeus, aphrodite).
pere(zeus, dionysos).
pere(zeus% Atlas est le père de Maïa.
, maia).
pere(atlas% Arès est le père d’Eros de d’Harmonia.
, eros).
pere(ares% Chronos est le père de Zeus.
, zeus).
pere(chronos, harmonia).
pere(ares%Léto est la mère d’Apollon et d’Artémis.
, apollon).
mere(leto, artemis).
mere(leto% Maïa est la mère d’Hermès.
, hermes).
mere(maia% Dione est la mère d’Aphrodite.
, aphrodite).
mere(dione% Aphrodite est la mère d’Harmonia et d’Eros.
, harmonia).
mere(aphrodite, eros).
mere(aphrodite
% Sémélé est la mère de Dionysos.
, dionysos).
mere(semele
% Rhéa est la mère de Zeus.
, zeus).
mere(rhea
% Pléioné est la mère de Maïa.
, maia). mere(pleione
Définir un prédicat parent(X,Y)
qui est vrai seulement
si X
est la mère ou le père de Y
.
X,Y) :- mere(X,Y).
parent(X,Y) :- pere(X,Y). parent(
Définir un prédicat freresoeur(X,Y)
qui est vrai
seulement si X
et Y
ont la même mère et le
même père. Lister les frères et soeurs de la base de connaissances. Que
remarquez-vous ?
X,Y) :- pere(Z,X), pere(Z,Y), mere(Z,X), mere(Z,Y). freresoeur(
On liste les frères et soeurs avec ?- freresoeur(X,Y)
.
On remarque que X
et toujours le frère/soeur de
X
ce qui est assez contre-intuitif. On peut rajouter qu’on
veut X ≠ Y :
X,Y) :- pere(Z,X), pere(Z,Y), mere(Z,X), mere(Z,Y), X\==Y. freresoeur(
Définir un prédicat demifreresoeur(X,Y)
qui est vrai
seulement si X
et Y
ont un parent commun.
Lister les demis frères et soeurs de la base de connaissances. Que
remarquez-vous ?
X,Y) :- parent(Z,X), parent(Z,Y). demifreresoeur(
On liste les demi frères et soeurs avec
?- demifreresoeur(X,Y)
. On remarque encore que
X
et toujours le demi frère/soeur de X
ce qui
est assez contre-intuitif. On peut rajouter qu’on veut X ≠ Y :
X,Y) :- parent(Z,X), parent(Z,Y), X\==Y. demifreresoeur(
Définir un prédicat oncletante(X,Y)
qui est vrai
seulement si X
est le frère ou la soeur d’un parent de
Y
. Lister ce prédicat.
X,Y) :- parent(Z,Y), freresoeur(X,Z). oncletante(
On définit les entiers de Peano en Prolog de la façon suivante
(z
pour zéro, s
pour successeur) :
.
nat(z):-nat(x). nat(s(x))
Le représentant d’un entier n est donc sn(z), c’est-à-dire, la fonction s appliquée successivement n fois à partir de 0.
Définir un prédicat p(x,y)
(p
pour
“précédent”) qui est vrai seulement si s(y) = x
. En déduire
une requête qui calcule le prédécesseur de 3.
X), X). p(s(
?- p(s(s(s(X))), R).
Définir un prédicat double(x,y)
qui est vrai seulement
si y
représente le double de x
. En déduire une
requête Prolog qui calcule la moitié de
s(s(s(s(s(s(z))))))
.
,z).
double(zX), s(s(Y))) :- double(X,Y). double(s(
?- double(X,s(s(s(s(s(s(z))))))).
Définir un prédicat add(x,y,z)
qui est vrai seulement si
z
est la représentation de a + b où x
est
la représentation de a et
y
la représentation de b. En déduire une requête prolog qui
calcule les solutions entières de l’équation X + 2 = Y + 3.
,X,X).
add(zX),Y,s(Z)) :- add(X,Y,Z). add(s(
?- add(X, s(s(z)), s(s(s(Y)))).