Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
On voudrait décrire la structure d’une famille de 11 personnes (Cet exemple est traité dans le chapitre 8 du
livre Outils logiques pour l’intelligence artificielle de J.P. Delahaye. Editions Eyrolles) :
LUC
Puis on voudrait que le programme nous donne la réponse à des questions du genre :
• Qui est le père de Jean ?
• Quels sont les grands-parents de Paul ?
• Alain a-t-il des oncles ?
• ...
PROGRAMME famille :
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DOMAINS /* declarations de type. Les types predefinis sont:
INTEGER, REAL, SYMBOL, STRING, CHAR */
nom = symbol
/* le type symbol est toute suite de caractere pris parmi
les lettres, les chiffres et -, et commancant par une minuscule */
1
est-pere(nom,nom)
est-mere(nom,nom)
est-parent(nom,nom)
est-enfant(nom,nom)
est-grand-pere(nom,nom)
est grand-mere(nom,nom)
est-grand-parent(nom,nom)
est-frere(nom,nom)
est-soeur(nom,nom)
est-petit-enfant(nom,nom)
est-petit-fils(nom,nom)
est-petite-fille(nom,nom)
est-oncle(nom,nom)
est-tante(nom,nom)
feminin(lucie).
feminin(claire).
feminin(andree).
feminin(martine).
est-pere(jean,paul).
est-pere(jean,alain).
est-pere(pierre,jean).
est-pere(leon,lucie).
est-pere(paul,luc).
est-pere(pierre,jacques).
est-mere(claire,lucie).
est-mere(andree,jean).
est-mere(andree,jacques).
est-mere(lucie,paul).
est-mere(lucie,alain).
est-mere(martine,luc).
2
est-parent(X,Y) :- est-pere(X,Y).
est-parent(X,Y) :- est-mere(X,Y).
est-enfant(X,Y) :- est-parent(Y,X).
est-grand-parent(X,Y) :- est-grand-pere(X,Y).
est-grand-parent(X,Y) :- est-grand-mere(X,Y).
est-petit-enfant(X,Y) :- est-grand-parent(Y,X).
Chaque ligne du programme correspond à une affirmation. Il y a les affirmations (ou déclarations)
élémentaires (les faits), par exemple :
• masculin(jean).
• est-pere(jean,paul).
qui doivent se comprendre comme :
• jean est de sexe masculin
• jean est le père de paul
Il y a les affirmations contenant des variables (appelées règles, ou axiomes) par exemple :
• est-parent(x,y) :- est-pere(x,y).
• est-grand-pere(x,y) :- est-pere(x,z), est-parent(z,y).
qui doivent se comprendre comme :
• x est le grand-père de y s’il existe un z tel que x est le père de z et z est parent de y.
3
Le symbole :- signifie donc “si” c’est l’implication logique ⇐. A :- B signifie “A si B” ou “B implique
A” ou “si B alors A”.
Chaque affirmation contenant des variables doit être comprise comme quantifiée universellement (∀).
signifie :
∀x∀y∀z((est−pere(x, z) ∧ est−parent(z, y)) ⇒ est−grand−pere(x, y))
c’est à dire
∀x∀y(∃z(est−pere(x, z) ∧ est−parent(z, y)) ⇒ est−grand−pere(x, y))
En Prolog on ne peut écrire que des formules de la forme : A : −B1 , B2 , ..., Bn ; n ≥ 0, ce qui correspond
à : A ∨ ¬B1 ∨ ¬B2 ∨ ... ∨ ¬Bn . On ne peut donc écrire que des clauses ayant un littéral positif. De telle
clause s’appelle des clauses de Horn.
Définition 0.1
• un littéral est négatif, si c’est la négation d’un atome, il est positif dans le cas contraire.
• une clause de Horn est une clause dont au plus un littéral est positif. Dans le cas où exactement un littéral
est positif on parle de clause définie ; une clause défnie n’ayant pas de littéraux négatif est un fait ; si
aucun littéral n’est positif on parle de clause négative ou but.
• un programme définie est une séquence de clauses définies.
Notation 0.2
• C(x, y) ⇐ A(x, z), C(z, y) est une clause définie, c’est aussi une clause de Horn. En Prolog on écrit
C(X,Y) :- A(X,Z), C(Z,Y). .
• C(x, x) ⇐ est un fait, c’est aussi une clause de Horn. En prolog on écrit C(X,X).
• ⇐ C(x, a) ou ¬C(x, a) est un but ou clause négative, c’est aussi une clause de Horn.
• la séquence de clauses :
(1) C(x, y) ⇐ A(x, z), C(z, y).
(2) C(x, x) ⇐
(3) A(b, a) ⇐
est un programme définie.
Proposition 0.3 Soit S un ensemble de clauses de Horn du CP1 et soit S0 le sous-ensemble formé des
clauses définies, alors :
4
• S0 est satisfiable
• Si S est insatisfiable, il existe une clause négative G de S telle que S0 ∪ {G} est insatisfiable.
• pour tout noeud M, les fils de M sont tous les Mi déduits par résolution
en utilisant la substitution θi
Théorème 0.5 Si S = S 0 ∪ {c0 } est insatisfiable, que c0 est une clause négative, et que S 0 ne contient que
des clauses de Horn définies (ordonnées) en plaçant le littéral positif en tête, alors :
il existe une branche de l’arbre de dérivation de racine c0 conduisant à la clause vide.
Exemple 0.6
S 0 = {P (x) ∨ ¬R(x), P (x) ∨ ¬Q(f (x)) ∨ ¬Q(x), Q(f (x)) ∨ ¬Q(x), Q(a)}
c0 = ¬P (a)
L’arbre de dérivation de racine c0 est le suivant :
¬P (a)
¬Q(a)
5
0.1 Description de la résolution Prolog
La résolution Prolog peut être envisagée comme un parcours de l’arbre de dérivation en profondeur
d’abord avec retour en arrière. L’arbre dont il est question ici est exactement l’abre des dérivation
dans lequel à la place d’écrire la clause négative ¬B1 ∨ ¬B2 ∨ ... ∨ ¬Bn , on écrit simplment B1 , B2 , ..., Bn
et dans lequel on précise à chaque nœud les substitutions réalisées lors des étapes de résolution qui y ont
conduit. Chaque nœud de l’arbre de parcours (arbre de recherche) est étiqueté par :
• une liste de buts B1 B2 ...Bn
• une substitution θ
Au départ, on est au nœud étiqueté par :
• la question posée
• la substitution identitée ().
• sinon
• fin-si
Remarque 0.7
l’algorithme d’unification utilisé par Turbo Prolog ne vérifie pas que x n’est pas présent dans le terme t
(x 6∈ var(t)) lorsqu’on cherche à unifier x et t (occur check). C’est ce qu’on appelle allègement de
l’unification.
6
Exemple (Présentation du programme Humeur)
Jean et Alain sont deux personnages dont l’humeur est régie par :
X est de bonne humeur si X a de l’argent et X est en vacances et il y a du soleil ou si X réussit dans
son travail et dans sa famille. On sait que :
Jean a de l’argent.
Alain a de l’argent.
Jean est en vacances si on est en aout.
Alain est en vacances si on est en juillet.
On est en juillet.
Il y a du soleil si on est en aout.
Jean réussit dans le travail.
Alain réussit dans le travail.
Alain réussit dans sa famille
Le programme HUMEUR est le suivant :
PREDICATES
est_de_bonne_humeur(symbol)
a_de_l_argent(symbol)
est_en_vacances(symbol)
on_est_en(symbol)
il_y_a_du_soleil
reussit_dans_le_travail(symbol)
reussit_dans_sa_famille(symbol)
CLAUSES
7
Exercice
Prenons les clauses suivantes : • Remplacer la règle : on est en(juillet). par la règle on est en(aout).
et refaire le raisonnement Prolog associé au but est de bonne humeur(X).
• soit le programme suivant :
bb.
vv.
cc(jj) :- ee.
cc(jj) :- bb, vv.
mm(aa).
mm(jj).
gg(X) :- mm(X), cc(X).
Donner les arbres de recherche associés aux buts mm(X), cc(X) et gg(X).
Le fait que la résolution Prolog s’effectue selon l’algorithme indiqué a pour conséquence que :
• même si un fait simple est conséquence logique d’un programme, le programme peut boucler sans le
découvrir.
Exemple 0.8
Le programme :
aa :- aa.
boucle pour la question :
aa
En effet, l’arbre de recherche est :
(aa, θ = )
|
r1
|
(aa, θ = )
|
r2
|
...
Remarque 0.9
Si un but ne résulte pas d’un programme, il est normal que Prolog boucle a cause de l’indécidabilité de la
8
logique du premier ordre qui reste valable même pour les clauses de Horn. Mais, même si le but résulte du
programme l’algorithme de résolution Prolog peut boucler indéfinḿent.
Exemple 0.10
Le programme :
aa :- aa.
aa.
boucle pour le but
aa
alors que aa résulte (est conséquence logique) du programme.
En écrivant le programme sous la forme (les faits avant les règles) :
aa.
aa :- aa.
On obtient TRUE comme réponse à la même question aa.
Ceci montre que l’ordre des clauses est important quand on écrit un programme Prolog.
D’une manière générale, on peut dire qu’il vaut mieux mettre les faits avant les règles.
Ce n’est pas toujours suffisant pour éviter les boucles (le programme de l’exemple précédent donne la
bonne réponse mais ne s’arrête jamais).
Exemple 0.11
Le programme
dd.
aa :- bb.
bb :- cc.
cc :- aa.
cc :- dd.
Boucle à la question
aa
alors que aa résulte du programme.
En permutant les deux dernières règles, on obtient :
dd.
aa :- bb.
bb :- cc.
cc :- dd.
cc :- aa.
9
Le fait qu’on boucle ne provient pas toujours du seul fait que le programme contient un circuit dans les
atomes. Cela peut provenir de ce que l’arbre de recherche est parfois infini et que la stratégie utilisée “en
profondeur ...” il se peut qu’on s’enfonce dans une mauvaise branche.
Exemple 0.12
tre(ff(gg(jj))).
tre(X) :- tre(ff(X)).
tre(X) :- tre(gg(X).
10