Vous êtes sur la page 1sur 53

x

PROLOG (Programmation logique) u


a

r
P
e
p
p
i
l
i
h
P
n
a
e
J
:
t
h
ir g
y
p
o
C

Prolog

x
u
a
Le langage de programmation logique Prolog

r
applique la mthode de rsolution des
clauses
P
de Horn.
e
p
Un programme Prolog est unliensemble
de
p
i
clauses dfinies (thorie consistante)
h
Ppar lutilisateur. Ce
Cest un fichier texte saisi
n
a
dernier peut alors interroger
Prolog pour savoir
e
J
si un but en est consquence.
:
t
Pour cela il saisit
une clause ngative. Prolog
h
lui applique
ir gle principe de rsolution : cest la
y
clausepdentre
de la stratgie linaire par
o
entre.
C

Une rgle dans prolog est une clause x


u
a
dfinie : P N1 ... N p

r
P
qui scrit : P : N1 ,..., N p .
e
p
et se lit P aux conditions Nip
,...,
Np
1
l
i
ou, P si N1 ,..., N p.
h

P
n

a
e

Elle est quivalente


J la formule :

:
t
h
P N ...
ir g N
y
p
o
C
1

P ( N1 ... N p )
( N1 ... N p ) P

Dans une rgle P : N1 ,..., N p .


x
u
P est la tte et N1 ,..., N p est la queue.
a

r
P

e
p
Si la queue est vide on parle
dun fait que
p
i
l
i
lon crit :
h
P. -P
n
a
e est constitu de
Un programme JProlog
:
rgles et de tfaits.
h
ir g
y
p
o
C

Exemple :

x
u
a

Essai1.pl

Programme :
r
pere(marc,anne).
P
e
p
pere(pierre,marc).
p
i
l
i
grandpere(X,Z):- pere(X,Y),
pere(Y,Z).
h
P
A la question :
n
a
?- grandpere(X,anne).
e
J
:
Il rpond : X=pierre
Yes
t
h
A la question
ir g :
y
p
?- grandpere(pierre,anne).
o
C : Yes
Il rpond

On peut rajouter loisir de nouvelles


x
u
rgles, comme :
a
aieul(X,Y):- pere(X,Y).
e
p
p
i
aieul(X,Y):- pere(X,Z), aieul(X,Z).
il

r
P

h
P

Attention : lordre dcriture


est ici trs
a
e
J
important !! Il faut
penser la stratgie
:
t
employe par
h le programme !!

ir g
y
p

Pourocette raison Prolog est un langage


C ! Mais il est aussi trs puissant !
difficile

Prolog se prte particulirement bien aux


x
u
a
appels rcursifs. Mais attention lordre

r
dcriture !.
P
e
p
Prendre comme rgle gnrale
: Les
p
i
l
i
rgles non inductives doivent
tant que
h
P inductives.
possible prcder les-rgles
n
a
Pour la mise au point
on utilisera
e
J
:
extensivement
t la commande trace.

h
ig

o
C

r
y
p

On la dit prolog applique tant que


x
possible le principe de rsolution, et au

retourne les unificateurs, en intraction


r
P
avec lutilisateur.
e
p
En gnral il retourne plusieurs
il p rponses.

i
h
P

n
Aprs chaque rponse
:
a
e
J
; donne la suite
(No
signifie
pas
:
dautres) ht
ir g le processus (Yes signifie
[Enter] arrte
y
p
un succs,
et
No
un
chec.)
o
C

Variables anonymes

x
u
a

r
Si lon ne dsire pas que prolog retourne
P
dunificateur, il suffit dutiliserplae variable
p
i
l
anonyme _.
i
h
P
Ex :
n
a
?- pere(_,anne). e
J
:
Yes.
t
h
ir g
y
p
o
C

Autre exemple dutilisation deux_

r
livre(Victor Hugo,Notre dame de P
paris).
e
livre(Edmond Rostand, Cyrano
de
p
p
i
l
Bergerac).
i
h
P
livre(Emile Zola,Hernani).
n
a
auteur(X):- livre(X,_).
e
J
:
t
h
Ou plus simplement
:
g
i
r
y
?- livre(X,_).
p
o
C

Livre.pl

Le ou, le et dans les questions et


x
u
le non.
a

r
On peut entrer plusieurs questions
P
e
spares par ; (correspondant
ou) ou
p
p
i
l
par , (correspondant et).
i
h
P
Exemple :
n
a
?- pere(pierre,X),pere(X,Y).
e
J
:
Ou bien :
t
h
ir g
?- pere(pierre,X);pere(X,Y).
y
p le mme comportement.
Nontopas
C
not(predicat) russit si predicat choue.

Essai1.pl

Le prdicat prdfini = ux

r
P

Cest lopration dunification. Il retourne yes en


cas de succs, et fournit lunificateur.
Exemple :
?- f(X)=f(pierre).
X=pierre.
Yes.
Attention, il nexiste pas daffectation en prolog.
Lunification en gnralise certains aspects,
mais pas tous :
?- X=X+1.
renvoie no

e
p
ip

l
i
h
P

a
e

t
h
ig

o
C

r
y
p

J
:

Prdicats, oprateurs, et termes


x
u
prdfinis
a

r
Afin de ne pas se restreindre un moteur
P
e
dinfrence, prolog contient un ensemble
de
p
p
termes, fonctions, oprateurs let
prdicats
i
i
h
prdfinis, lui permettant deffectuer
des calculs,
P
de travailler avec des entres-sorties,
du texte,
n
a
(etc) comme on le
demande gnralement
e
J
un langage de programmation
:
t
h
Certains prdicats
prdfinis ne servent qu
g
i la procdure de preuve (cut,
r
mieux contrler
y
p repeat,.).
fail, o
true,
C

Termes prdfinis

x
u
a

r
Prolog comprend tous les termesP:
e
Les nombres : 0, 2, -1, 0.5, etc
p
p
i
l
i
Les chanes de caractres
: Bonjour
h
P ascii (), etc
tous, etc, les caractres
n
a
Il connat les oprateurs
arithmtiques : +,
e
J
- (unaires et binaires),
*, / , ().
:
t
h
Et la plupart
des
fonctions
mathmatiques
g
i
r tan(), sqrt(), log(), exp(),
: cos(),ysin(),
p
etc
o
C

Pour les employer utiliser le prdicat prdfini :


is :
?- X is 3*(2+1).
X=9
Yes.
is value le terme de droite, avant de tenter
lunification. Il retourne Yes en cas de succs.

x
u
a

e
p
ip

l
i
h
P

a
e

r
P

Le prdicat prdfini =:= value les 2 membres


avant de vrifier sils sont gaux. Sa ngation
est =\=.
?- 4+2 =:= 3*2.
Yes.

t
h
ig

o
C

r
y
p

J
:

Dautres prdicats prdfinis


x
u

r
P

Ne pas confondre = (opration dunification),


avec is (qui value dabord le membre de
droite), et le prdicat == qui neffectue aucune
unification!
?- f(a)==f(a).
Yes.
?- X==f(a).
No.
?- f(X)=f(X).
X=_001
Yes.
== teste si les 2 membres sont syntaxiquement
identiques. Sa ngation est :
\==

e
p
ip

l
i
h
P

a
e

t
h
ig

o
C

r
y
p

J
:

Prdicats prdfinis dentre-sortie


x

u
a

r
Les prdicats : write (et writef la
P C) qui
e
crivent leurs arguments et russissent
p
p
i
l
toujours,
i
h
P
Ex :
n
a
aide :- write(Aidee: ce programme fait ).
J
:
read(X) lit unt terme
sur la console, et tente
h
de lunifier
ir g avec X. Il russit si lunification
y
russit.
p
o
C

Exemple :
x
u
a
iam :- write(Entrez votre nom :), read(X),

r
P
nl,write(votre nom est),tab(1),ewrite(X),nl.

p
ip

l
i
h
nl russit toujours et passe

la
ligne.
P
n
tab(n) russit toujours
et crit n espaces.
a
e
J
:
t
h et get() pour les caractres.
On a aussiig
put()
r
y
p
o
C
Inout.pl

Exemple : Structure de test

x
u
a
La procdure test demande un nombre

r
lutilisateur et teste sa nullit : P
e
p
p
i
l
i
test1:-write(Entrez un nombre
:), read(X), nul1(X).
h
P
nul1(X):- X==0, nl, write(nul).
n
a
e
nul1(X):- X \==0, nl,
write(non nul).
J
:
t
h
ir g
y
p
o
C

Exemple : Structure de test

x
u
a
La procdure test demande un nombre

r
lutilisateur et teste sa nullit : P
e
p
p
i
l
i
test2:-write(Entrez un nombre
:), read(X), nul2(X).
h
P
nul1(X):- X==0, nl, write(nul).
n
a
e
nul1(X):- X \==0, nl,
write(non nul).
J
:
ou bien :
t
h
nul2(X):- rnl,
igX==0 -> write(nul) ; write(non nul).
y
avec loprateur
:
p
o
C
(if) condition
-> (then) action 1 ; (else) action 2.
ifthenelse.pl

Exemple: structure de boucle

x
u
a
Si p(n) est un prdicat toujours vrai (procdure),

r
faire p(i) de i=0,1,,9 :
P
e
p
p
i
l
i
p(N):-write('iteration'),tab(1),write(N),nl.
h
P
boucleP:- N=0, boucle(N).
n
a
e
boucle(N):- N<10,Jp(N), N1 is N+1, boucle(N1).
:
t
h
g
i
r
quon appelle
par :
y
p
o
?-boucleP.
C
Boucle.pl

La coupure

x
u
a
On la vu la question ?- P(X). prolog

r
cherche toutes les solutions X. P
e
Parfois il est intressant voire
p
p
i
l
ncessaire -- darrter sa irecherche
une
h
seule solution, soit quand
P :
n solution.
On na besoin queadune
e
Seule la premire
solution est exacte.
J
:
t
La recherche
de toutes les solutions entrane
h
une boucle
ir g infinie.
y on a la coupure !. Cest un
Pourpcela
o
prdicat
prdfini qui russit toujours.
C

Si T est le terme qui a t mis en


correspondance avec la tte dune rgle dont la
queue contient une coupure qui a russi, alors
aucune autre unification ne sera dans la suite
applique T.

x
u
a

e
p
ip

l
i
h
P

r
P

Exemple :
a(paul).
a(pierre).
Cut.pl
p(X):- a(X), !.
q(X):- a(X).
Dans lappel de p(X), la coupure ayant russi
pour X=paul, alors pour les buts a(X), p(X)
aucune autre valeur de X ne sera cherche.

a
e

t
h
ig

o
C

r
y
p

J
:

Exemple : le calcul de factorielle n.

x
u
a

fact(0,1):- !.
fact(N,R):- integer(N), N1 is N-1,
fact(N1,R1), R is N*R1.

e
p
ip

r
P

l
i
h
Remarque : Ici, sans la coupure
la procdure
P mais tournerait
trouverait la bonne solution,
n
ensuite indfiniment.a(essayer
fact0(3,R) qui est
crit sans le cut.) Je
:
t
h
g
i
r
On appelle
?- fact(3,R).
y
p
on obtient
: R=6.
o
C
Fact.pl

Le prdicat prdfini fail retourne toujours un


chec.
Il est utile par exemple pour rpter une routine
tant que tous les cas nont pas t traits.
Exemple :
pere(pierre,paul).
pere(pierre,andre).
Essai1.pl
pere(pierre,jules).
[]
enfants(X):-pere(X,Y),write(X),tab(1),
write(a pour enfant :),tab(1),
write(Y),nl, fail.
?-enfants(pierre). affichera tous les enfants de
pierre en une seule fois avant de finir par un
chec: No.

x
u
a

e
p
ip

l
i
h
P

a
e

t
h
ig

o
C

r
y
p

J
:

r
P

Encore mieux : le prdicat prdfini


functor(T,F,N) russit si T peut correspondre
un terme fonctionnel ou prdicatif, F au nom de
cette fonction ou prdicat, et N au nombre
darguments.
?- functor(pere(X,Y),F,N).
F=pere, N=2. Yes.

x
u
a

e
p
ip

r
P

l
i
h
P

a
e

J
:

Le prdicat arg(N,T,A) russit si T fonction ou


prdicat, et A est le Nieme argument de T.
?- arg(2,pere(pierre,paul),A).
A=paul, Yes.

t
h
ig

o
C

r
y
p

On considre une base de donne comme


plus haut avec les prdicats pere(x,y), ux
a
grandpere(x,y), fils(x,y),

r
P
Considrons :
e
tout(P):-functor(T,P,2), T, ipp
l
i
write(Le),tab(1),write(P),tab(1),write(de),
h
P
tab(1),arg(2,T,X2),write(X2),
n
a
tab(1), write(est),tab(1),
e
J
arg(1,T,X1),
write(X1),nl, fail.
:
Essai1.pl

t
h
ig

r
On peut
ensuite appeler tout(pere),
y
p
o
tout(fils),
etc et obtenir la liste de toutes
C
les relations paternelles, etc

Prolog et les listes

x
u
a
Pour utiliser pleinement prolog, on ne peut
se

r
passer des listes.
P
e
Dfinition :
p
p
[] est une liste appele la liste vide.
i
l
i
Si t est un terme quelconque,het L est une liste, [t,L]
est la liste ayant pour tte-P
t et pour queue L.
n
En gnral on note [a,b,c]
plutt que
a
e
[a,[b,[c,[] ] ] ]. : J
t
Loprateur fondamental
est [P|Q] qui unifie P
h
ir gde la liste, et Q avec sa queue.
avec la tte
y
[P1,P2,P3|Q]
est la liste dont les 3 premiers
p
o
lments
sont P1, P2, P3, et le reste Q.
C

Pour dterminer si un lment figure dans une liste :


membre(X,[X|_]).
membre(X,[_|L]) :- membre(X,L).

x
u
a

e
p
ip

l
i
h
P

a
e

t
h
ig

o
C

r
y
p

J
:

r
P

Liste.pl

Pour dterminer si un lment figure dans une liste :


membre(X,[X|_]).
membre(X,[_|L]) :- membre(X,L).
Pour placer un lment en tte de liste :
insere(X,L,R) :- R=[X|L].

x
u
a

e
p
ip

l
i
h
P

a
e

t
h
ig

o
C

r
y
p

J
:

r
P

Liste.pl

Pour dterminer si un lment figure dans une liste :


membre(X,[X|_]).
membre(X,[_|L]) :- membre(X,L).
Pour placer un lment en tte de liste :
insere(X,L,R) :- R=[X|L].
Pour placer un lment en queue de liste :

x
u
a

e
p
ip

l
i
h
P

finsere(X,[],[X]).
finsere(X,[Y|Z],R) :- finsere(X,Z,R1), R=[Y|R1].

a
e

t
h
ig

o
C

r
y
p

J
:

r
P

Liste.pl

Pour dterminer si un lment figure dans une liste :


membre(X,[X|_]).
membre(X,[_|L]) :- membre(X,L).
Pour placer un lment en tte de liste :
insere(X,L,R) :- R=[X|L].
Pour placer un lment en queue de liste :

x
u
a

e
p
ip

l
i
h
P

finsere(X,[],[X]).
finsere(X,[Y|Z],R) :- finsere(X,Z,R1), R=[Y|R1].
Pour retourner la longueur dune liste :
card([],0) :- !.
card([T|Q],N) :- card(Q,N1) , N is N1+1.

a
e

t
h
ig

o
C

r
y
p

J
:

r
P

Liste.pl

Pour dterminer si un lment figure dans une liste :


membre(X,[X|_]).
membre(X,[_|L]) :- membre(X,L).
Pour placer un lment en tte de liste :
insere(X,L,R) :- R=[X|L].
Pour placer un lment en queue de liste :

x
u
a

e
p
ip

l
i
h
P

r
P

finsere(X,[],[X]).
finsere(X,[Y|Z],R) :- finsere(X,Z,R1), R=[Y|R1].
Pour retourner la longueur dune liste :
card([],0) :- !.
card([T|Q],N) :- card(Q,N1) , N is N1+1.
Compter le nombre doccurrence dun lment :
occur(X,[],0) :- !.
occur(X,[T|Q],N) :- X==T -> occur(X,Q,N1), N is N1+1,
; occur(X,Q,N1), N is N1.

a
e

t
h
ig

o
C

r
y
p

J
:

Liste.pl

Exemple complet

r
P

x
u
a

Le jeu des 3 pices.


e
p
Un jeu consiste mettre 3 pices
sur la
p
i
l
i
mme face par une suiteh dexactement 3
P chacun
mouvements consistant
n
a
retourner simultanment
2 des 3 pices.
e
J
:
A la questiont jeu(pile,face,pile)
(par
h retournera les 3
exemple)igprolog
r
y
mouvements
effectuer.
p

o
C

% Les 2 faces sont pile et face :


opp(pile,face).
opp(face,pile).

x
u
a

e
p
ip

l
i
h
P

a
e

t
h
ig

o
C

r
y
p

J
:

r
P

x
u
a

% Les 2 faces sont pile et face :


opp(pile,face).
opp(face,pile).

e
p
ip

r
P

% Mouvement accepts X1,Y1,Z1 -> X2,Y2,Z2 :


mouv(X,Y1,Z1,X,Y2,Z2) :- opp(Y1,Y2) , opp(Z1,Z2).
mouv(X1,Y,Z1,X2,Y,Z2) :- opp(X1,X2) , opp(Z1,Z2).
mouv(X1,Y1,Z,X2,Y2,Z) :- opp(X1,X2) , opp(Y1,Y2).

l
i
h
P

a
e

t
h
ig

o
C

r
y
p

J
:

x
u
a

% Les 2 faces sont pile et face :


opp(pile,face).
opp(face,pile).

e
p
ip

r
P

% Mouvement accepts X1,Y1,Z1 -> X2,Y2,Z2 :


mouv(X,Y1,Z1,X,Y2,Z2) :- opp(Y1,Y2) , opp(Z1,Z2).
mouv(X1,Y,Z1,X2,Y,Z2) :- opp(X1,X2) , opp(Z1,Z2).
mouv(X1,Y1,Z,X2,Y2,Z) :- opp(X1,X2) , opp(Y1,Y2).

l
i
h
P

% Affichage de ltat des picesn:


a
affiche(X,Y,Z) :- write(X) ,e
tab(1) , write(Y) , tab(1), write(Z) , nl.
J
:
t
h
ir g
y
p
o
C

x
u
a

% Les 2 faces sont pile et face :


opp(pile,face).
opp(face,pile).

e
p
ip

r
P

% Mouvement accepts X1,Y1,Z1 -> X2,Y2,Z2 :


mouv(X,Y1,Z1,X,Y2,Z2) :- opp(Y1,Y2) , opp(Z1,Z2).
mouv(X1,Y,Z1,X2,Y,Z2) :- opp(X1,X2) , opp(Z1,Z2).
mouv(X1,Y1,Z,X2,Y2,Z) :- opp(X1,X2) , opp(Y1,Y2).

l
i
h
P

troispieces.pl

% Affichage de ltat des picesn:


a
affiche(X,Y,Z) :- write(X) ,e
tab(1) , write(Y) , tab(1), write(Z) , nl.
J
:
t
% prdicat jeu(.,.,.)
appeler pour jouer.
h
jeu(X0,Y0,Z0)ig
:- mouv(X0,Y0,Z0,X1,Y1,Z1) ,
r
mouv(X1,Y1,Z1,X2,Y2,Z2)
, mouv(X2,Y2,Z2,R,R,R),
y
affiche(X0,Y0,Z0)
, affiche(X1,Y1,Z1) , affiche(X2,Y2,Z2),
p
o
affiche(R,R,R).
C

Rsultat :
A lappel de :

x
u
a

?- jeu(pile,face,pile).

e
p
ip

l
i
h
P

Prolog retourne :
pile face pile
pile pile face
pile face pile
pile pile face

r
y
Yes. p
o
C

t
h
ig

J
:

a
e

r
P

Exemple complet

x
u
a

r
P

On dispose dun programme donnant des trajets sens


unique entre diverses villes :
arc(paris,madrid).
arc(moscou,pekin).
arc(paris,reykjavic). arc(paris,moscou).
arc(madrid,moscou). arc(paris,ouagadougou).
arc(boston,paris).
arc(boston,ouagadougou).
arc(boston,reyjkjavic). arc(ouagadougou,pekin).

e
p
ip

l
i
h
P

a
e

J
:

t
h
Ecrire un prdicat
chemin(ville1,ville2,liste) qui retourne
g
i trajet possible de la ville1 la ville2 (si cest
dans liste une
r
y
possible).
p
o
C

x
u
a

Rponse :

chemin(X,Y,[X,Y]) :- arc(X,Y).

e
p
ip

r
P

chemin(X,Y,[X|L]) :- arc(X,Z) , chemin(Z,Y,L).

l
i
1 ?- chemin(paris,pekin,X). Ph
n
X = [paris, madrid, moscou,
pekin] ;
a
e ;
X = [paris, moscou,Jpekin]
:
X = [paris, ouagadougou,
pekin];
t
h
No
ir g
y
p
o
C
Trajet.pl

x
u
a
arc(paris,madrid,10).
arc(moscou,pekin,25).

r
arc(paris,reykjavic,15).
arc(boston,ouagadougou,35).
P
arc(madrid,moscou,25).
arc(boston,paris,30).
e
p
arc(paris,ouagadougou,15). arc(paris,moscou,30).
p
i
l
i
arc(boston,reyjkjavic,20).
arc(ouagadougou,pekin,20).
h
P
n
Ecrire un predicat chemin(ville1,ville2,liste,dist)
qui retourne
a
en plus la longueur du trajet.
e
J
:
t
Comment chercher
tous les trajets possibles issus de Boston
h
de longueur <22
?
g
i
r
y
p
o
C
On se donne de plus les distances reliant les villes :

x
u
a

Rponse :
chemin(X,Y,[X,Y],N) :- arc(X,Y,N).
chemin(X,Y,[X|L],N) :- arc(X,Z,M) ,
chemin(Z,Y,L,P), N is M+P.

e
p
ip

r
P

l
i
h
P

a
e

2 ?- chemin(boston,Y,L,N),N<22.
Y = reyjkjavic
L = [boston, reyjkjavic]
N = 20 ;
No

t
h
ig

o
C

r
y
p

J
:

Trajet.pl

Comment modifier le programme pour que les trajets ne soient plus


sens unique ?

x
u
a

r
P

Rponse :
darc(X,Y) :- arc(X,Y).
darc(X,Y) :- arc(Y,X).
darc(X,Y,N) :- arc(X,Y,N). darc(X,Y,N) :- arc(Y,X,N).
%
trajet(X,Y,[X,Y],_) :- darc(X,Y).
trajet(X,Y,[X|Q],L) :- darc(X,Z) , not(membre(Z,L)),
trajet(Z,Y,Q,[Z|L]).
%
trajet(X,Y,[X,Y],_,N) :- darc(X,Y,N).
trajet(X,Y,[X|Q],L,N) :- darc(X,Z,M) , not(membre(Z,L)),
trajet(Z,Y,Q,[Z|L],P), N is M+P.

e
p
ip

l
i
h
P

a
e

t
h
ig

r
y
p

J
:

Attention : il faut prendre garde appeler trajet par :

o
C

3 ?- trajet(paris,pekin,L,[paris])
trajet(paris,pekin,L,[paris],N)

ou

On peut aussi ajouter les rgles :


path(X,Y,L) :- trajet(X,Y,L,[X]).
path(X,Y,L,N) :- trajet(X,Y,L,[X],N).

x
u
eta
r
P

e
p
p
4 ?- trajet(paris,moscou,X,[paris],N),N<50.
i
l
i
X = [paris, moscou]
N
= 30 ;
h
PN = 35 ;
X = [paris, madrid, moscou]
n
No
a
e
J
:
5 ?- trajet(moscou,paris,X,[moscou],N),N<50.
t
h
X = [moscou,
N = 30 ;
ir g paris]
y
X = [moscou,
madrid, paris] N = 35 ;
p
No o
C

Trajet.pl

Exemple complet

r
P

x
u
a

Le loup, la chvre et le chou.


Un passeur doit faire traverser la rivire laide
dune barque un loup, une chvre et un chou,.
A chaque traverse il ne peut transporter avec
lui que le loup, la chvre ou le chou. Il doit
prendre garde ne pas laisser sur une berge le
loup et la chvre, ou le la chvre et le chou car
le loup mange la chvre et la chvre mange le
chou.
Comment procder ?

e
p
ip

l
i
h
P

a
e

t
h
ig

o
C

r
y
p

J
:

%Ltat du systme est ltat de la berge gauche donn par une liste de 4 boolens : [P,L,V,C]

x
u
a

e
p
ip

l
i
h
P

a
e

t
h
ig

o
C

r
y
p

J
:

r
P

%Ltat du systme est ltat de la berge gauche donn par une liste de 4 boolens : [P,L,V,C]
%Ltat de lautre berge sobtient par :
negatif([X,Y,Z,W],[A,B,C,D]):-A is 1-X,B is 1-Y,C is 1-Z,D is 1-W.

x
u
a

e
p
ip

l
i
h
P

a
e

t
h
ig

o
C

r
y
p

J
:

r
P

%Ltat du systme est ltat de la berge gauche donn par une liste de 4 boolens : [P,L,V,C]
%Ltat de lautre berge sobtient par :
negatif([X,Y,Z,W],[A,B,C,D]):-A is 1-X,B is 1-Y,C is 1-Z,D is 1-W.

x
u
a

% Etat accept dune berge :


acceptable([1|_]).
acceptable([0,B,C,_]):-B==1,C==0.
acceptable([0,B,C,D]):-C==1,B==0,D==0.
acceptable([0,0,0,_]).

e
p
ip

r
P

% Etat accept des 2 berges :


accepte([A,B,C,D]):-acceptable([A,B,C,D]),negatif([A,B,C,D],[X,Y,Z,W]),acceptable([X,Y,Z,W]).

l
i
h
P

a
e

t
h
ig

o
C

r
y
p

J
:

%Ltat du systme est ltat de la berge gauche donn par une liste de 4 boolens : [P,L,V,C]
%Ltat de lautre berge sobtient par :
negatif([X,Y,Z,W],[A,B,C,D]):-A is 1-X,B is 1-Y,C is 1-Z,D is 1-W.

x
u
a

% Etat accept dune berge :


acceptable([1|_]).
acceptable([0,B,C,_]):-B==1,C==0.
acceptable([0,B,C,D]):-C==1,B==0,D==0.
acceptable([0,0,0,_]).

e
p
ip

r
P

% Etat accept des 2 berges :


accepte([A,B,C,D]):-acceptable([A,B,C,D]),negatif([A,B,C,D],[X,Y,Z,W]),acceptable([X,Y,Z,W]).
% passages autoriss :
passage([1,B,C,D],[0,B,C,D]):-accepte([0,B,C,D]).
passage([1,B,C,1],[0,B,C,0]):-accepte([0,B,C,0]).
passage([1,B,1,D],[0,B,0,D]):-accepte([0,B,0,D]).
passage([1,1,C,D],[0,0,C,D]):-accepte([0,0,C,D]).
passage(X,Y):-negatif(X,A),passage(A,Y).

a
e

t
h
ig

o
C

r
y
p

J
:

l
i
h
P

%Ltat du systme est ltat de la berge gauche donn par une liste de 4 boolens : [P,L,V,C]
%Ltat de lautre berge sobtient par :
negatif([X,Y,Z,W],[A,B,C,D]):-A is 1-X,B is 1-Y,C is 1-Z,D is 1-W.

x
u
a

% Etat accept dune berge :


acceptable([1|_]).
acceptable([0,B,C,_]):-B==1,C==0.
acceptable([0,B,C,D]):-C==1,B==0,D==0.
acceptable([0,0,0,_]).

e
p
ip

r
P

% Etat accept des 2 berges :


accepte([A,B,C,D]):-acceptable([A,B,C,D]),negatif([A,B,C,D],[X,Y,Z,W]),acceptable([X,Y,Z,W]).
% passages autoriss :
passage([1,B,C,D],[0,B,C,D]):-accepte([0,B,C,D]).
passage([1,B,C,1],[0,B,C,0]):-accepte([0,B,C,0]).
passage([1,B,1,D],[0,B,0,D]):-accepte([0,B,0,D]).
passage([1,1,C,D],[0,0,C,D]):-accepte([0,0,C,D]).
passage(X,Y):-negatif(X,A),passage(A,Y).

a
e

t
h
ig

J
:

l
i
h
P

% chemin dun tat lautre :


chemin(L,L,Vu):-montre(Vu).
chemin(L1,L2,Vu):-L1=[0,_,_,_],passage(L1,L),negatif(L,N),not(membre(N,Vu)),chemin(N,L2,[N|Vu]).
chemin(L1,L2,Vu):-passage(L1,L),not(membre(L,Vu)),chemin(L,L2,[L|Vu]).

o
C

r
y
p

%Ltat du systme est ltat de la berge gauche donn par une liste de 4 boolens : [P,L,V,C]
%Ltat de lautre berge sobtient par :
negatif([X,Y,Z,W],[A,B,C,D]):-A is 1-X,B is 1-Y,C is 1-Z,D is 1-W.

x
u
a

% Etat accept dune berge :


acceptable([1|_]).
acceptable([0,B,C,_]):-B==1,C==0.
acceptable([0,B,C,D]):-C==1,B==0,D==0.
acceptable([0,0,0,_]).

e
p
ip

r
P

% Etat accept des 2 berges :


accepte([A,B,C,D]):-acceptable([A,B,C,D]),negatif([A,B,C,D],[X,Y,Z,W]),acceptable([X,Y,Z,W]).
% passages autoriss :
passage([1,B,C,D],[0,B,C,D]):-accepte([0,B,C,D]).
passage([1,B,C,1],[0,B,C,0]):-accepte([0,B,C,0]).
passage([1,B,1,D],[0,B,0,D]):-accepte([0,B,0,D]).
passage([1,1,C,D],[0,0,C,D]):-accepte([0,0,C,D]).
passage(X,Y):-negatif(X,A),passage(A,Y).

a
e

t
h
ig

l
i
h
P

J
:

% chemin dun tat lautre :


chemin(L,L,Vu):-montre(Vu).
chemin(L1,L2,Vu):-L1=[0,_,_,_],passage(L1,L),negatif(L,N),not(membre(N,Vu)),chemin(N,L2,[N|Vu]).
chemin(L1,L2,Vu):-passage(L1,L),not(membre(L,Vu)),chemin(L,L2,[L|Vu]).

o
C

r
y
p

% solution obtenus en crant un chemin de ltat initial [1,1,1,1] ltat final [0,0,0,0] :
solution:-chemin([1,1,1,1],[0,0,0,0],[[1,1,1,1]]).
% montre(Vu) : gre l'affichage du rsultat. A crire.

Chevre.pl

A lappel de :

x
u
a

?- solution.
Prolog retourne (dpend de lcriture de montre/1):
rive gauche

rive droite

[1, 1, 1, 1] |~~~~~~~~~| [0, 0, 0, 0]


[0, 1, 0, 1] |~~~~~~~~~| [1, 0, 1, 0]
[1, 1, 0, 1] |~~~~~~~~~| [0, 0, 1, 0]
[0, 1, 0, 0] |~~~~~~~~~| [1, 0, 1, 1]
[1, 1, 1, 0] |~~~~~~~~~| [0, 0, 0, 1]
[0, 0, 1, 0] |~~~~~~~~~| [1, 1, 0, 1]
[1, 0, 1, 0] |~~~~~~~~~| [0, 1, 0, 1]
[0, 0, 0, 0] |~~~~~~~~~| [1, 1, 1, 1]

e
p
ip

a
e

t
h
ig

J
:

Le passeur va droite avec la chvre


Le passeur va gauche tout seul
Le passeur va droite avec le chou
Le passeur va gauche avec la chvre
Le passeur va droite avec le loup
Le passeur va gauche tout seul
Le passeur va droite avec la chvre

o
C

Yes

r
y
p

l
i
h
P

r
P

Vous aimerez peut-être aussi