Title: Les%20entr
1Les entrées-sorties
- Ecriture sur l'écran ou dans un fichier
- Lecture à partir du clavier ou dun fichier
- Affichage de termes
- write(12) affiche 12
- write(X). affiche la valeur courante de X sur le
flot de sortie courant (par défaut l'écran), - nl permet de passer à la ligne suivante.
- writeln(X) - write(X), nl.
- tab tel que tab(N) affiche N espaces
2Affichage
- Affichage de termes (suite)
- display/1 agit comme write/1 mais en affichant la
représentation sous forme darbre - Ex
- write(34), nl, display(34), nl.
- Affiche
- 34
- (3,4)
- YES
3Lecture
- Lecture de termes
- read/1 admet nimporte quel terme en argument.
- Il lit un terme au clavier et lunifie avec son
argument. Le terme lu doit être obligatoirement
suivi dun point. Certains systèmes Prolog
affichent un signe dinvite lorsque le prédicat
read/1 est utilisé. - Exemple
- ?- read(X).
- a(1,2).
- YES X a(1,2)
4Exemple
?- age(teddy, 22). Give the age of teddy
23. No ?- read(abc). 23. No ?- read(X Y). 2
3. X 2 Y 3 Yes
age(X, Y) - write('Give the age of '),
write(X), write(' '), read(Y). ?- age(teddy,
Z). Give the age of teddy 22. Z 22 Yes
5Un autre exemple
- lire des expressions arithmétiques, les évaluer
et les imprimer jusqu'à ce que lutilisateur
rentre fin au clavier.
calculateur - repeat, boucle
read(X), lecture expression
eval(X,Y), évaluation write(Y),
nl, affichage Y fin, !.
condition d'arrêt eval(fin, fin) - !.
cas particulier eval(X, Y) - Y is X.
calcul dexpressions
6Le repeat
- Le predicat repeat laisse toujours un point de
choix derrière lui. - repeat.
- repeat - repeat.
-
- Exemple dutilisation
- ?- calculateur.
- 23 .
- 5
- 324 -1.
- 10
- fin.
- fin
- YES
7Autre exemple avec repeat
test - repeat, write(SVP, entrer un
nombre), read(X), (X42).
8Ouvrir un fichier
- En écriture
- mode write son contenu est effacé avant que
Prolog y écrive. - mode append Prolog écrira à partir de la fin du
fichier. - Ouverture dun fichier prédicat open/3
- argument 1 nom du fichier
- argument 2 mode douverture write, append ou
read - argument 3 variable qui va recevoir un
identificateur de fichier appelé flux ou stream.
9Lire et écrire
- Tous les prédicats read, write et autres vus
auparavant admettent un second argument le flux
identifiant le fichier. - Ex write(Flux, X). où Flux est un
identificateur de fichier - Ex read(Flux,X), get(Flux, X), get0(Flux,X)
- Fermeture du fichier prédicat close/1 qui prend
en argument le flux associé au fichier.
10Exemple
-
- ecrire(T) -
- open( test.pl , append, Flux), (ouverture)
- write(Flux, T), nl(Flux), (écriture)
- close(Flux).
(fermeture)
11Les flots dentrée et de sortie
- see(Filename), le fichier est lentrée courante.
- seen. La console redevient lentrée courante.
- tell(Filename), le fichier est la sortie
courante. - told. La console redevient la sortie courante.
12Les caractères
- put(CodeASCII) imprime le caractère
correspondant au code ASCII. - get0(Code) unifie la variable avec le code
ASCII du caractère entré. - get(Code) même chose que get0, mais saute
par-dessus les espaces.
13Exemple interactif
capitale(ontario,toronto). capitale(quebec,quebec)
. capitale(cb,victoria). capitale(alberta,edmonton
). capitale(terre-neuve,st-jean). capitale(nouvell
e-ecosse,halifax). capitale(saskatchewan,regina).
capitale(manitoba,winnipeg). capitale(nouveau-brun
swick,fredericton). capitale(ipe,charlottetown). s
tart-write('Les Capitales du Canada'),nl,demander
. demander-write('Province? '),read(Province),rep
onse(Province). reponse(stop)-write('merci'),nl.
reponse(Province)-capitale(Province,Ville),write(
'la capitale de '),
write(Province),write(' est '),write(Ville),nl,nl,
demander.
14Exemple (suite)
?- start. Les Capitales du Canada Province?
ontario. la capitale de ontario est
toronto Province? cb. la capitale de cb est
victoria Province? stop. merci true .
15Les Listes
- Comme en programmation fonctionnelle, la liste
est une structure de donnée de base - 1, 2, 3, 4
- la liste vide
- Head Tail la tete et le reste de la liste
- 1, 2, "trois" une liste de 3 éléments
- 1, 2 Tail une liste dau moins deux éléments.
16Format Tête et Queue
?- T Q 1, 2, 3, 4. T 1, Q 2,3,4 ?- 1
2,3,4 L. L 1,2,3,4 ?- 1,2,3 4
L. L 1,2,3,4 ?- T Q 1. T 1, Q ?-
T Q . no
17Exemple
Lire des caractères en créant une liste, jusquà
la fin dune ligne (code 10)
readline(Line) - get0(Ch), readline(Ch,
Line). readline(10, ). readline(Ch, Ch
RestOfLine) - Ch \ 10, get0(NextCh),
readline(NextCh, RestOfLine).
18Construction de listes
cons(X, Y, XY). ?- cons(1, 2,3,4, L). L
1,2,3,4 ?- cons(X, Y, 1,2,3,4). X 1, Y
2,3,4 ?- cons(1, 2,3,4, 1,2,3,4). yes
19Concaténation de listes
notre-append(,Y,Y). notre-append(AB,Y,AW)
- notre-append(B,Y,W). ?- notre-append(1,2,
3,4, L). L 1,2,3,4 ?- notre-append(X, 3,4,
1,2,3,4). X 1,2 ?- notre-append(1,2,
3,4, 1,2,3,4). yes
20Inversion de listes, version 1
notre-reverse(,). notre-reverse(HT,L) -
notre-reverse(T,LL), notre-append(LL,H,L).
?- notre-reverse(1,2,3,4,L). L 4,3,2,1 ?-
notre-reverse(L,1,2,3,4). L 4,3,2,1
21Inversion de listes, version 2
renverser(,L,L)-!. renverser(HT,L,R)-
renverser(T,HL,R). notre-reverse(HT,L,R)
- renverser(L,,R).
Sans la coupe, il y aurait une boucle infinie
après la première solution de ?-
notre-reverse(L,1,2,3,4).
22Appartenance à une liste
notre-member(X,XL). notre-member(X,YL) -
notre-member(X,L).
23Longueur dune liste
notre-length(,0). notre-length(XL,N) -
notre-length(L,NN), N is NN1.
24Insertion dans une liste
notre-insert(A,L,AL). notre-insert(A,XL,
XLL) - notre-insert(A,L,LL). ?- insert(c,
a, b, L). L c, a, b L a, c, b L
a, b, c no
25Insertion dans une liste
?- insert(a, L, b, a, d, a, f). L b, d, a,
f L b, a, d, f no Linsertion et le
retrait sont 2 concepts complémentaires!
26Retrait dans une liste
notre-delete(R,RL,L). notre-delete(R,XLL,
XL) - notre-delete(R,LL,L).
27Retrait dans une liste
deleteall(X,,). deleteall(X,XT,Result) -
deleteall(X,T,Result),!. deleteall(X,HT,H
Result) - deleteall(X,T,Result). ?-
deleteall(2,1,2,4,3,2,6,2,2,L). L 1, 4, 3,
6.
Quarrive-t-il si on retire la coupe?
28Intersection entre listes
- intersection( , Ys, ).
- intersection( X Xs , Ys, Zs ) -
- not member( X, Ys),
- intersection( Xs, Ys, Zs ).
- intersection( X Xs , Ys, X Zs ) -
- member( X, Ys ),
- intersection( Xs, Ys, Zs ).
29Tri dune liste
tri(,). tri(PQ,T) - partition(P,Q,G,D),
tri(G,GG), tri(D,DD), append(GG,PDD,T). parti
tion(P,XL,XPG,PD) - X lt P,
partition(P,L,PG,PD). partition(P,XL,PG,XPD)
- X gt P,
partition(P,L,PG,PD). partition(P,
,,).
30Opérations répétitives
- Effectuer un traitement sur les éléments de
listes - traite-liste(,).
- traite-liste(XL,YT) - traite(X,Y),
traite-liste(L,T). - somme(L,S) - somme(L,0,S).
- somme(XL,T,S) - TT is TX, somme(L,TT,S).
- somme(,S,S).
31Les nombres premiers
- Générer tous les nombres premiers de 1 à N
- Crible d'Ératosthène
- Générer tous les entiers de 2 à N
- Supprimer tous les multiples de 2, de 3, de 4,
etc. jusquà ce que le carré du plus petit entier
soit plus grand que le plus grand entier.
32Les nombres premiers
genereListe(0,). genereListe(N,NXs)- N gt
0, N1 is N-1,genereListe(N1,Xs
). retireMultiple(X,,). retireMultiple(X,TQ
,Resultat) - TgtX, T mod X 0,
retireMultiple(X,Q,Resultat),!. retireMultiple(X,
TQ,TResultat) - retireMultiple(X,Q,Resul
tat). retireTousLesMultiples(N,,). retireTous
LesMultiples(1,L,L). retireTousLesMultiples(N,Li,L
)- Ngt1, retireMultiple(N,Li,LL),
N1 is N-1, retireTousLesMultiples(N1,LL,L). p
remiers(N,L)- genereListe(N,Li),
retireTousLesMultiples(N,Li,L).
33Inversion dune liste (double récursion)
mirror( , ). mirror(XL1, L2)
-mirror(L1,L3), append(L3, X, L2). append
will dig into the list a second time
34Inversion dune liste (avec accumulateur)
mirror2(Left, Right) - invert(Left, ,
Right). invert(XL1, L2, L3) - the
list is 'poured' invert(L1, XL2,
L3). into the second argument invert( , L,
L). at the deepest level, the result L is
merely copied
35Représentation des Listes
- Les listes peuvent être représentée avec le
symbole fonctionnel binaire . - suite e1, e2, gt liste (e1.(e2.()))
- La liste vide est notée nil . Elle sert
souvent à marquer la fin de liste. - Exemples
- suite des variables X et Y gt (X.Y)
- suite gateau, fruit, glace gt(gateau.(fruit.(gla
ce.nil)))
36Représentation en arbre
.
.
.
gateau
X
Y
.
fruit
glace
nil
37Propriété fondamentale
- Une liste correspond au cas particulier ou les
branches gauches sont toujours des feuilles. - On utilise le terme de peigne pour les désigner.
- Exercice
- résoudre l'équation X.Y gateau.fruit.glace.nil
- par identification on a la solution
- X gateau Y fruit.glace.nil
38Propriété fondamentale (2)
- La notation X.Y représente une liste dont la tête
(le 1er élément) est X et la queue (le reste de
la liste) est Y. - Cela constitue la base de lutilisation des
listes dans les programmes Prolog. - Attention le terme X.Y nest pas une liste mais
plutôt une paire.
39Prédicats avec nombre de paramètres variables
- Les villes d'une province
- province(ontario,toronto,ottawa,hamilton,kitchener
,london). - province(quebec,montreal,quebec_city,sherbrooke,tr
ois_rivieres). - province(new_brunswick,saint_john,moncton,frederic
ton). - Il faut plutôt utiliser une liste (province/2)
- province(quebec, montreal.( quebec_city
.(sherbrooke .(trois_rivieres.nil)))). - province(new_brunswick, saint_john .(moncton
.(fredericton.nil))). - province(ontario, toronto.ottawa.hamilton.kitchene
r.london.nil).
40Accès aux éléments dune liste(1)
- En pratique, on représente une liste avec les '
' - montreal .(quebec_city .(sherbrooke
.(trois_rivieres. nil))) - est représentée par
- montreal, quebec_city, sherbrooke,
trois_rivieres - Pour avoir accés aux différents paramètres
- on utilise le ''.
- On a donc tetequeue.
41Accès aux éléments dune liste(2)
- Ainsi, on peut écrire
- saint_john,moncton,fredericton qui est
equivalent a - saint_john moncton,fredericton qui est
equivalent a - saint_john moncton fredericton qui est
equivalent a - saint_john moncton fredericton ou
encore - saint_john, moncton fredericton ou
- saint_john, moncton, fredericton
- De manière générale
- x queue une liste dau moins un élément.
- x, y queue une liste dau moins deux éléments.
42Utilisation de member
- Regle inProvince/2 qui retourne la province dans
laquelle se trouve une ville X - inProvince(X,P) - province(P, L),
- member(X, L).
- ?- inProvince(ottawa, P).
- P ontario
- No
- ?- inProvince(V, new_brunswick).
- C saint_john
- C moncton
- C fredericton
- No
43Exemple du fermier
etat(Fermier,Renard,Poule,Blé). initial(etat(g
auche, gauche, gauche, gauche)). final(etat(droi
te, droite, droite, droite)).
44Exemple du fermier
traverse(etat(gauche,X,Y,Z),etat(droite,X,Y,Z)
, fermier_traverse). traverse(etat(droite,X,Y,Z)
,etat(gauche,X,Y,Z), fermier_revient). traverse
(etat(gauche,X,gauche,Z),etat(droite,X,droite,Z
), fermier_amene_poule). traverse(etat(droite,X,
droite,Z),etat(gauche,X,gauche,Z),
fermier_ramene_poule). traverse(etat(gauche,
gauche, X, Y),etat(droite, droite, X, Y),
fermier_amene_renard). traverse(etat(droite,
droite, X, Y),etat(gauche, gauche, X, Y),
fermier_ramene_renard). traverse(etat(gauche,
X, Y, gauche),etat(droite, X, Y, droite),
fermier_amene_ble). traverse(etat(droite, X, Y,
droite),etat(gauche, X, Y, gauche),
fermier_ramene_ble).
45Exemple du fermier
interdit(etat(X, Y, Y, _)) - X \
Y. interdit(etat(X, _, Y, Y)) - X \
Y. riviere(P) - initial(Depart),
final(Arrivee), riviere_aux(Depart, Arrivee,
Depart, P).
46Exemple du fermier
riviere_aux(A,A,_,). V sont les états déjà
visitées riviere_aux(A, B,V, P) -
traverse(A,C,Action), not(interdit(C)),
not(member(C,V)), riviere_aux(C,B,CV,Plan),
P Action Plan.
47Le prédicat setof
aime(jean,pomme). aime(marie,poire). ?-
setof(X,Y,aime(X,Y),L). Ljean,pomme,marie,p
oire.
age(pierre,5). age(paul,7). age(henri,5). ?-
setof(C,age(C,5),L). Lhenri,pierre.
bagof est similaire, sauf quil nélimine pas les
répétitions et ne tri pas les éléments.
48Exemple
bag(2,4,1). bag(3,5,2). bag(7,8,2). bag(4,3,1). ba
g(5,2,4). bag(2,1,4). bag(2,2,4). bag(7,3,5). bag(
7,3,3).
bagof(Z,bag(X,Y,Z),B). bagof(Z,(bag(X,Y,Z),Zgt2
),B). bagof(Z,Xbag(X,Y,X),B).
setof(Z,Xbag(X,Y,X),B). bagof(Z,XYbag(X,Y,X),
B). findall(Z,bag(X,Y,X),B).
49Exemple
connait(vincent,david). connait(vincent,antoine).
connait(vincent,alex). connait(melodie,alex). conn
ait(melodie,patrick). connait(patrick,melodie). co
nnait(patrick,ahmed). connait(patrick,eddie). conn
ait(patrick,david).
setof(X,connait(X,Y),B). setof(Y,connait(X,Y),
B). setof(Y,Xconnait(X,Y),B).
bagof(Y,Xconnait(X,Y),B). setof(X,Y,connait(X
,Y),B).
50Exemple
age(vincent,8). age(melodie,4). age(patrick,3). ag
e(ahmed,7). age(eddie,4). setof(A,Nage(N,A),B).
setof(A,Nage(N,A),TQ).
setof(A,Nage(N,A),T_). setof(A,N,age(N,A),
_,J_). age(P,A1),\((age(_,A2),A2ltA1)).