Académique Documents
Professionnel Documents
Culture Documents
: Gestions
des entrées-sorties et
des listes
Juin 2019
Table des
matières
I - Objectifs 3
II - I. Entrées / sorties 4
III - Listes 7
6. Exercice ....................................................................................................................................... 11
3
I. Entrées / sorties
I. Entrées / sorties
I
1. Entrées et sorties
1. Présentation
Exemple : Affichage
writef("ceci %t l'%s %t n et j'affiche X=%t",[est,"exemple numero",45,'toto']).
Cela affiche :
ceci est l'exemple numero 45 n et j'affiche X=toto
4
I. Entrées / sorties
5
I. Entrées / sorties
2. Exercice : Question 1
Écrire un programme qui lit deux nombres et calcule leur somme.
Ci-dessous un exemple d'exécution.
Exemple d'exécution
Un extrait de code que vous pouvez améliorer :
la_somme(X,Y,S):-write('Donner le premier nombre'),nl,read(X), write('Donner le deuxieme nombre'),
nl,read(Y),S is X+Y, write('La somme de '),write(X),write(' et de '), write(Y), write(' est '),write(S).
3. Exercice : Question 2
Écrire un programme qui retourne les nombres pairs d'une liste.
6
Listes
Listes
II
1. Présentation des listes
1. Présentation
La liste (séquence ordonnée d'éléments de longueur variable) est la principale structure en Prolog.
Les éléments peuvent être des constantes (atomes ou nombres) ou des termes composés. Pour
l'interpréteur Prolog, la liste peut être :
- une liste vide notée [] ou .() ;
- une liste composée d'un élément de tête et d'un reste comprenant la liste sans le premier élément ;
cette idée se note [T|R].
Les éléments d'une liste sont séparés (comme les arguments) par une virgule « , ».
Exemple de liste
Définition
Une liste est un terme composé de foncteur ".'' et d'arité 2 :
le 1er argument est l'élément de tête de la liste ou les premiers éléments de la liste,
le 2ème argument est la queue ou le reste des éléments de la liste.
La liste vide est notée "[]''.
2. Notation
La notation simplifiée:
.(terme1,.(terme2,.(termen,.(...,liste),...) équivaut à [terme1 , terme2, ... , termen | liste ]
Remarque
Noter la présence d'un "." dans la notation .(Tete , Queue).
Exemple
.(a, .(b, .(c, [])))
7
Listes
Algorithme :
- Si L est vide, alors S=0
- Sinon S=la tête de L + la somme des éléments de la queue de L.
Programme :
somme([], 0).
somme([Tete|Queue], S) :- somme(Queue, SQ), S is Tete + SQ.
8
Listes
Exemple de requête:
?- somme([1,2,3],Som).
Programme :
lwrite(L) :-write('('),lwrite2(L),write(')'), nl.
lwrite2([]) :-write().
lwrite2([Tete|[]]) :-write(Tete). % la queue est vide
lwrite2([Tete|Queue]) :-write(Tete),write(', '),lwrite2(Queue).
Exemple de requête :
?- lwrite([]).
()
?- lwrite([1,2,3]).
(1, 2, 3)
Analyse
- Un élément X fait partie d'une liste L s'il est la tête de liste in(X, [X|_]) ;
- sinon il faut le chercher en queue de liste in(X, [_|Queue] :- in(X, Queue).
Programme:
in(X, [X|_]).
in(X, [_|Queue] :- in(X, Queue).
Exemple de requête:
?-in(5,[3,4,5]).
Yes
?-in(2,[3,4,5]).
No
Analyse
- Une liste vide a pour longueur 0 :
longueur([], 0).
- Si non c'est la longueur de queue de la liste +1 :
longueur([_|Queue], Lg) :- longueur(Queue, Lg1), Lg is Lg1 + 1.
Programme :
longueur([], 0).
longueur([_|Queue], Lg) :- longueur(Queue, Lg1), Lg is Lg1 + 1.
9
Listes
Analyse
- Deux listes sont égales si leurs têtes sont égales ainsi que leurs queues.
Programme :
egal(L1, L2) :-L1 = L2.
/*ou*/
egal(L, L).
Exemples de requête :
?- egal([1,2,3],[1,2,3,4]).
No
?- egal([1,2,3],[1,2,3]).
Yes
Analyse
- Si L1 est vide, la liste est L2 :
conc([], L2, L2).
- Si L2 est vide, la liste est L1 :
conc(L1, [], L1).
- Si L1 est non vide, on place la tête de L1 en début de la liste résultat L, et on reprend le traitement
avec les queues de ces deux listes.
conc([Tete|Queue1], L2, [Tete|Queue]) :-conc(Queue1, L2, Queue).
Programme :
conc([], L2, L2).
conc(L1, [], L1).
conc([Tete|Queue1], L2, [Tete|Queue]) :-conc(Queue1, L2, Queue).
Exemple de requête :
?- con([1,2,3],[4,5] ;L).
L=[1,2,3,4,5]
Yes
Prédicats prédéfinis
10
Listes
¨Prédicats prédéfinis
3. Exercice : Question 1
[Solution n°1 p 12]
Exercice
Quelle est la tête de la liste suivante : [[le,chat],mange,S] ?
Exercice : Question 2
Quelle est la queue de la liste suivante :[le,chat,mange,[S]] ?
4. Exercice : Question 3
Ecrire un prédicat permettant de faire la somme des éléments de deux listes. Ex [1, 2, 5] + [3, 4, 5] = 20
Voir exemple du cours pour indice.
5. Exercice : Question 4
Ecrire unprogramme pour afficher les éléments d'une liste ? Testez votre code sur la liste contenant les
nombres 5, 10, 15 et 20 dans cet ordre.
Extrait de code :
afficher_liste([X|L]) :- writeln(X), afficher_liste(L).
6. Exercice
Ecrire un programme pour afficher les éléments d'une liste ? Testez votre code sur la liste contenant les
nombres 5, 10, 15 et 20 et le nombre 15.
Extrait de code :
appartient_a(X,[X|_]).
appartient_a(X,[_|L]) :- appartient_a(X,L).
11
Ressources annexes
Exercice
[le,chat]
Question 2
[chat,mange,[S]]
12