Les%20entr - PowerPoint PPT Presentation

About This Presentation
Title:

Les%20entr

Description:

read/1 admet n'importe quel terme en argument. Il lit un terme au clavier et l'unifie avec son argument. Le terme lu doit tre obligatoirement suivi d'un point. ... – PowerPoint PPT presentation

Number of Views:53
Avg rating:3.0/5.0
Slides: 51
Provided by: H582
Category:
Tags: 20entr | admet | les

less

Transcript and Presenter's Notes

Title: Les%20entr


1
Les 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

2
Affichage
  • 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

3
Lecture
  • 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)

4
Exemple
?- 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
5
Un 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
6
Le 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

7
Autre exemple avec repeat
test - repeat, write(SVP, entrer un
nombre), read(X), (X42).
8
Ouvrir 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.

9
Lire 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.

10
Exemple
  • ecrire(T) -
  • open( test.pl , append, Flux), (ouverture)
  • write(Flux, T), nl(Flux), (écriture)
  • close(Flux).
    (fermeture)

11
Les 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.

12
Les 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.

13
Exemple 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.
14
Exemple (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 .
15
Les 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.

16
Format 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
17
Exemple
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).
18
Construction 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
19
Concaté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
20
Inversion 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
21
Inversion 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).
22
Appartenance à une liste
notre-member(X,XL). notre-member(X,YL) -
notre-member(X,L).
23
Longueur dune liste
notre-length(,0). notre-length(XL,N) -
notre-length(L,NN), N is NN1.
24
Insertion 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
25
Insertion 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!
26
Retrait dans une liste
notre-delete(R,RL,L). notre-delete(R,XLL,
XL) - notre-delete(R,LL,L).
27
Retrait 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?
28
Intersection 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 ).

29
Tri 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,
,,).
30
Opé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).

31
Les 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.

32
Les 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).
33
Inversion 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
34
Inversion 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
35
Repré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)))

36
Représentation en arbre
  • Exemples

.
.
.
gateau
X
Y
.
fruit
glace
nil
37
Proprié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

38
Proprié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.

39
Pré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).

40
Accè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.

41
Accè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.

42
Utilisation 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

43
Exemple du fermier
etat(Fermier,Renard,Poule,Blé). initial(etat(g
auche, gauche, gauche, gauche)). final(etat(droi
te, droite, droite, droite)).
44
Exemple 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).
45
Exemple 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).
46
Exemple 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.
47
Le 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.
48
Exemple
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).
49
Exemple
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).
50
Exemple
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)).
Write a Comment
User Comments (0)
About PowerShow.com