Vous êtes sur la page 1sur 10

Université de Tunis El Manar 2008-2009

Faculté des Sciences de Tunis


————
Département des Sciences de
l’Informatique

Programmation Logique (PL)


Ecriture d’un programme en Turbo Prolog : Exemple

Enseignant : Khaled Bsaı̈es Section : IF3

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) :

LEON CLAIRE PIERRE ANDREE

LUCIE JEAN JACQUES

MARTINE PAUL ALAIN

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 */

PREDICATES /* declarations des predicats */


masculin(nom)
feminin(nom)

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)

CLAUSES /* les clauses du programme */


masculin(jean).
masculin(paul).
masculin(alain).
masculin(pierre).
masculin(leon).
masculin(luc).
masculin(jacques).

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-pere(X,Y) :- est-pere(X,Z), est-parent(Z,Y).

est-grand-mere(X,Y) :- est-mere(X,Z), est-parent(Z,Y).

est-grand-parent(X,Y) :- est-grand-pere(X,Y).
est-grand-parent(X,Y) :- est-grand-mere(X,Y).

est-frere(X,Y) :- masculin(X), est-pere(Z,X), est-pere(Z,Y), X <> Y.

est-soeur(X,Y) :- feminin(X), est-pere(Z,X), est-pere(Z,Y), X <> Y.

est-petit-enfant(X,Y) :- est-grand-parent(Y,X).

est-petit-fils(X,Y) :- masculin(X), est-petit-enfant(X,Y).

est-petite-fille(X,Y) :- feminin(X), est-petit-enfant(X,Y).

est-oncle(X,Y) :- est-frere(X,Z), est-parent(Z,Y).

est-tante(X,Y) :- estsoeur(X,Z), est-parent(Z,Y).


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

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 (∀).

est-grand-pere(X,Y) :- est-pere(X,Z), est-parent(Z,Y)

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.

Programmation Logique (PL)


La résolution Prolog

Idée centrale : raisonnement par l’absurde


Soit S un ensemble de clauses
(a) montrer que S ∪ {¬B} est inconsistant ⇔ S |= B
(b) profiter de la démonstration pour exhiber des contres exemples qui sont solutions du problème posé.
Rappelons quelques définitions:

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.

Définition 0.4 (arbre de dérivation)


Soit G un but. Un arbre de dérivation pour S ∪ {G} appelé aussi arbre SLD est un arbre vérifiant les
propriétés suivantes :

• chaque noeud est étiqueté par une clause négative

• la racine est étiquetée par G

• pour tout noeud M, les fils de M sont tous les Mi déduits par résolution

– de M en utilisant l’atome le plus à gauche de M


– d’une variante de la jieme clause de S

en utilisant la substitution θi

L’ordre des clauses dans un programme (séquence de clauses) est important.


L’ordre des atomes est significatif (important) dans les clauses.
Il existe trois comportements possibles des branches de l’arbre :
• branche infinie
• branche d’échec
• branche de succès.

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)

¬R(a) ¬Q(f (a)) ∨ ¬Q(a)

Echec ¬Q(a) ∨ ¬Q(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 ().

Etape du parcours de l’arbre

• on se trouve au nœud : (B1 B2 ...Bn , θ)

• si la liste des Bi , est vide, alors

– imprimer θ (car on a un succès)


– remonter au nœud précédent

• sinon

– prendre B1 le premier but


– rechercher parmi les clauses non encore explorées à ce nœud et dans l’ordre où elles sont écrites,
la première clause : C : −D1 , D2 , ..., Dk , dont la tête C peut s’unifier avec B1
– s’il n’y a pas de telles règles, alors
∗ si on est au nœud de départ, alors arrêt
∗ sinon remonter au noœud précédent
∗ fin-si
– sinon
∗ soit σ un pgu pour C et B1
∗ descendre en créant un nouveau nœud étiqueté (D1 σ...Dk σB2 σ...Bn σ, θoσ)
– fin-si

• 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

(1) est de bonne humeur(X) :- a de l argent(X),est en vacances(X), il y a du soleil.


(2) est de bonne humeur(X) :- reussit dans le travail(X), reussit dans sa famille(X).
(3) a de l argent(jean).
(4) a de l argent(alain).
(5) est en vacances(jean) :- on est en(aout).
(6) est en vacances(alain) :- on est en(juillet).
(7) on est en(juillet).
(8) il y a du soleil :- on est en(aout).
(9) reussit dans le travail(jean).
(10) reussit dans le travail(alain).
(11) reussit dans sa famille(alain).

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).

0.2 Limitations de la résolution Prolog

Le fait que la résolution Prolog s’effectue selon l’algorithme indiqué a pour conséquence que :

• l’ordre des clauses du programme est important ;

• certains programmes peuvent boucler indéfinément ;

• même si un fait simple est conséquence logique d’un programme, le programme peut boucler sans le
découvrir.

Voici quelques exemples élémentaires :

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.

Alors le programme répond correctement (sans s’arrêter) à la question 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).

boucle pour la question


tre(jj).
alors que tre(jj) résultre des trois axiomes composant le programme. Une exploration en largeur
d’abord de l’arbre des déductions permet de trouvrer la solution alors que la stratégie de Prolog “en pro-
fondeur...” s’enfonce dans une branche infinie.
Voici l’arbre des déductions associé :

10