Vous êtes sur la page 1sur 4

3SI Guide pratique pour démarrer avec Prolog IA

Guide pratique pour démarrer avec Prolog (TP2)


I. L’arithmétique sous Prolog
Pour la comparaison des nombres (mais pas de variables ou de termes composés), on peut utiliser les
opérateurs suivants :
 X= :=Y %vrai si X et Y représente le même nombre
 X=\=Y %vrai si X et Y représente des nombres différents
 X<Y %vrai si X est strictement plus petit que Y
 X>Y %vrai si X est strictement plus grand que Y
 X=<Y %vrai si X est inférieur ou égal à Y
 X>=Y %vrai si X est supérieur ou égal à Y

Les opérateurs arithmétiques: addition (+), multiplication (*), soustraction (-), division (/), division entière
(//), modulo (X mod Y), la puissance (^).
Prolog est basé sur une évaluation paresseuse des expressions arithmétiques. Il faut utiliser l’opérateur is
pour forcer l’évaluation numérique (avec l’absence de toute inconnue dans la partie droite du is).
Exemples:
X is 22/5
X=4.4
X is 22//5
X=4
X is 14 mod 3
X=2
II. L’Unification et la résolution
En informatique et en logique, l'unification (=) est un processus algorithmique qui, étant donnés deux
termes, trouve un 3eme terme t tel qu’on puisse passer de t à t1 et à t2 en instanciant certaines variables. t est
appelé unificateur de t1 et t2. Elle rend les deux termes identiques.

1. Substitution
Une substitution est un ensemble {𝑡𝑖 / 𝑥𝑖 } où : 𝑥𝑖 sont des variables et 𝑡𝑖 sont des termes qui peuvent être
des constantes, des variables ou des fonctions. Cela revient à remplacer toutes les occurrences des variables
𝑥𝑖 par 𝑡𝑖 .
Exemples :
 {x+3} et {2+y} peuvent être rendus identiques par la substitution {x:=2} et {y:=3}, qui donne quand
on l'applique à chacun de ces termes le terme {2+3}.
2. Unification
Deux termes t1 et t2 sont unifiables s’il existe une substitution S tq : 𝑆. 𝑡1 = 𝑆. 𝑡2
Un ensemble de termes {t1, t2,…, tn} sont unifiables s’il existe une substitution S tq : 𝑆. 𝑡1 = 𝑆. 𝑡2 = ⋯ = 𝑆. 𝑡𝑛
Exemple :
 𝑡1 = 𝑓(𝑎, 𝑔(𝑏)), 𝑡2 = 𝑓(𝑥, 𝑦)
T1 et t2 sont unifiables car il existe S={a/X, g(b)/Y} tq : 𝑆. 𝑡1 = 𝑆. 𝑡2
 Trouver l’unificateur pour les clauses : p(X,X) et p(5,Y), p(f(X),f(5),X) et p(z,f(Y),Y).
Algorithme d’unification
Soit deux termes t1 et t2, l’algorithme d’unification cherche l’unificateur s’il existe.
 S={} ; k=0 ;
 Si 𝑆𝑘 . 𝑡1 = 𝑆𝑘 . 𝑡2 alors 𝑀 = 𝑆𝑘 fini avec succès
 Calculer 𝐷(𝑆𝑘 . 𝑡1 , 𝑆𝑘 . 𝑡2 ) soit (𝑑1 , 𝑑2 )
Si 𝑑1 est une variable : 𝑆𝑘+1 = {𝑑2 ,/𝑑1 } ∪ 𝑆𝑘 , aller à 2
Si 𝑑2 est une variable : 𝑆𝑘+1 = {𝑑1 ,/𝑑2 } ∪ 𝑆𝑘 , aller à 2
Sinon échec

Dr. Ouarda ZEDADRA (zedadra.ouarda@univ-guelma.dz) 1/4


3SI Guide pratique pour démarrer avec Prolog IA

L’interprète Prolog utilise son algorithme d’unification pour rendre égaux X et Y. Trois cas sont possibles
pour une unification réussie, à savoir :
1. X et Y sont des constantes et elles sont égales ;
2. X ou Y est (sont) une variable libre ; dans ce cas il y a succès et la variable libre est liée au terme
représenté par la seconde variable (si les deux sont des variables libres, elles co-référencent alors sur
le même objet) . (X=Y, X=_G1, Y=_G1, si X=3 alors Y=3) ;
3. X et Y sont des termes composés. Il y a succès si les deux ont le même foncteur, le même nombre
d’arguments et si les arguments (dans l'ordre) s’unifient l’un avec l’autre.
Exemple 1 (unification réussite)
𝑡1 = 𝑓(𝑔(𝑢), 𝑍), 𝑡2 = 𝑓(𝑔(ℎ(𝑇)), 𝑟(𝑎))
𝑆0 = {}
D=(u,h(T)).
𝑆1 = 𝑆0 ∪ {ℎ(𝑇)/𝑢} = {ℎ(𝑇)/𝑢}
D=(Z,r(a))
𝑆2 = 𝑆1 ∪ {𝑟(𝑎)/𝑍} = {ℎ(𝑇)/𝑢, 𝑟(𝑎)/𝑍}
M=𝑆2

Exemple 2 (unification réussite)


P(X,f(g(X)),a) et p(b,Y,Z) liste de substitutions=
P(X,f(g(X)),a) et p(b,Y,Z) liste de substitutions= {X/b}
P(b,f(g(b)),a) et p(b,Y,Z) liste de substitutions= {Y/f(g(b)), X/b}
P(b,f(g(b)),a) et p(b, f(g(b)),Z) liste de substitutions= {Z/a, Y/f(g(b)), X/b}
P(b,f(g(b)),a) et p(b, f(g(b)),a) liste de substitutions= {Z/a, Y/f(g(b)), X/b}
UPG={Z/a, Y/f(g(b)), X/b}

On utilise directement l'opérateur "=" pour unifier deux termes. Voici en Prolog l’exécution de quelques unifications :
?- X = 1.
X = 1
?- omar = amina.
No
?- suc(X) = suc(suc(suc(0))).
X = suc(suc(0))
?- p(X,X) = p(1,2).
No
?- p(X,X) = p(1,1).
X = 1
?- p(X,X) = p(1,W).
X = 1
W = 1
?- p(Y,fun(Y)) = p(toto,Z).
Y = toto
Z = fun(toto)
?- p(X,X,2) = p(1,W,W).
No
Pour s'assurer que deux termes ne sont pas unifiables, on utilise l'opérateur \= :
?- p(X,X,2) \= p(1,W,W).
Yes

Remarques :
 Deux termes ne sont pas toujours unifiables. Exemple : f(a), f(b)
 Deux termes peuvent avoir une infinité d’unifications mais il existe un unificateur le plus général (UPG)
c’est celui donné par l’algorithme (celui qui utilise toutes les substitutions).
 L’unification de X par f(X) donne une boucle infinie.

3. Algorithme de résolution
Essentiellement, un programme Prolog est composé de règles, qui sont des clauses déclarant un fait qui
dépend d'autres faits. Ces règles ont la forme suivante :
Dr. Ouarda ZEDADRA (zedadra.ouarda@univ-guelma.dz) 2/4
3SI Guide pratique pour démarrer avec Prolog IA

𝐻 ∶ − 𝐵1, 𝐵2, … , 𝐵𝑛
𝐻 𝑒𝑡 𝐵1, 𝐵2, … , 𝐵𝑛 Constituent la tête et le corps de la règle, respectivement. La signification d'une règle est
la suivante : pour résoudre un but H, il faut résoudre la conjonction de buts𝐵1, 𝐵2, … , 𝐵𝑛. Un fait peut être
considéré comme une clause sans corps.
Pour satisfaire une requête, l'interpréteur Prolog utilise l'algorithme de résolution, qui utilise une pile,
appelée résolvante, pour contenir tous les buts qu'il reste à résoudre (notez que dans cet algorithme qu'un
fait est une clause dont le corps est vide) :

0) Se positionner à la première clause du programme


1) Résolvante requête
2) Tant que la résolvante n'est pas vide :
2.1. Obj Premier objectif de la résolvante
2.2. Retirer le premier objectif de la résolvante
2.3. Chercher la première clause 𝐶 = 𝐻 ∶ −𝐵1, 𝐵2, … , 𝐵𝑛 telle que H s'unifie avec Obj
Si on réussit
2.4. Ajouter au début de la résolvante tous les buts 𝐵1, 𝐵2, … , 𝐵𝑛
2.5. Si il existe d'autres têtes de clauses unifiables avec Obj
Mémoriser la position de la clause C comme dernier point de choix
2.6. Retourner à 2.1
Sinon
2.7. Si il existe des points de choix :
Retourner au dernier point de choix (Backtrack)
Revenir à l'étape 2.3
Sinon :
Retourner ECHEC
3) Retourner l'instanciation des variables de la requête

Il est important de noter que dans ce processus, le système mémorise les variables instanciées. Quand une
variable est instanciée dans une règle, soit dans la tête, soit dans le corps, la même instanciation s'applique
à toutes les occurrences de la variable dans la règle. Quand l'interpréteur fait un retour arrière à un point de
choix, il élimine le résultat de toutes les unifications qui ont été réalisées entre le moment où le point de choix
a été mémorisé et le moment de l'échec.

4. Prolog et la résolution
1. Comment l’interpréteur fait-il pour répondre aux questions ?
Il cherche à prouver que la question posée se déduit logiquement des connaissances qu’il connait.
Pour cela, il construit un arbre de recherche. Chaque branche de l’arbre déroule une étape de la
tentative de preuves.
Si au moins une branche conduit à la preuve complète de la question, l’interpréteur répond par oui.
Si toutes les branches conduisent à des échecs l’interpréteur répond par non.
2. Unification de prédicat :
La construction de l’arbre de recherche s’appuie sur l’unification de terme. Unifier deux termes
consiste à déterminer une substitution qui rend ces 2 termes égaux.
Exemple : Soit les deux prédicats père (omar, X) et père(Y, ali) et une substitution qui permet de les
unifier : {ali/X, omar/Y}. Quand on applique cette substitution à père(omar, X) on obtient le prédicat
père(omar, ali) et à père(Y, ali) on obtient aussi le prédicat(omar,ali).
3. Arbre de recherche :
Soit p() la question à laquelle l’interpréteur doit répondre :
 Unification de la question avec toutes les clauses du programme qui ont le même symbole de
prédicat, si aucune unification n’est possible l’interpréteur répond non à la question. Sinon,
il y a autant de branches que d’unification possible.
 La branche la plus à gauche est développé la première. Si la clause du programme qui a été
unifiée avec la question est un fait alors l’interpréteur retourne la substitution qu’il a
appliquée. Si la clause est une règle alors l’interpréteur a pour nouveaux buts les prédicats
unifiés du corps de la clause.
Exemple : soit la programme :
dog(fido)
dog(rover)
dog(henry)
cat(felix)
Dr. Ouarda ZEDADRA (zedadra.ouarda@univ-guelma.dz) 3/4
3SI Guide pratique pour démarrer avec Prolog IA

cat(jane)
animal (X) :- dog(X)

Quelle serait la réponse aux questions :


dog(fido) yes
animal(fido) yes
cat(X) (X=felix et x=jane)
animal(felix) No
animal(X) (X=fido, X=rover, X=henry)

animal(X)

dog(X)

X=fido X=rover X=henry

dog(fido) dog(rover) dog(henry)

Arbre de résolution

Enrichir ce programme par les connaissances qui indiquent que le lion, le tigre, la vache sont des
animaux et que le lion et le tigre sont des carnivores.
dog(fido)
dog(rover)
dog(henry)
cat(felix)
cat(jane)
animal (X):- dog(X)
animal(X):- lion(X).
animal(X):- tigre(X).
animal(X):- vache(X).
carnivore(X) :- lion(X).
carnivore(X) :- tigre(X).

Dr. Ouarda ZEDADRA (zedadra.ouarda@univ-guelma.dz) 4/4

Vous aimerez peut-être aussi