Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
Jean-Paul Comet
Tour Evry 2, 523 Pla e des terrasses de l'agora 91000 Évry Cedex
e-mail : ometlami.univ-evry.fr
Contents
1 Introdu
tion 3
1.1 La programmation logique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2 Les éléments fondamentaux de Prolog . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2.1 Les faits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2.2 Les questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.2.3 Les données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.2.4 Uni
ation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.2.5 Les questions existentielles . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.2.6 Les faits universels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.2.7 Les questions
onjon
tives . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.2.8 Les règles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.2.9 Synthèse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.3 Comment Prolog répond aux questions ? . . . . . . . . . . . . . . . . . . . . . . . 7
2 Résolution en Prolog 8
2.1 Algorithme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.2 Ordre des
lauses et des buts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3 Arithmitique 11
3.1 Les opérateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.2 Arithmitique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.2.1 Prédi
at d'évaluation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.2.2 Opérateurs de
omparaison . . . . . . . . . . . . . . . . . . . . . . . . . . 12
4 Les Listes 14
4.1 représentation des listes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
4.2 Quelques opérateurs sur les listes . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1
4.3 Exer
i
es sur les listes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
5 Les Arbres 16
5.1 Arbres binaires de re
her
he . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
6 Les Coupures 18
6.1 Fon
tionnement de la
oupure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
6.2 Coupures vertes,
oupures rouges . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
6.3 Exemples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
6.4 Negation par e
he
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
8 Programmation de Jeux 26
8.1 Les jeux à 2 joueurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
8.2 Le prin
ipe minimax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
8.3 L'algorithme alpha-béta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
8.4 Le morpion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
8.5 Le jeu de Nim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
9 Utilisation de Prolog 34
10 Les TDs 35
11 Projets divers 48
11.1 Les arbres AVL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
11.2 Les di
tionnaires 2-3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
11.3 Dérivation symbolique de fon
tions . . . . . . . . . . . . . . . . . . . . . . . . . . 48
11.4 Intégration symbolique de fon
tions . . . . . . . . . . . . . . . . . . . . . . . . . . 48
11.5 Prin
ipe Minimax et alpha-beta . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
2
1 Introdu
tion
Cette partie passe en revue les mé
anismes de bases de Prolog à travers plusieurs exemples.
Les
on
epts les plus importants sont introduits dans une forme qui pourra être informelle : les
lauses Prolog, les faits, les règles et les pro
édures.
énon
er des
onnaissan
es et hypothèses sur un problème donné en tant qu'axiomes est
susant pour trouver la solution au problème.
Prolog :
programmation dé larative
Exemples :
3
hat(felix). prix(baguette,0.5).
hien(medor). utile(
outeau).
plus(1,3,4). frere(thomas,
helsea).
pere(bill,
helsea). ...
Syntaxe : les identi
ateurs de
onstantes, relation ou opération sont en minus
ule.
Exemples :
hat(felix)?
yes
hat(mistigris)?
no
pere(bill, moni
a)?
no
Exer
i
e 1.2 Le programme suivant dénit la relation plus d'arité 3 de façon à
e que le 3ème
argument soit la somme des 2 premiers.
plus(0,2,2).
plus(0,3,3).
plus(0,4,4).
plus(1,1,2).
plus(1,2,3).
plus(1,3,4).
Que répond Prolog aux 2 questions suivantes: plus(0,1,1)? et plus(1,1,2)?
1.2.2.1 U n but sera noté P, un fait sera noté P. et une question P?.
1. des onstantes
(a) des atomes :
haines alphanumériques (+
ara
tères spé
iaux : +-*/<>=:. ...)
ommen
ant par une minus
ule, ou s'il y a
onfusion ave
un autre type, entourée de
'...'.
(b) nombres
2. des variables :
haines alphanumériques
ommen
ant par une majus
ule ou par _. La
haine _ est une variable anonyme.
Chaque fois que _ apparait, il s'agit d'une nouvelle vraiable. parent(_,_) est équivalent
à parent(X,Y).
4
3. des stru
tures ou termes
omposés : fon
teur prin
ipal + arguments qui peuvent être
n'importe quelle type de données. p(t1,...tn) est un terme
omposé dont p est le fon
teur
prin
ipal et n l'arité. t1, ... tn sont ses n sous termes.
Exemples :
a 1
onstantes
X Var1 variables
date(J,M,A) donnee stru
turee
date(18, sept, 2003) donnee stru
turee
numse
u(felix,180129100114337) donnee stru
turee
point(1,4)
*(+(2,3),-(5,2))
Dénition 1.3 les questions, faits et termes sans variables sont dit de base. Un terme sans
variable est
los.
2. les variables
omprises dans les 2 termes peuvent être instan
iées à des objets de telle
manière qu'après substitution des variables par
es objets, les termes deviennent identiques.
Par exemple, date(D,M,2001) et date(D1,may,Y1) s'unient. Une instantiation qui rend les
termes identiques :
D est instantiée à D1
M à may
Y1 à 2001
Prolog é rit :
D = D1
M = may
Y1 = 2001
Exemple: pour f(X) et f(g(Z)) il existe plusieurs substitutions possibles qui rendent les
termes identiques : [X=g(a),Z=a℄ et [X=g(Z)℄
Dénition 1.5 t1 est une instan
e de t2 s'il existe une substitution telle que (t2) = t1.
Dans
e
as on dit que t2 est plus général que t1.
5
Dénition 1.6 L'uni
ation de 2 termes est l'instan
e
ommune la plus générale des deux ter-
mes. L'opérateur = est l'opérateur d'uni
ation.
Exer
i
e 1.3 Dans
ha
un des
as suivants, dites si les deux termes sont uniables. Si tel est
le
as, donner l'uni
ateur (rapeller les
onventions variables-atomes (majus
ule-minus
ule)).
2. Si S est une variable, alors les 2 termes s'unient et S est instantié en T. Et ré iproquement.
Cher
her à savoir s'il existe existe une valeur pour
ette variable,
'est
her
her un fait qui est
une instan
e de la question. On représente les solution par la ou les substitutions
orrespondant
à
ha
une des solutions.
Exemple : soit le programme suivant
pere(bill,
helsea).
pere(roger,georges).
On peut alors poser des questions existentielles:
pere(bill,X).
X =
helsea
pere(X,
helsea).
X = bill
pere(X,Y).
X = bill
Y =
helsea ;
X = roger
Y = georges ;
6
1.2.6 Les faits universels
Dénition 1.8 Un fait universel est un fait qui
ontient une ou plusieurs variables quantiées
universellement.
Une question simple est une question onjon tive à un seul but.
Dénition 1.10 Une variable partagée est une variable apparaissant dans au moins 2 bits dif-
férents de la question.
La portée d'une variable partagée est toute la
onjon
tion.
Les règles permettent de dénir de nouvelle relations à l'aide des relations déjà existantes.
1.2.9 Synthèse
programme logique = ensemble ni de
lauses/règles
un prédi
at p d'arité n est déni par un ensemble de
lauses dont la tête est de la forme :
p(t1,t2,...,tn)
les buts : atomes ou terme
omposés.
7
2 Résolution en Prolog
2.1 Algorithme
Soit un but G1,...,Gm à résoudre et un programme P.
Algorithme de résolution :
2. Choix d'une
lause H B1,...,Bn du programme P dont la tête s'unie ave
Gi.
Dans la stratégie standart, le
hoix de la
lause H B1,...,Bn se fait suivant l'ordre des
lauses dans le programme.
Soit l'uni
ateur le plus général (mgu : most general unier) de H et Gi.
3. réé
riture de G1,...,Gm en leur appliquant
et en remplaçant Gi par B1,...,Bn :
(G1),...,(Gi-1), (B1),...,(Bn), (Gi+1),...,(Gm).
Le but Gi a été rempla
é, éliminé, ea
é.
4. Re ommen er les étapes 1,2 et 3 de manière ré ursive ave la nouvelle liste de buts.
5. Si l'exe
ution de
ette nouvelle liste de buts termine ave
su
ès, alors terminer l'exe
ution
de la liste originale ave
su
ès.
Sinon, abandonner la nouvelle liste de buts et revenir au dernier point de
hoix (Ba
ktra
k-
ing) et essayer l'uni
ation ave
une autre
lause.
Au départ, il n'y a qu'un seul but : la question qui est posée. On arrive à un su
ès si la
liste des buts devient vide. La réponse donnée par Prolog est la
om:position des uni
ateurs
su
essifs.
Exemple : Soit le programme suivant
P1 C1 an
etre(X,Y) :- parent(X,Y).
C2 an
etre(X,Y) :- parent(X,Z),an
etre(Z,Y).
8
ancetre(michel,nicolas)
C1 C2
parent(michel,nicolas) parent(michel,Z),ancetre(Z,nicolas)
Z=stephane
no ancetre(stephane,nicolas)
parent(stephane,nicolas) parent(stephane,Z),ancetre(z,nicolas)
no no
P2 C1 an
etre(X,Y) :- parent(X,Y).
C2 an
etre(X,Y) :- an
etre(Z,Y),parent(X,Z).
Lors de la résolution du but an
etre(mi
hel,ni
olas), on tombe dans une bran
he innie.
ancetre(michel,nicolas)
C1 C2
parent(michel,nicolas) ancetre(Z,nicolas),parent(michel,Z)
C1 C2
no no ancetre(Z1,nicolas),parent(Z,Z1),parent(michel,Z)
C1 C2
P3 C1 an
etre(X,Y) :- an
etre(Z,Y),parent(X,Z).
C2 an
etre(X,Y) :- parent(X,Y).
Ce programme donne la même solution que le programme 1 mais est moins e
a
e par rapport
à P1,
ar il y a plus re re
her
he et de retour dans l'arbre de résolution.
ancetre(michel,nicolas)
C1 C2
parent(michel,Z),ancetre(Z,nicolas) parent(michel,nicolas)
Z=stephane
ancetre(stephane,nicolas) no
parent(stephane,Z),ancetre(z,nicolas) parent(stephane,nicolas)
no no
Autre exemple sur les listes (à pla
er plus tard,
ar les listes n'ont pas en
ore été vues):
P1 C1 min([X℄,X).
C2 min([E|L℄,E) :- E<X , min(L,X).
C3 min([E|L℄,X) :- X<E , min(L,X).
9
min([2,1,3],X)
X insuffisamment instancié
Exer
i
e 2.1 Cet exer
i
e a pour but de montrer l'importan
e de l'ordre des
lauses. On
on-
sidère le programme suivant dans lequel les prédi
ats t1 et t2 sont logiquement équivalents :
C1 p(a,b).
C2 t1(a).
C3 t1(X) :- t1(X), p(X,Y)
C4 t2(X) :- t2(X), p(X,Y)
C5 t2(a).
Montrer que t1(Z) réussit et que t2(Z) é
houe.
Exer i e 2.2 E rire an etre de plusieurs façon diérentes (ordre des lauses).
10
3 Arithmitique
3.1 Les opérateurs
Prolog dispose des opérateurs +,-,* et / inxé, préxé et postxé. ils sont
onsidérés
omme
fon
teurs ainsi l'expression 2*3+4*2 est un terme identique à +(*(2,3),*(4,2)).
La notation inxe est simplement la représentation externe du terme, la représentation interne
est la notation préxe, plus pré
isement, l'arbre représentatnt le terme.
Pour passer de la représentation interne à la représentation extrene, prolog doit
onnaitre
les priorités entre opérateurs : la multipli
ation est prioritaire sur l'addition, autrement dit
l'addition a une plus grande pré
éden
e que la multipli
ation. Les
onventions de pré
éden
e
de Prolog sont en a
ord ave
les les
onventions habituelles. Ainsi a+b*
est interprété
omme
+(a,*(b,
)) et non
omme *(+(a,b),
).
Le programmeur peut dénir ses propres opérateurs. Le terme opérateur est pas for
ement
bien adapté,
ar en général, on n'asso
ie pas d'a
tion à leurs fon
teurs asso
iés. la dire
tive pour
dénir un opérateur est de la forme : :- op(600,xfx,nomOperateur) où
le niveau de pré eden e est 600 (sur une é helle de 1200 pour la plupart des Prologs)
Le type xfx suggère que l'opérateur, noté par f, est un opérateur inxe pla
é entre 2 arguments
notés
ha
un x. Il y a 3 groupes de types :
Exer
i
e 3.2 Supposons que l'on e
rive un programme de manipulation d'expressions booléennes.
On voudrait pouvoir e
rire une des loi de Morgan :
:(A ^ B ) () :A _ :B
11
3.2 Arithmitique
3.2.1 Prédi
at d'évaluation
Les opérateurs sont : +,-,*,/, **, // (division entière), mod. Prenons un exemple :
?- X = +(1,+(1,1)).
X = 1+ (1+1)
X n'est pas évalué. Pour évaluer il faut utiliser le prédi
at d'évaluation is.
?- X is +(1,+(1,1)).
X = 3
?- Z=2, X is 1+1+Z.
Z = 2
X = 4
?- 1+a==1+a.
Yes
?- 1+a == a+1.
No
?- A==A.
Yes
?- f(A)==f(A).
Yes
?- f(A)==f(B).
No
?- 1+a =:= 1+a.
ERROR
Exer
i
e 3.3 Quel est le résultat des requètes suivants :
12
Exer
i
e 3.4 E
rire la fon
tion fa
torielle.
fa
t(0,1).
fa
t(X,Y) :- 0<X, X1 is X-1, fa
t(X1,Y1), Y is X*Y1.
13
4 Les Listes
4.1 représentation des listes
La liste est une stru
ture largement utilisée dans la programmation non numérique. Une liste est
une suite d'un nombre ni d'objets,
omme par exemple ann,tennis, tom, skiing. En plolog,
une telle liste est réprésentée par
[ann,tennis, tom, skiing℄
Exemples :
pour la liste .(ann, .(tennis, .(tom, .(skiing,[℄)))), la stru
ture en arbre est la
suivante :
[]
Exer i e 4.2 Dénir un prédi at qui vérie si une liste est une vraie liste.
vraieliste([℄).
vraieliste([X|L℄) :- vraieliste(L).
Exer
i
e 4.3 Dénir un prédi
at qui vérie si une liste est une vraie liste d'entiers (qui ne
ontient que des entiers).
14
append([℄,Ys,Ys).
append([X,Xs℄, Ys, [X|Zs℄) :- append(Xs,Ys,Zs).
member(X,[X,L℄).
member(X,[Y,L℄) :- member(X,L).
prefix([℄,Ys).
prefix([X,Xs℄,[X,Ys℄) :- prefix(X,L).
suffix(Xs,Xs).
suffix(Xs,[Y,Ys℄) :- suffix(Xs,Ys).
reverse([℄,[℄).
reverse([X,Xs℄,Zs) :- reverse(Xs,Ss),append(Ss,[X℄,Zs).
reverse2([℄,Tsil, Tsil).
reverse2([X|Rest℄,PartReverse,TotalReverse) :-
reverse(rest,[X|PartReverse℄,TotalReverse).
somme([℄,0).
somme([X|L℄,N) :- somme(L,M), N is M+X.
Exer
i
e 4.6 Dénir le prédi
at ordered sur une liste de termes d'entiers, sur une liste d'entiers.
ordered([℄).
ordered([Y|[℄℄).
ordered([X,Y|L℄ :- X=< Y, ordered ([Y|L℄).
Exer i e 4.7 Dénir le prédi at sansdoublon qui supprime les doublons dans une liste.
15
5 Les Arbres
Dénition 5.1 Un arbre est une stru
ture
omposée d'un noeud ra
ine et de sous arbres.
Un arbre peut être vide.
Un arbre binaire est un arbre dont
haque noeud a au plus 2 ls : un sous-arbre gau
he,
un sous arbre droit.
Exemple :
Dénition de la stru
ture :
arbre(R,G,D)
estarbre(vide).
estartbre(arbre(R,G,D)) :- estarbre(G), estarbre(D).
a a
b vide b 2
appartenan
e(X,arbre(X,G,D)).
appartenan
e(X,arbre(Y,G,D)) :- appartenan
e(X,G).
appartenan
e(X,arbre(Y,G,D)) :- appartenan
e(X,D).
Exer i e 5.3 Par ours d'un arbre, ordre préxe, inxe et postxe.
preordre(vide,[℄).
preordre(arbre(X,G,D),L) :-
preordre(G,LG), preordre(D,LD),append([X|LG℄,LR,L).
postordre(vide,[℄).
postordre(arbre(X,G,D),L) :-
postordre(G,LG), postordre(D,LD),
append([LD℄,[X℄,L1),
append(LG,L1,L).
16
Exer
i
e 5.5 Profondeur d'un arbre.
prof(vide,0).
prof(arbre(X,vide,vide),1).
prof(arbre(R,G,D),P) :- prof(G,PG), prof(D,PD),
PG1 is PG+1,
PD1 is PD+1,
max(PD1,PG1,P).
8n, noeud de l'ardre, les éléments du sous arbre G sont inférieurs au noeud père,
8n, noeud de l'ardre, les éléments du sous arbre D sont supérieurs au noeud père,
Exemple.
Exer i e 5.7 Re her he d'un élément dans un arbre binaire de re her he.
X = la ra ine, ok
subst(X,Y,vide,vide).
subst(X,Y,arbre(X,L,R),arbre(Y,L1,R1) :-
subst(X,Y,L,L1),
subst(X,Y,R,R1).
subst(X,Y,arbre(Z,L,R),arbre(Z,L1,R1) :-
Z \== X.
subst(X,Y,L,L1),
subst(X,Y,R,R1).
17
6 Les Coupures
Prolog, quand il ne trouve pas de solution, il ee
tue automatiquement le b
htra
king, retour
en arrière jusqu'au dernier
hoix ee
tuer an d'en faire un autre. Parfois, le ba
ktra
king est
inutile,
ar on sait par avan
e que les autres
hoix possibles ne pourront pas mener à une solution.
C'est le
as lorsqu'on doit exprimer un
hoix ex
lusif, un
if
ondition then ... else ....
e mé
anisme peut entrainer une ine
a
ité du programme.
La
oupure est un but parti
ulier qui empè
he le ba
ktra
king, et gèle ainsi
ertaines alter-
natives dans l'arbre d'ea
ement des buts.
Exemple jouet : imprime_pair
C1 imprime_pair(X,Y) :- X<Y, pair(X), print('premier ok').
C2 imprime_pair(X,Y) :- X=Y, pair(X), print('premier ok').
C3 imprime_pair(X,Y) :- X>Y, pair(X), print('premier ok').
pair(0).
pair(X) :- X<0, fail.
pair(X) :- X>0, X2 is X-2, pair(X2).
imprime_impair(1,3)
C1 C3
C2
echec
On aurait pu s'en rendre
ompte plus tt puisque les 3
onditions sont ex
lusives.
1- B :- ...
2- B :- B1,...,Bn, !, Bn+1,...,Bp
3- B :- ...
Si on
her
he à ea
er Bn+1, ongèle les alternatives non en
ore explorées pour l'évaluation de
B,B1,...,Bn.
18
(I) (II)
B1,B2,...Bn, ! , Bn+1,...,B’p,...
(2)
Effacement de B1,B2,...,Bn (retours arrièrepossibles)
Retour à XX et
passer à (II) pas d’évaluation de 3
C : A :- B1,...,Bk,!,Bk+1,... Bn
Le but
ourant G s'unie ave
la tête de C.
Si les B1,...,Bk réussissent, la
oupure est exé
utée et
toute autre
lause qui s'unie ave
G sera ignorée ((1) dans le s
héma) :
oupure des autres
hoix au niveau de
elui qui a introduit la
oupure.
Si Bi, pour i>k e
houent, la remontée ne se fait que jusqu'à la
oupure. Les autres
hoix
restant pour l'élimination de B1,..,Bk sont élagués ((2) dans le s
héma).
Exer i e 6.1 tra er l'arbre de résolution pour la question ?-(a(a). ave le programme
19
Exemple :
C1 fusion([℄,L,L).
C2 fusion(L,[℄,L).
C3 fusion([X|Xs℄,[Y|Ys℄,[X|Zs℄) :- X<Y,!,fusion(Xs,[Y|Ys℄,Zs).
C4 fusion([X|Xs℄,[X|Ys℄,[X,X|Zs℄) :- !, fusion(Xs,Ys,Zs).
C5 fusion([X|Xs℄,[Y|Ys℄,[Y|Zs℄) :- X>Y,!,fusion([X|Xs℄,Ys,Zs).
Les 3
lauses sont ex
lisives, on ne peut pas avoir simultanément X<Y, X=Y, X>Y. Si un test est
évalué à vrai, la
oupure immédiatement après sera évaluée à vrai. Les autres
lauses dénissant
fusion ne seront pas utilisées.
Faire le graphe de résolution ave
fusion([1,...℄,[2,...℄,L.
Exemple de
oupure verte :
minimum(X,Y,X) :- Y >= Y, !.
minimum(X,Y,X) :- Y < Y, !.
min(2,3,Z) min(2,3,3) min(3,2,Z)
X=3
C1 C2 C2 X=2 C1 C2 Y=2
X=2 Y=3 Z=Y
Y=3 X=2
2<=3,! 3<2, ! 3=<2 2<3,!
Z=X Y=3
Z=X
! 2>3,! echec echec yes
Z=X=2 echec
Exemple de
oupure rouge :
minimum(X,Y,X) :- Y =< Y, !.
minimum(X,Y,Y).
min(2,3,3) min(3,2,Z)
X=3
C2 X=2 C1 C2 Y=2
Y=3 Z=2
yes 3=<2,! yes
Exer i e 6.2 E rire un prédi at member qui re her he que la première solution.
member(X,[X|L℄).
member(X,[Y|L℄) :- member(X,L).
member1(X,[X|L℄) :- !.
member1(X,[Y|L℄) :- member1(X,L).
member(X,[a,b, ℄) sans le ut :
20
X=a ;
X=b ;
X=
;
no
ave
la
oupure :
X=a ;
no
6.3 Exemples
6.4 Negation par e
he
Comment exprimer en prolog : Marie aime tous les animaux sauf les serpents . S'il n'y avait
pas le sauf les serpents , on é
rirait :
likes(marie,X) :- animals(X).
On utilise alors une autre formulation : Si X est un serpent, alors Marie aime X n'est pas
vrai, sinon, si X est un animal, alors Marie aime X. Il faut don
pouvoir exprimer qu'un but est
faux. Ce
i se fait grà
e au prédi
at fail qui est toujours faux, for
ant le but appelant de l'être
aussi. On peut alors trans
rire en Prolog :
likes(marie,X) :- snake(X),!,fail.
likes(marie,X) :- animals(X).
ou
likes(marie,X) :- snake(X),!,fail
;
animals(X).
Prolog dénit un prédi
at not ou n+ qui a le
omportement suivant : si But est vrai alors
not(But) est faux, sinon not(But) réussit. Un but not(But) réussit si Prolog n'arrive pas à
prouver But. On parle de négation par e
he
.
La dénition de not en Prolog est la suivante :
not(P) :- P,!,fail.
not(P).
Supposons que P est vrai Supposons de P est faux
not(P) not(P)
C1 C2 C1 C2
fail
echec
21
7 Pour aller plus loin
7.1 Les entrées sorties
read(X) : lit un terme à partir du ot d'entrée
ourant.
see(file1) :
tell(file2) :
les ots par défaut sont user pour les ots d'entrée et de sortie.
write('fi
hier_d_entree_:'),
read(File1),
write(File1),nl,
write('fi
hier_de_sortie_:'),
read(File2),
write(File2),nl,
see(File1),read(X),seen,
tell(user),
write(X),nl,
tell(File2),write(X),told,
see(user),
tell(user).
22
ompound(X) : réussit si X est un terme
omposé.
Exer
i
e : E
rire un prédi
at qui
ompte le nombre de fois qu'un atome apparait dans une liste
donnée d'objets.
age(peter,7).
age(ann,5).
age(pat,8).
age(tom,5).
bagof(Child,age(Child,5),List). % List = [ann,tom℄
bagof(Child,age(Child,X),List). %
% X=7 List=[peter℄
% X=5 List = [ann,tom℄
% X=8 List = [pat℄
bagof(Child,X^age(Child,X),List).
% génère une seule liste indépendemment de l'age
% List=[peter,ann,tom,pat℄
setof : produit une liste triée sans doublon, ordre du tri : <.
findall(X,P(...X...),List) : liste de tous les objets X, independemment des dierentes
solutions pour les autres variables de P.
7.2.3 Dé
omposition
Term =.. [Fon
teur|ArgList℄ : Term =.. L est vrai si L est une liste dont le premier
élément est le fon
teur de Term suivi de ses arguments.
fun
tor(Term,Fun
tor,Arity) : vrai si Fun
tor est le fon
teur de Term et si Arity est
l'arité de Term.
name(Atom,ListeDesCodesAs ii) : liste des odes as ii des lettres qui ompose l'atome.
Exer
i
e : E
rire un prédi
at qui demande le fon
teur puis les arguments de
e fon
teur et qui
le teste.
23
assertz(T) : idem mais après tout autre prédi
at de même nom.
retra
t(F) : ea
e le fait F de la base de données. E
houe s'il n'y a pas
e but. Si on
utilise des variable, prolog ea
e le premier but qui s'unie ave
F.
inserer(X,[Y|L1℄,[Y|L2℄) :-
X > Y, ! , inserer(X,L1,L2).
inserer(X,T,[X|T℄).
24
% tri a bulle
tribulle(L,T) :-
e
hange(L,L1), ! , tribulle(L1,T).
tribulle(T,T).
e
hange([X,Y|R℄,[Y,X|R℄) :- Y<X.
e
hange([Z|R℄,[Z|R1℄) :- e
hange(R,R1).
25
8 Programmation de Jeux
Nous allons
onsidéré des te
hniques pour jouer à des jeux tels que les e
he
s : 2 joueurs
s'arontent et
haque situation peut être dé
rite parfaitement (pas d'aléatoire).
Cependant, pour les jeux intéressants les arbres
omplets des futurs possibles sont trop
om-
plexes pour permettre une re
her
he exhaustive. On peut alors développer une appro
he heuris-
tique basée sur le prin
ipe minimax, et qui peut être impléméntée de manière e
a
e dans
l'algorithme dit alpha béta.
won(Pos) :- terminalwon(Pos).
won(Pos) :- not terminallost(Pos),
move(Pos,Pos1),
not( move(Pos1,Pos2), not won(Pos2)).
Ce prin
ipe repose sur une re
her
he en profondeur d'abord, et n'empè
he pas les
y
les.
Mais
omme il s'agit d'une re
her
he en profondeur, elle ne donne pas de bons résultats pour
les jeux un peu
ompliqués où l'arbre est grand (e
he
s). Si on
onsidère qu'à une position du
jeu donnée, il y a 30 su
esseurs possibles, et que le jeu se joue en 80 dépla
ements, on arrive à
un arbre ave
environ 10
120 (impossible).
Jeu de nim : Cependant pour des jeux
omme le nim,
ette appro
he est possible.
Des
ription du jeu :
Sur un plateau de jeu sont disposées des rangées d'allumettes. Si nous numérotons les rangées de
0 à N,
haque rangée
ontient 2*k+1 allumettes où k va de 0 à N. A tour de rle,
ha
un des 2
joueurs
hoisit une rangée dans laquelle il prélève le nombre d'allumettes de son
hoix (maximum
3). Le gagnant est
elui qui retire la dernière allumette.
Position de départ :
Au départ, le programme vous demandera de
hoisir le nombre initial d'allumettes, les allumettes
seront rangées dans une pyramide
omme l'illustre la gure 1.
Déroulement du jeu :
26
A tour de rle, le joueur Humain (vous) et le joueur Ordinateur (votre ordinateur) vont prendre
un
ertain nombre d'allumettes dans un même tas. Fin de la partie :
La partie s'a
hève lorsqu'un joueur prend la dernière allumette, il a alors gagné et son adversaire
a perdu.
play(Game) :-
initialise(Game,Position,Player),
affi
her(Position,Player),
play(Position,Player,Result).
play(Position,Player,Result) :-
game_over(Position,Player,Result),!,announ
e(Result).
play(Position,Player,Result) :-
hoose_move(Position,Player,Move),
move(Move,Position,Position1),
affi
her(Position1,Player),
next_player(Player,Player1),!,
play(Position1,Player1,Result).
update(Move,Value,(Move1,Value1),(Move1,Value1)) :-
Value <= Value1.
update(Move,Value,(Move1,Value1),(Move,Value)) :-
Value > Value1.
Il faut en fait anti
iper sur plusieurs mouvements, et les arbres de re
her
he sont parfois trop
omplexes pour pouvoir etre par
ouru exhaustivement.
D'autre part, il est évident que plus la fon
tion d'évaluation sera
omplexe, plus le temps de
al
ul sera important, et moins il sera possible d'étudier de
oups en un laps de temps donné.
27
Les programmes
lassiques re
her
hent dans l'arbre le meilleur
oup possible en fon
tion de la
réplique de l'adversaire et
e jusqu'à une
ertaine profondeur de l'arbre.
Cette pro
édure est
onnue sous le nom de MINIMAX. À
haque niveau de l'arbre
orrespond le
joueur qui doit jouer. À une situation donnée
orrespond un ensemble de
oups possible, souvent
appelés légaux, à
haque
oup est asso
ié un noeud ave
sa valuation (dépendant de la fon
tion
hoisie). La pro
édure
her
he dans l'arbre la bran
he la plus valuée asso
iant à l'adversaire une
valuation négative.
4 MAX
a
4 MIN 1 MIN
b c
1 4 5 6 2 1 1 1 MIN
Les valeurs de la fon
tion d'évaluation sont
al
ulées à partir de l'état du jeu
al
ulé pour
ha
un des
hemins possibles. Les valeurs pour les n÷uds internes sont propagées du bas vers le
haut : une fois en prenant le maximum de tous les ls, une autre fois en prenant le max.
% D : profondeur
% MaxMin : Flag pour prendre le min ou le max
minimax(0,Position,MaxMin,Move,Value) :-
value(Position, V),
Value is V*MaxMin. % si fon
tion symetrique
minimax(D,Position,MaxMin,Move,Value) :-
D>0,
setof(M,move(Position,M), Moves),
D1 is D -1,
MinMax is 0-MinMax,
evaluate_and_
hoose(Moves,Position,D1,MinMax,(nil,-1000),(Move,Value)).
update(Move,Value,(Move1,Value1),(Move1,Value1)) :-
Value <= Value1.
update(Move,Value,(Move1,Value1),(Move,Value)) :-
Value > Value1.
En pratique
et algorithme est
outeux en temps, le nombre de solutions augmentant expo-
nentiellement ave
la profondeur de l'arbre. C'est pourquoi, on utilise la te
hnique de AlphaBéta
fondée sur le fait que
ertaines bran
hes
onduisent à des situations pires ou identiques à
elles
déjà étudiées.
28
8.3 L'algorithme alpha-béta
Il n'est pas ne
essaire de
onnaître exa
tement de
ombien la meilleure bran
he l'est. Il sut de
savoir que
'est la meilleur. Pour reprendre le pré
édent exemple, on par
ourt l'arbre : a,b,d, les
su
esseurs de d. La valeur de d est don
4. On redes
end en e. Pour le premier su
esseur de e,
on trouve une valeur de 5. On en déduit don
que quelque soit la valeur des autres su
esseurs
de e, la valeur de e sera au moins égal à 5, don
sera supérieure à 4. Don
pour prendre le
minimum des su
esseurs de b, on peut s'arreter au premier su
esseur de e. La valeur de e est
approximée, elle est même fausse, mais
ela n'aura pas d'inuen
e au niveau supérieur.
De la même manière, seul le premier su
esseur de
est évalué.
Cette idée est formalisée en introduisant 2 bornes : alpha et beta aux valeurs de remontée
dans l'arbre. alpha est la valeur minimale que MAX est sûr d'atteindre (en fon
tion des sous-
arbres déjà par
ourus). beta est la valeur maximale que MAX peut espérer atteindre. Du point
de vue de MIN, beta est la plus mauvaise valeur pour MIN que MIN est sûr d'atteindre.
La valeur à trouver est
omprise entre alpha et beta. Si une position a une valeur qui est
en dehors de l'intervalle, il n'est pas ne
essaire de la
al
uler exa
tement. Si la valeur est dans
l'intervalle, il faut la
al
uler exa
tement.
% D : profondeur
% MaxMin : Flag pour prendre le min ou le max
evaluate_and_
hoose([Move|Moves℄,Position,D,Alpha,Beta,Move1,BestMove) :-
move(Move,Position, Position1),
alphabeta(D,Position1,Alpha,Beta,MoveX,Value),
Value1 is 0 - Value,
utoff(Move,Value1,D,Alpha,Beta,Moves,Position,Move1,BestMove).
evaluate_and_
hoose([℄,Position,D,Alpha,Beta,Move,(Move,Alpha)).
alphabeta(0,Position,Alpha,Beta,Move,Value) :-
value(Position, Value).
alphabeta(D,Position,Alpha,Beta,Move,Value) :-
setof(M,move(Position,M), Moves),
Alpha1 is 0 -Beta,
Beta1 is 0 -Alpha,
D1 is D -1,
evaluate_and_
hoose(Moves,Position,D1,Alpha1,Beta1,nil,(Move,Value)).
utoff(Move,Value,D,Alpha,Beta,Moves,Position,Move1,(Move,Value)) :-
Value >= Beta.
utoff(Move,Value,D,Alpha,Beta,Moves,Position,Move1,BestMove) :-
Alpha < Value, Value < Beta,
evaluate_and_
hoose(Moves,Position,D,Value,Beta,Move,BestMove).
utoff(Move,Value,D,Alpha,Beta,Moves,Position,Move1,BestMove) :-
Value <= Alpha,
evaluate_and_
hoose(Moves,Position,D,Alpha,Beta,Move1,BestMove).
Le prédi
at
uto soit arrete l'exploration de la bran
he
ourante, soit
ontinue l'exploration
mettant à jour la valeur d'alpha et du meilleur mouvement
ourant, selon
e qui est approprié.
29
8.4 Le morpion
À titre d'exemple nous proposons l'étude du ti
-ta
-toe version simpliée du morpion jeu bien
onnu des ly
éens. Le ti
-ta
-toe se joue à deux joueurs sur un damier 3x3. Le but étant d'aligner
3 pions de sa
ouleur symbolisée par X et O. Au départ le trait est à X. La partie se termine soit
lorsque les 9
oups ont été joués, soit s'il y a un gagnant.
Grâ
e à la pro
édure d'alpha-béta on
onstate qu'au niveau 1 de la gure ??, seuls les
as A,
B et C sont distin
ts, les six autres
as peuvent être obtenus par rotation de B ou C. De A on
aboutit à trois
as distin
ts, de B ou C
inq
oups diérents peuvent être joués par O. Ce qui
réduit l'arbre de 9! (soit 362880) noeuds en théorie à (2+5+5)*7! (soit 60480). Imaginons une
autre situation où l'espa
e de re
her
he est valué par une
ertaine fon
tion de
oût,
omme dans
la gure ??.
On suppose, dans
et exemple, que la profondeur d'exploration maximale est xée à trois.
On évalue les situations aux feuilles, et on suppose que l'adversaire utilise la même fon
tion de
oût et que,
e faisant, il
her
he lui aussi à maximiser son gain, don
à minimiser le vtre. Cette
idée est dûe à Os
ar Morgenstern et John Von Neumann (1945).
Si on évalue les gains possibles à partir des quatre
oups jouables A, B, C et D en ae
tant
un
oe
ient négatif pour le joueur Lui, on trouve:
A 3, 5, 7
B 3, 6
C 3
D 9, 9, -1
Il faut alors
hoisir la solution qui
onduit au gain maximum tout en évitant une perte trop
importante. De façon évidente on voit que le
hoix C est moins bon que les
hoix A et B le
plus mauvais s
ore est le même dans les trois
as, mais pas l'espéran
e de gain. La situation D
30
est la plus juteuse, mais aussi la plus risquée. Le programme se doit don
de
onnaître la for
e
de son adversaire, et utiliser des méthodes de la théorie des jeux (se rapporter aux
ours sur les
probas et autres...).
Du fait d'une profondeur d'exploration limitée, l'ordinateur est sujet à l'eet d'horizon, que
l'on peut traduire approximativement par : un
oup peut être optimal à la profondeur n, mais
pas à la profondeur n+k, k>0. De plus
es programmes jouent au
oup par
oup,
'est-à-dire
qu'il re
al
ule des solutions, non seulement entre deux parties, mais aussi entre deux traits. En
fait ils utilisent
e que l'on appelle la for
e brute,
'est-à-dire leur puissan
e de
al
ul, plutt
qu'une quel
onque aptitude à raisonner. Ce type de programmes arrive à battre entre 80% et
90% des joueurs.
Sur des ma
hines plus puissantes, outre les fon
tionnalités pré
édentes, les programmes peu-
vent élaguer l'arbre d'évaluation en élaborant des plans,
omme dans le
as des é
he
s essayer
d'attaquer une piè
e non défendue ou en
ore réaliser une four
hette. Dans
e
as, seules
les bran
hes pertinentes pour l'aboutissement du plan sont évaluées. Ce type de programme
s'apparente alors aux Systèmes Experts.
move((K,M),[N|Ns℄,[N|Ns1℄) :-
K>1, K1 is K-1, move((K1,M), Ns,Ns1).
move((1,N),[N|Ns℄,Ns).
move((1,M),[N|Ns℄,[N1|Ns℄) :- N>M, N1 is N - M.
2. initialisation :
initialize(nim,[1,3,5,7℄,humain).
game_over([℄,Player,Player).
next_player(humain,ordinateur).
next_player(ordinateur,humain).
affi
hage(Position,X) :- write(Position),nl.
announ
e(
omputer) :- write('vous avez gagne...'),nl.
announ
e(humain) :- write('j ai gagne...'),nl.
3. Mouvement du joueur :
hoose_move(Position,humain,Move) :-
writeln(['Please make move'℄,
read(Move).
4. Stratégie pour l'ordinateur : Elle
onsiste à partager les états du jeu en 2
lasses : la
lasse
des états sûrs et
elle des états pas sûrs. Pour
al
uler la
lasse d'un état, on
al
ule la
31
représentation binaire du nombre d'allumettes de
haque tas. La somme de nim est
al
uler
omme suit: on fait la somme modulo 2 de
haque
olonne indépendemment. Si le total
de
haque
olonne est 0, alors la position est sûre. sinon elle n'est pas sûre.
Exemple pour l'initialisation. Les représentations binaires de 1,3,5,7 sont 1, 11, 101, 111.
Il y a 4 1 dans la
olonne de droite, don
la somme vaut 0 mod 2. Pour la
olonne des
2, il y en a 2, don
en
ore 0, pour la
olonne des 4, il y en a aussi 2, don
0 mod 2. La
situation [1,3,5,7℄ est don
sûre.
La stratégie gagnante est de laisser toujours la position sûre. Toute position pas sûre
peut être
onvertie en une position sûre, alors que tout mouvement à partir d'une position
sûre en
rée une pas sûre. La meilleure stratégie est de faire un mouvement arbitraire
lorsque l'on est
onfrontée à une situation sûre en espérant un faux pas de l'adversaire et
de
onvertir des positions pas sûres en position sûres.
Pour mettre en oeuvre
ette stratégie, il faut un algorithme pour
al
uler la somme de nim,
et un autre pour déterminer un mouvement d'une position pas sûre en une position sûre.
Si la position est sûre, alors prendre une allumette du 1er tas et espérer, sinon,
onvertir
la position pas sûre en position sûre.
hoose_move(Ns,ordinateur,Move) :-
unsafe(Ns,Sum),safe_move(Ns,Sum,Move).
hoose_move(Ns,ordinateur,(1,1)) :-
safe(Ns).
5. le prédi at unsafe:
nim_sum([N|Ns℄,Ns,Sum) :-
binary(N,Ds),nim_add(Ds,Bs,Bs1),nim_sum(Ns,Bs1,Sum).
nim_sum([℄,Sum,Sum).
nim_add(Bs,[℄,Bs).
nim_add([℄,Bs,Bs).
nim_add([B|Bs℄,[C|Cs℄,[D,Ds℄) :-
D is (B+C) mod 2,
nim_add(Bs,Cs,Ds).
binary(1,[1℄).
binary(N,[D|Ds℄) :-
N>1, D is N mod 2,
N1 is N / 2,
binary(N1,Ds).
de
imal(Ds,N) :- de
imal(Ds,0,1,N).
de
imal([℄,N,T,N).
de
imal([D|Ds℄,A,T,N) :-
32
A1 is A+D*T,
T1 is T*2,
de
imal(Ds,A1,T1,N).
zero([℄).
zero([0|Zs℄) :- zero(Zs).
safe_move(Piles,NimSum,Move) :-
safe_move(Piles,NimSum,1,Move).
safe_move([Pile|Piles℄,NimSum,K,(K,M)) :-
binary(Pile,Bs),
an_zero(Bs,NimSum,Ds,0), de
imal(Ds,M).
safe_move([Pile|Piles℄,NimSum,K,Move) :-
K1 is K+1,
safe_move(Piles,NimSum,K1,Move).
an_zero([℄,NimSum,[℄,0) :- zero(NimSum).
an_zero([B|Bs℄, [0|NimSum℄,[C|Ds℄,C) :-
an_zero(Bs,NimSum,Ds,C1).
an_zero([B|Bs℄, [1|NimSum℄,[D|Ds℄,C) :-
D is 1 - B*C,
C1 is 1 - B,
an_zero(Bs,NimSum,Ds,C1).
33
9 Utilisation de Prolog
1. lire un programme :
?-
onsult(fi
hier). ave
ou sans extension, dépend des versions
?- [fi
hier℄.
?-
onsult(ListeDeFi
hiers).
?- [fi
hier1,fi
hier2,...℄.
3. ?- help(predi
at).
4. ?- read(Term).
5. ?- write(Term).
6. ?- nl.
7. Debugger :
notra e :
spy(P) : tra
e seulement le prédi
at P, pas de tra
e des prédi
ats appelés en dessous
ou au dessus de P.
nospy(P) :
34