Académique Documents
Professionnel Documents
Culture Documents
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
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
:
t
h
P N ...
ir g N
y
p
o
C
1
P ( N1 ... N p )
( N1 ... N p ) P
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
r
P
h
P
ir g
y
p
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
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
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
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
e
p
ip
l
i
h
P
a
e
t
h
ig
o
C
r
y
p
J
:
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
x
u
a
e
p
ip
l
i
h
P
a
e
r
P
t
h
ig
o
C
r
y
p
J
:
r
P
e
p
ip
l
i
h
P
a
e
t
h
ig
o
C
r
y
p
J
:
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
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
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
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
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
:
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
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
e
p
ip
r
P
l
i
h
P
a
e
J
:
t
h
ig
o
C
r
y
p
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
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
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
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
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
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
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
o
C
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
e
p
ip
r
P
l
i
h
P
a
e
t
h
ig
o
C
r
y
p
J
:
x
u
a
e
p
ip
r
P
l
i
h
P
x
u
a
e
p
ip
r
P
l
i
h
P
troispieces.pl
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
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
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
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
:
o
C
3 ?- trajet(paris,pekin,L,[paris])
trajet(paris,pekin,L,[paris],N)
ou
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
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
e
p
ip
r
P
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
e
p
ip
r
P
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
e
p
ip
r
P
a
e
t
h
ig
J
:
l
i
h
P
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
e
p
ip
r
P
a
e
t
h
ig
l
i
h
P
J
:
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
e
p
ip
a
e
t
h
ig
J
:
o
C
Yes
r
y
p
l
i
h
P
r
P