Introduction à la Programmation Logique
Introduction à la Programmation Logique
PROGRAMMATION LOGIQUE
PROLOG
Présenté par:
Dr Kamal AMROUN
Sommaire
Introduction 1
1 Rappels de logique mathématique 3
1.1 Calcul des prédicats . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.1.1 Langage du calcul des prédicats . . . . . . . . . . . . . . . . . 3
1.2 Formes normales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.2.1 Forme normale Prenexe . . . . . . . . . . . . . . . . . . . . . 8
1.2.2 Forme normale de Skolem . . . . . . . . . . . . . . . . . . . . 10
1.2.3 Clauses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.3 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2 Programmation logique 16
2.1 Langage logique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.2 Substitution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.3 Unication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.4 Résolution SLD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.5 Domaines d'application de la programmation logique . . . . . . . . . 25
2.6 Exemples de programmes logiques . . . . . . . . . . . . . . . . . . . . 26
2.7 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3 Le langage PROLOG 31
3.1 Présentation de Prolog . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.2 Syntaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.2.1 Constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.2.2 Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.2.3 Prédicat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.2.4 Faits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.2.5 Règles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
ii
3.2.6 Buts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.3 Algorithme d'unication de PROLOG . . . . . . . . . . . . . . . . . 35
3.3.1 Extraction de l'information . . . . . . . . . . . . . . . . . . . 38
3.4 Exécution d'un programme Prolog . . . . . . . . . . . . . . . . . . . . 39
3.4.1 Algorithme d'exécution . . . . . . . . . . . . . . . . . . . . . . 39
3.4.2 Points de choix . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.5 Récursivité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.6 Calcul en Prolog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.6.1 Calcul de toutes les solutions . . . . . . . . . . . . . . . . . . 43
3.7 Stratégie de recherche . . . . . . . . . . . . . . . . . . . . . . . . . . 45
3.8 Stratégie de sélection . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
3.9 Manipulation dynamique des programmes . . . . . . . . . . . . . . . 45
3.10 Trace d'exécution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
3.11 SWI-Prolog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
3.12 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
5 La coupure 65
5.1 Coupure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
5.1.1 Dangers avec la coupure . . . . . . . . . . . . . . . . . . . . . 70
5.2 Négation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
5.3 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
iii
Introduction
La programmation logique est née de la découverte qu'une partie du calcul des pré-
(ce nom a été choisi par Philippe Roussel comme abréviation de PROgrammation
sant sur les idées développées par Robinson (1966) et Herbrand (1936) en logique
mathématique. Prolog est le langage le plus connu du style déclaratif. Il est le ré-
en intelligence articielle. Depuis, plusieurs interpréteurs (il existe aussi des versions
compilées) PROLOG ont été proposés et parfois avec des syntaxes diérentes.
Un programme logique est très diérent des programmes écrits dans un autre
style. Il est très évolué permettant d'exprimer de façon naturelle les textes du langage
faits et de règles de déduction puis à poser des questions (appelées aussi buts). Il
1
2
logique est une suite de clauses particulières appelées clauses de Horn qui sont des
clauses ayant au plus un littéral positif. On distingue trois types de clauses de Horn :
littéral positif.
de résolution pour éviter la déclaration de faits ou de règles qui ne peuvent pas être
Organisation du manuscrit
Ce cours, destiné aux étudiants de la troisième année de la licence informatique,
à raison d'un cours et d'un TD/TP par semaine pendant un semestre, est organisé
comme suit :
calcul des prédicats (terme, formule, littéral, variables libres, variables liées, etc.) ainsi
que les formes normales de Prenexe et de Skolem. Nous terminons ce chapitre par la
Alphabet
un ensemble de constantes : a1 , · · · , am
un ensemble de variables : x1 , · · · , xn
3
4
les quanticateurs : ∀, ∃
Termes
Les termes du calcul des prédicats sont dénis inductivement comme suit :
Exemple 1.1.1. 5, 6, x, et y sont des termes. x+1, y ∗z , 2−3, x∗y +5+(y −2)
Par contre, x > y n'est pas un terme car ">" est un symbole de prédicat.
Signalons que les symboles : <, >, ≤, ≥, =, 6=,· · · sont des prédicats.
5
f (M1 , · · · , Mn ) n'est pas une formule atomique. Ainsi, 3 + 5 ou +(3, 5) n'est pas une
Littéral
Dénition 1.1.2. Un littéral est une formule atomique ou la négation d'une formule
atomique.
Exemple 1.1.3. Soit le prédicat P et les termes ti et tj . Alors P (ti ,tj ) est un littéral
(formule atomique) et ¬P (ti ,tj ) est aussi littéral (négation de la formule atomique).
Formule
Dénition 1.1.3. Une formule (parfois appelée formule bien formée) est dénie in-
ductivement comme suit :
si A est une formule, alors ¬A, ∀xA et ∃xA sont aussi des formules
∀x∃y(A(x, 6) −→ ¬B(y, 7)) est une formule (bien formée). 5 > 3, x = y , 6 < 7 et
La priorité des connecteurs est dénie comme suit (du plus prioritaire au moins
prioritaire).
¬ (négation)
∀, ∃
∀xA ∧ B
∀xA → B
∃xA ∧ B
∃xA → B
Dénition 1.1.4. Soit x une variable et soit A une formule. Les positions de x dans
A sont appelées les occurrences de x dans A.
Dénition 1.1.5. Soit x une variable et soit A une formule. Une occurrence de x
dans A est dite liée si elle est dans le champ d'un quanticateur ∀ ou ∃, sinon elle est
dite libre. Une formule sans variable libre est dite close. Si une formule comporte au
Dans cette formule, les deux occurrences de x et y sont liées. α est donc close.
Remarque 1.1.2. Une variable peut avoir des occurrences libres et des occurrences
liées.
Dans cette formule, les deux premières occurrences de x et y sont libres et elles sont
Dénition 1.1.6. Un terme quelconque t est dit libre pour la variable x dans une
formule A donnée si aucune occurrence libre de x dans A n'appartient à un champ
Exemple 1.1.9. Soit le terme t = g(x, m). t n'est pas libre pour y dans la formule :
∀xP (x, y) −→ ∃zQ(z, x) car x du terme t changera de statut de libre vers liée. Par
contre, le terme t0 = g(u, z) est libre pour y dans la formule ∀xP (x, y) −→ ∀zQ(z, x).
Dans cette section, nous allons présenter un moyen de transformer une formule
quelconque du calcul des prédicats vers une formule équivalente en forme normale de
propriétés.
Dénition 1.2.1. Une formule du calcul des prédicats est en forme normale conjonc-
tive de Prenexe si tous les quanticateurs sont en tête de la formule :
Exemple 1.2.1. ∀x∃y(P (x, y)∨¬Q(x, z)). Cette formule est en forme normale conjonc-
tive de prenexe. Par contre, la formule ∀x∃yP (x, y) ∨ Q(x, z) n'est pas en forme
Théorème 1.2.1. Toute formule du calcul des prédicats A peut être transformée en
une autre formule A0 équivalente en forme normale conjonctive de prenexe.
9
parties de A par des (sous) formules équivalentes. A cet eet, nous allons appliquer
champs respectifs).
suit :
Remplacer (A ∧ B) ∨ C par (A ∨ C) ∧ (B ∨ C)
10
Remplacer A ∨ (B ∧ C) par (A ∨ B) ∧ (A ∨ C)
Exemple 1.2.2. Mettre la formule suivante sous forme normale de prenexe conjonc-
tive.
∀xA −→ ∃yB
On remplace ∃x(¬A ∨ ∃yB) par ∃x∃y(¬A ∨ B). Cette formule est bien entendu
Exemple 1.2.3. Mettre la formule suivante sous forme normale de prenexe conjonc-
tive.
∀x∃yA(x, y) −→ ∃yB(y, y)
Dénition 1.2.2. Une formule A en forme normale de Skolem est une formule As
en forme normale prenexe où les connecteurs existentiels ont été supprimés de telle
11
Exemple 1.2.4. La formule ∀x∀yP (x, y, z) est en forme normale de Skolem. Par
contre ∀x∃yP (x, y, z) n'est pas en forme normale de Skolem à cause de la présence
du quanticateur ∃.
calcul des prédicats vers une formule en forme normale de Skolem conservant la sa-
tisabilité.
Exemple 1.2.5. La formule ∀z∀x∃yP (x, y, z) de l'exemple 1.2.4 n'est pas en forme
de Skolem. Sa skolémisation donne une formule de la forme ∀z∀xP (x, f (z, x), z) où
f (z, x) est une fonction de Skolem dont les arguments sont les variables quantiées
formule donne ∀z∀xP (b, x, g(z, x), z) où b est une constante de Skolem et g(z,x) est
1.2.3 Clauses
Dénition 1.2.3. Une clause est une formule (universellement quantiée) dont le
corps est une disjonction de formules atomiques ou de la négation de formules ato-
miques.
Remarque 1.2.2. Une formule en forme normale conjonctive est une conjonction de
clauses.
∃x∃y(¬A(x) ∨ B(y)).
3. Clause
3. Clauses
à savoir.
¬A(u) ∨ C(x)
¬B(u) ∨ C(x).
1.3 Exercices
Exercice N◦ 1
Mettre les énoncés suivants sous forme de formules du calcul des prédicats.
Exercice N◦ 2
Indiquer les occurrences libres et liées de la variable x dans les formules suivantes :
Exercice N◦ 3
Exercice N◦ 4
Exercice N◦ 5
A −→ B
∀xA(x) −→ B
∀xA(x) −→ ∃xB(x)
A(x) −→ ∀xB
A −→ B −→ C ∧ D ∨ H
∃x∃yP (x, y, n)
résolution.
symbolique : dans le sens où tous les objets manipulés sont des symboles (constantes,
variables, etc.).
16
17
d'un langage des données qui est un ensemble de termes. Un terme peut être une
1. fait : un fait est une relation sur des objets du monde considérée comme
vraie. Par exemple intelligent(ali) est un fait du monde réel. intelligent est
un prédicat et ali est une constante. Cette formule factuelle exprime le fait
que ali est intelligent. Une base de faits est une suite de faits exprimant
freres(youcef, mohamed).
homme(mohamed)
2. règle : une règle est une clause constituée d'un littéral positif (appelé tête
vraies.
3. but : un but est une formule dont on cherche à savoir si elle est vraie ou
?-s÷urs(X, Y).
?-male(ali).
?-=(X, Y).
?->(X, Y).
Variables logiques
Une variable logique représente une entité du monde réel mais une fois instanciée,
cette variable ne peut pas changer de valeur comme c'est le cas dans les langages
classiques. En d'autres termes, une variable logique n'est pas une zone mémoire.
Remarque 2.1.1. Les variables logiques sont locales et elles sont renommées à chaque
utilisation.
2.2 Substitution
Une des notions les plus importantes en programmation logique est la substitution.
2.3 Unication
Dénition 2.3.1. Deux termes t1 et t2 sont dits uniables s'il existe une substitution
σ telle que σ(t1 ) = σ(t2 ).
σ(t1 ) = · · · = σ(tn ) et
σ 0 = σµ.
20
L'algorithme 3 retourne l'unicateur le plus général pour les deux expressions exp1
et exp2 .
Initialisation :
θ0 = ², E0 = {exp1 = exp2 }
Output : Unicateur le plus général de exp1 et exp2 .
1: while Ei 6= ∅ do
2: if Ei = {f (s1 , · · · , sp ) = f (s01 , · · · , s0p )} ∪ Ei0 then
3: Ei+1 = {sj = s0j }1≤j≤p ∪ Ei0 et θi+1 = θi
4: if f (s01 , · · · , s0p ) = g(s01 , · · · , s0m ) ∈ Ei avec f 6= g ou m 6= p then
5: échec de l'unication
6: if Ei = {X = X} ∪ Ei0 then
7: Ei+1 = Ei et θi+1 = θi
8: if Ei = {t = X} ∪ Ei0 ou Ei = {X = t} ∪ Ei0 , t 6= X et X 6∈ V (t) then
9: Ei+1 = [X ← t]Ei0 et θi+1 = θi [X ← t]
10: if Ei = {t = X} ∪ Ei0 ou Ei = {X = t} ∪ Ei0 , t 6= X et X ∈ V (t) then
11: échec de l'unication
(clause vide) ; ceci par application des diérentes clauses du programme. En cas
Il est à signaler que les deux interprétations (déclarative et procédurale) sont équiva-
général.
Le principe de résolution SLD est une règle de simplication des buts qui procède
par unication avec les têtes de clauses du programme. C'est une variante du principe
de résolution proposé par Robinson pour toutes les clauses du calcul des prédicats
placé par A1 , · · · , Ap . Ceci bien sûr en supposant que A et B sont uniables via une
certaine substitution σ .
22
Remarque 2.4.1. On voit dans le principe de résolution SLD deux sources d'indéter-
minisme :
Arbres SLD
tion).
(même prédicat)
renommée β 0 ← β10 , · · · , βm
0
et avec l'ufg (unicateur le plus général) θ de β 0
Ce processus est répété jusqu'à ce qu'il ne soit plus possible de rajouter des
n÷uds (c'est-à-dire jusqu'à atteindre des labels de n÷uds qui sont soit vides
soit irréductibles).
Chaque n÷ud vide représente une solution pour la question initiale (ie. une
23
instance du but initial qui est une conséquence du programme). Pour trouver
aux variables de α1 , · · · , αn .
Remarque 2.4.2. Il peut y avoir des branches innies dans l'arbre SLD.
paramètres : la manière de choisir l'atome à réduire à chaque étape ainsi que l'ordre
dans lequel les clauses sont exploitées : recherche en profondeur ou en largeur d'abord.
h(0) ←− .
h(s(x)) ←− h(x).
h(b) ←− .
r(b) ←− .
r(c) ←− .
La gure 2.2 montre deux arbres pour les buts ?-h(x),r(y). et ?-h(x),r(x). respec-
tivement.
Dénition 2.4.2. Une dérivation SLD est une suite de buts obtenus par résolution
SLD à chaque étape :
24
h(y)
y=0 y=s(y1)
Succès h(y1)
y1=0 y1=s(y2)
Succès h(y2)
y2=0 y2=s(y3)
Succès h(y3)
...
h(x),r(y) h(x),r(x)
x=a x=b
x=a x=b
Une dérivation SLD correspond à une branche complète de l'arbre SLD. Nous
branche innie.
Remarque 2.4.3. Pour éviter les conits de variables, il est important de renommer
Bases de données
Systèmes experts
Automates
···
26
homme(omar).
homme(said).
femme(céline).
femme(lila).
pere(said, ali).
pere(omar, ali).
mere(omar, céline).
mere(said, céline).
avec la substitution X/omar, Y/said. Cela donne le but suivant (constitué de 3 sous-
Le premier sous-but correspond à un fait donc il est retiré. Il reste les deux autres.
Pour P1/ali, le premier sous-but correspond à un fait du programme donc il est eacé.
gramme donc ils sont tous eacés. Cela correspond à un succès. Donc omar et said
frere(omar, said).
X/omar
Y/said
homme(said), parent(said, M,P), parent(omar, M,P).
M/M1
P/P1
mere(said,M1), pere(said,P1), parent(omar, M1,P1).
M1/céline
P1/ali
parent(omar, céline,ali).
mere(omar,céline),pere(omar,ali)
pere(omar,ali)
succès
p(b).
p(c).
q(c).
q(d).
r(a).
p(X)←− q(X).
q(X)←− r(X).
p(X)
q(X)
succès succès succès
X/d X/c
X/a
Succès
2.7 Exercices
Exercice N◦ 1
Expliquer pourquoi uniquement les clauses de Horn peuvent être exploitées pour
Exercice N◦ 2
Ali s'est marié avec Djamila et ont donné naissance à un garçon Said et une lle
Malika. Said s'est marié avec Yasmine et ont deux lles Leila et Saida. Malika quant
précédents.
e. Dénir le prédicat garçon(X, Y) qui spécie que X est un enfant de Y de sexe mâle.
30
Exercice N◦ 3
a(X)← b(X,Y),c(Y).
a(X) ← c(X).
b(a,b).
b(a,c).
c(b).
c(a).
Exercice N◦ 4
p(0).
p(s(x))← p(x).
Exercice N◦ 5
p(a).
p(b).
q(b).
q(c).
Donner un arbre SLD pour le but ?-p(x),q(y), puis un autre pour le but ?-p(x),q(x).
Chapitre 3
Le langage PROLOG
3.2 Syntaxe
3.2.1 Constantes
En Prolog, toute chaîne de caractères qui commence par une minuscule est une
constante.
31
32
Remarque 3.2.1. Une chaîne de caractères entre cotes ' ' est une constante même si
3.2.2 Variables
En Prolog, toute chaîne de caractères qui commence par une majuscule est une
variable.
Variables anonymes
Une variable est dite anonyme si elle commence par _. Les valeurs aectées à ces
variables après unication importent peu. Elles sont utilisées pour des variables dont
Par exemple quand on cherche à savoir si ali a un frère, alors il sut de poser la
?-frere(ali,_).
Yes
3.2.3 Prédicat
pas confondre avec une constante. Un prédicat a des arguments qui peuvent être des
Exemple 3.2.4. freres(X, ali), pere(ali, omar), jumeaux(YY, ZZ) sont des formules
atomiques. freres, pere et jumeaux sont des prédicats.
3.2.4 Faits
Un fait est une clause de Horn positive (sans littéraux négatifs). Il exprime une
connaissance factuelle. Sa syntaxe est illustrée par l'exemple suivant. Un fait se ter-
3.2.5 Règles
Les règles sont des clauses ayant un littéral positif et un ou plusieurs littéraux
négatifs. Elles sont de la forme A : −B1 , · · · , Bm . Cette formule veut dire pour que A
la lire comme suit : Si B1 , · · · , Bm sont simultanément vraies alors A est aussi vraie.
grand-pere(X, Y) :-mere(X,Z'),pere(Z',Y).
Pour que Y soit grand père de X, il faut qu'il existe un Z tel que Z est père de X et
freres(X, Y) :-mere(X,H),mere(Y,H).
Pour que X et Y soient des frères, il sut qu'ils aient même père ou même mère.
Remarque 3.2.2. On peut noter les règles des exemples 3.2.8 et 3.2.9 respectivement
comme suit :
Les virgules "," expriment la conjonction et les point-virgules " ;" exprime la disjonc-
tion.
3.2.6 Buts
Appelés parfois questions, les buts permettent d'exprimer une interrogation sur
l'existence de données vériant les prédicats. La syntaxe d'un but est la suivante :
homme(ali).
homme(said).
pere(said, omar).
pere(ali, omar).
?-frere(said, ali).
?-frere(M, N).
?-pere(X,ali)=pere(djamila, Y).
X=djamila,
Y=ali.
36
Remarque 3.3.1. Quand Prolog tente d'unier un but avec un fait ou une tête de
suit :
?-aime(X1,ali)=aime(omar, X2).
Exemples d'unication
?-1+2=2+1.
No
?-1+2= :=2+1.
Yes
?-X=ali.
X=ali
?-ali=omar.
No
?-f(X,5)=f(10,Y).
X=10
Y=5
?-p(X,X,X)=g(X,X,X).
No
?-p(X,X,X)=p(a,a,a).
X=a
?-p(X,X,X)=p(11,11,12).
No
?-p(X,X,a)=g(b,Y,Y).
No
?-homme(ali) 6= homme(farid).
Yes
Le symbole 6= est utilisé pour non unication. La réponse est évidemment Yes car
ami(omar,ali).
ami(omar, farid).
garçon(omar).
garçon(farid).
lle(djamila).
lle(zahira).
?-garçon(X).
X=omar ;
X=farid ;
No
Pour le traitement du but : ?-garçon(X)., Prolog essaie d'unier garçon(X) avec cha-
cun des faits du programme dans l'ordre de leur apparition. Ainsi, la tentative d'uni-
cation de garçon(X) avec ami(omar,ali) échoue car on est en présence de deux prédi-
cats diérents. Puis il tente d'unier garçon(X) avec ami(omar,farid). Le résultat est
aussi un échec car les deux prédicats sont diérents aussi. Puis, il tente d'unier gar-
çon(X) avec garçon(omar). Cette fois, la tentative réussit car les deux expressions ont
ce cas, Prolog retourne X=omar. Si on tape " ;" (on demande une autre réponse),
39
(appelée résolvante ) pour sauvegarder tous les choix possibles à un moment donné.
dernier but considéré pour lequel il restait encore d'autres possibilités d'unications.
40
grandpere(X,Y) :-mere(X,Z),pere(Z,Y),homme(Y).
homme(ali).
pere(omar,said).
pere(said,ali).
mere(yacine,anissa).
pere(anissa,ali).
L'arbre de résolution est donné par la gure 3.1. Le point de choix est au niveau du
n÷ud 1.
grandpere(X,Y)
noeud 1
X/omar X/yacine
Z/said Z/anissa
home(ali) homme(ali)
Yes Yes
3.5 Récursivité
En Prolog, la récursivité est dénie par la donnée :
du pas de la récursivité,
de la condition d'arrêt.
En Prolog, il n'y a pas de loop et de for, donc la récursivité est le seul moyen
Exemple 3.5.1. Soit le programme qui calcule la factorielle d'un entier. Il est bien
connu que la factorielle de n'importe quel entier n est n *factorielle de (n − 1). Il est
évident que le pas de la récursivité dans ce cas est 1 et la condition d'arrêt est le fait
f actorielle(0, 1).
?-factorielle(5,N).
N=120
?-factorielle(X,120).
No
suite du cours.
Le prédicat is
à une variable.
Yes
?-Y is 5+2.
Y=7
?-M is X+Z.
M=12
?-12 is R+10.
Error
être une expression quelconque. Elle ne peut être q'une valeur numérique.
Exemple 3.6.2. ?- X = 8 + 3, X is 7 + 4.
No
L'expression à gauche de is n'est pas une valeur numérique, c'est pour cela que la
requête a échoué.
43
Le prédicat = :=
Les opérateurs <, >, =<, >= et = \ = eectuent le calcul avant de comparer les
valeurs. Pour utiliser ces opérateurs, les variables doivent être instanciées.
?-4>3.
Yes
?-X=3.
Yes
?-Y=5.
Yes
?-X>Y.
No
Cependant, à chaque fois qu'il donne une réponse, il perd la précédente. Les prédicats
ndall, bagof et setof permettent de sauvegarder toutes les solutions dans une liste.
44
Le prédicat ndall
ndall(Objets,But, Liste).
Ce prédicat permet de retourner la liste Liste de tous les objets Objets vériant
But. Si le But n'a pas de solution, le prédicat ndall retournera la liste vide : [ ].
travaille(youcef, bejaia).
travaille(mohamed, alger).
Le prédicat bagof
solution. Aussi bagof dière de ndall quand il y a des variables libres dans But.
Dans ce cas, bagof sépare les résultats en fonctio des valeurs de ces variables libres :
Y est libre. En fait, il retourne tous les résultats possibles pour chaque valeur possible
de la variable libre.
45
Le prédicat setof
Ce prédicat se comporte comme bagof mais il élimine les doublons et trie la liste
des résultats.
le but sélectionné par la stratégie de sélection. Pour le cas de Prolog, le choix des
clauses se fait du haut vers le bas dans le programme. Cette stratégie n'est évidemment
pas complète car un choix de clause donné peut mener vers une branche innie alors
ou en retirant des clauses. Dans ce qui suit, nous allons présenter deux prédicats
Le prédicat assert
garçon(omar).
lle(saida).
garçon(malik).
lle(malika).
lle(leila).
Si nous voulons ajouter une clause pour dire que youcef est un garçon, on exécute la
requête suivante :
assert(garçon(youcef)).
Le prédicat retract
son argument.
Remarque 3.9.1. En SWI-Prolog, pour pouvoir exploiter assert et retract avec les
prédicats dénis dans le programme, il faut que les prédicats concernés soient déclarés
:-dynamic suivie de tous les prédicats dynamiques avec leur arité (c'est-à-dire leur
3.11 SWI-Prolog
Dans cette section, nous présentons quelques instructions permettant de travailler
avec SWI-Prolog.
:-consult (nom_chier).
ou
:-nom_chier.
:-consult (user).
ou :-user.
Puis [CTRL] D.
Pour lister l'ensemble des clauses dont la tête est le prédicat h, taper listing (h).
mentaire */
3.12 Exercices
Exercice N◦ 1
Ali et Omar sont des frères. Le père de Ali est Said. La mère de Omar est Nassima.
c- Ecrire la clause Prolog pour modéliser que X et Y sont des frères s'ils ont le même
Exercice N◦ 2
Exercice N◦ 3
Exercice N◦ 4
?-2=1+1.
?-X=2, X=1+1.
?- X is 3+4.
?-X=5, X is 3+3.
?-P(X,X)=P(a,b).
?-P(X,X)=Q(a,b).
Exercice N◦ 5
mange(omar, pommes).
mange(omar, carottes).
mange(said, bananes).
fruit(pommes).
fruit(bananes).
legume(carottes).
?- sante(X).
?- mange(X, pommes).
?- fruit(X).
?- legume(carrotte).
?- legume(oignon).
Chapitre 4
Les listes et arbres en PROLOG
4.1 Listes
Une liste est une séquence d'objets qui peuvent être de types diérents. C'est une
structure de données très utilisée en PROLOG. La notation usuelle est [a, b, · · · ]. Par
exemple [a, 11, 3, homme, gateau] est une liste contenant des objets de types diérents.
Aussi une liste peut contenir d'autres listes, par exemple [a, [1, 2, 3], X, Y ]. Il existe
aussi une notation permettant de distinguer la tête de la liste du reste de ses éléments.
Cette notation est comme suit : [X/L] où X est l'élément de tête et L est le reste de
la liste. Par exemple, considérons la liste [a, b, c] alors X correspond à a et L = [b, c].
Cette notation est très utilisée en Prolog. Plus généralement, on peut isoler plusieurs
éléments en tête de n'importe quelle liste. Par exemple [1, a, 2, b/L] indique n'importe
50
51
Nous allons illustrer l'unication de deux listes par une série d'exemples.
?-[a,b,c]=[X/L].
X=a.
L=[b,c]
?-[1/L]=[1,2,3].
L=[2,3]
?-[1,2,3/L]=[1,2,3].
L=[ ]
?-[a,b/L]=[1,2,3].
No
?-[a,b/L]=[a,b,3,4].
L=[3,4]
?-[Y]=[ ].
No
?-[X,Y]=[a,b,c].
No
?-[X|L]=[X,Y/L2].
L=[Y/L2]
?-[X, Y ] = [1/[2]]
X=1
Y=2
?-[X/L] = [1, [ ]]
52
X=1
L= [[ ]]
prédéni en Prolog. Cette opération exploite la récursivité. Son principe est comme
suit :
3. Ajouter au début de la liste résultante l'élément qui avait été isolé à la première
étape.
réalise cette opération. Ce prédicat permet diérentes utilisations du fait que Prolog
ne distingue pas les données des résultats. L'exemple 4.1.1 donne un aperçu sur les
Exemple 4.1.1. Soient L1, L2 et L3 trois listes telles que L3 est le résultat de la
concaténation de L1 avec L2.
53
?-append([1,2],[3,4,5], L3).
L3=[1,2,3,4,5]
?-append(L1,[3,4,5], [1,2,3,4,5]).
L1=[1,2]
?-append([1],L2, [1,2,3,4,5]).
L2=[2,3,4,5]
?-append(L1,L2, [1,2,3,4,5]).
L1=[ ]
L2=[1,2,3,4,5] ;
L1=[1]
L2=[2,3,4,5] ;
L1=[1]
L2=[2,3,4,5] ;
L1=[1,2]
L2=[3,4,5] ;
L1=[1,2,3]
54
L2=[4,5] ;
L1=[1,2,3,4]
L2=[5] ;
L1=[1,2,3,4,5]
L2=[ ] ;
No
Remarque 4.1.1. On peut utiliser le prédicat même lorsque les deux derniers argu-
?- append([a,b,c],L2,L3).
L2 = L
L3 = [a,b,c|L]
?- inverser([X|L1],L2) :- inverser(L1,L3),append(L3,[X],L2).
L=[gateau,h,1]
L=[gateau,h,1]
Etant donnés un objet et une liste, l'objectif est d'écrire un programme Prolog
qui vérie si cet objet fait partie des éléments de la liste ou non.
?-appartient(X,[X/L]).
?-appartient(X,[_/L]) :-appartient(X,L).
Signalons qu'il existe un prédicat member prédéni en Prolog pour cette opération.
Exemple 4.1.3. Soit la liste [b,c,a,d]. Le programme Prolog suivant vérie si a ap-
partient à cette liste.
?-member(a,[b,c,a,d]).
Yes
Remarque 4.1.2. Le prédicat prédéni member permet de lister les éléments d'une
?-member(X,[b,c,a,d]).
X=b
X=c
X=a
X=d
Si on tape " ;", on aura la réponse suivante car il n'y plus d'autres réponses possibles
X=No
associé est :
longueur([ ],0).
Notons qu'il existe un prédicat length prédéni en Prolog qui calcule la longueur de
N=4
57
somme([ ],0).
?-somme([5,10,1,2],S).
S=18
Plusieurs techniques sont proposées pour trier les éléments d'une liste. Les plus
utilisées sont le tri par sélection, le tri par fusion et le tri par insertion que nous
tri_Slection([X],[X]).
tri_Selection([X,Y|L],[Min|L1]) :- minimum([X,Y|L],Min),
enlever(Min,[X,Y|L], L2),
58
tri_Selection(L2,L1).
minimum([X],X).
enlever(X,[X|L],L).
enlever(X,[U|L],[U|M]) :- X=U,
enlever(X,L,M).
?-tri_selection([2,3,1,4],[1,2,3,4]).
True
?-tri_selection([2,3,1,4],L).
L=[1,2,3,4]
reste de la liste, et on insère l'élément à sa place dans la liste triée obtenue. Ceci bien
insertion(X,[ ],[X]).
insertion(X,[Y|L],[X,Y|L]) :- X=<Y.
59
sous-listes de n/2 éléments puis de trier par fusion les deux sous-listes récursivement
tri_fusion([X],[X]).
tri_fusion(L2,S2), fusionner(S1,S2,S).
diviser([A],[A],[ ]).
diviser([A,B|R],[A|Ra],[B|Rb]) :- diviser(R,Ra,Rb).
fusionner(A,[ ],A).
60
fusionner([ ],B,B).
4.2 Arbres
Les arbres sont très importants en Prolog. Ils permettent de représenter beau-
coup de données du monde réel. Leur principal avantage est la recherche ecace des
données. Au niveau de chaque n÷ud, il y a une valeur qui est la donnée qu'on veut
stocker. Pour exploiter les données stockées dans un arbre, il faut le parcourir soit en
Un arbre binaire est un arbre où chaque n÷ud est une feuille ou possède exac-
tement deux ls. Dans ce qui suit, nous allons présenter la représentation par des
listes.
Dans ce cas, un n÷ud de l'arbre est représenté par 3 éléments : le premier repré-
Exemple 4.2.1. L'arbre binaire de la gure 4.1 est représenté par une liste comme
suit : [A,[B,[D,[ ],[ ] ],[E,[ ],[ ]]],[C,[D,[ ],[ ]],[E,[ ],[ ]]]].
61
B C
D E F G
appartient(X,t(_,X,_)) :- !.
appartient(X,t(G,_,_)) :- appartient(X,G).
appartient(X,t(_,_,D)) :- appartient(X,D).
Les valeurs des n÷uds peuvent être ordonnées. Au niveau de chaque n÷ud, la
valeur du n÷ud est supérieure à toutes celles du sous-arbre enraciné au niveau de son
ls gauche et inférieure à toutes celles du sous-arbre enraciné au niveau de son ls
62
droit. Un exemple d'opérations qu'on peut réaliser sur ces arbres sont :
dans(X,t(_,X,_)).
Ajout d'éléments.
ajout(nil, X, t(nil,X,nil)).
Suppression d'éléments.
suppr(t(nil, X, D ), X, D).
4.3 Exercices
Exercice N◦ 1
a/
?- [X,a|Y] = [c,a,a|K].
?- [X,a|Y] = [c,c,a|K].
?- [1|X] = [1,2,3,5].
?- [1,2|X] = [1,2].
?- [1,2|X] = [1,2,7,3,4].
?- [X] = [ ].
?- [X] = [1,2]
?- [X,Y/Z] = [1,2]
?- [[X|Y]|Z] = [[a,b,c],[d,e],[f]].
b/
p([1,2,3,4,5]).
p([je,vais,[à ,l'université]]).
p([je,bois,[une,limonade]]).
?- p([X|Y]).
?- p([_,_,[_|Y]]).
?- p([_,_,[X|Y]]).
64
Exercice N◦ 2
Exercice N◦ 3
Ecrire un programme Prolog permettant de trier une liste d'entiers de façon as-
Exercice N◦ 4
Ecrire un programme Prolog qui vérie si une liste donnée représente un arbre
binaire.
Exercice N◦ 5
Ecrire un programme Prolog qui calcule la somme des entiers représentés par un
arbre binaire.
Chapitre 5
La coupure
notion de négation et de réduire le coût temporel d'une requête quand l'objectif est
5.1 Coupure
La notion de coupure est introduite pour ne pas sauvegarder les points de choix en
attente sur les prédicats précédant la coupure. Ceci bien sûr permet de réduire l'arbre
de recherche en élaguant certaines branches. Ce qui peut conduire à une plus grande
H : −B1 , · · · , Bi , !, Bi+1 , · · · , Bm .
Une fois le prédicat ! est exécuté, tous les choix sur H, B1 , · · · , Bi sont supprimés.
Par contre, il y a possibilité d'exploiter les autres choix sur les prédicats après ! (ie.
65
66
BI+1 , · · · , Bm ).
Exemple 5.1.1. Dans cet exemple (repris de la littérature), nous allons illustrer l'uti-
lisation de la coupure pour réduire l'arbre de recherche. Soit le programme PROLOG
suivant :
idiot(X) :-idiot2(X,Y),idiot3(Y).
idiot(X) :-idiot3(X).
idiot2(a,b).
idiot2(a,c).
idiot3(b).
idiot3(a).
En supposant que l'utilisateur veuille toutes les solutions (mêmes multiples) au but
idiot(X), indiquer les branches non parcourues de l'arbre SLD pour les modications
de programme suivantes :
idiot2(a,b) :- !.
idiot3(b) :- !.
Solution
67
idiot(X)
b- Les branches non parcourues sont les branches de la gure 5.1 qui sont absentes
c- Les branches non parcourues sont les branches de la gure 5.1 qui sont absentes
d- Les branches non parcourues sont les branches de la gure 5.1 qui sont absentes
Plusieurs autres utilisations sont possibles pour la coupure. Dan ce qui suit, nous
idiot(X)
idiot2(X,Y), idiot3(Y)
Y/b
idiot3(b)
Succès
idiot(X)
idiot(X)
L'instruction if <condition> then <inst1> else <inst2> peut être réalisée comme
suit en Prolog :
Exemple 5.1.2. Déclaration des valeurs d'une fonction en fonction des intervales
f(X,0) :- X < 3, !.
f(X,2) :- X < 6, !.
f(_,4).
humain(X) :- femme(X), !.
70
Etant donné que PROLOG calcule toutes les solutions à un but donné, on pourra
?-q(X1 , · · · , Xn ), !.
Quand on décide d'utiliser la coupure, il faut penser à tous les cas possibles d'uti-
Green cut
Red cut
sera diérent.
5.2 Négation
L'opérateur \+ (en GNU Prolog) ou le prédicat not représente la négation par
Notons que le but A ne peut pas être une variable libre. Par exemple, pour le but : ?-
No
?- not member(3,[4,5,6])).
Yes
not(p).
dierent(X,X) :- !,fail.
dierent(X,Y).
Remarque 5.2.1. not p(X) ne veut pas dire que p(X) est faux, mais on échoue à
déduire p(X).
72
5.3 Exercices
Exercice N◦ 1
h :- m.
h :- s.
m :- u.
m :- q, v.
m :- w.
v. puis en en m :-q, v, !.
Exercice N◦ 2
p(1).
p(2).
d(2).
f(1).
c(2).
b(1).
b(2).
r(X) :- p(X).
r(X) :- f(X).
q(X) :- b(X).
pred(X) :- q(X),f(X).
pred(X) :- d(X).
Exercice N◦ 3
a(X) :-c(X).
b(a,b).
b(a,c).
c(b).
c(a).
but a(X), indiquer les branches non parcourues pour les modications suivantes :
Exercice N◦ 4
r(a).
q(b).
74
Exercice N◦ 5
member(X,[X|_]).
member(Y,[_|L]) :-member(Y,L).
b- Modier le programme de telle sorte à ne garder que les branches succès dans
l'arbre de la question a.
Exercice N◦ 6
g(x) = 0 si x < 0
g(x) = 3 si x > 20
75
Bibliographie
1. A. Colmerauer, An Introduction to Prolog III
(1973).
Inter-éditions, 1985