Vous êtes sur la page 1sur 12

Leçon 4 

: Gestions
des entrées-sorties et
des listes

Université Virtuelle de Côte d'Ivoire

Juin 2019
Table des
matières

I - Objectifs 3

II - I. Entrées / sorties 4

1. Entrées et sorties .......................................................................................................................... 4

2. Exercice : Question 1 ..................................................................................................................... 6

3. Exercice : Question 2 ..................................................................................................................... 6

III - Listes 7

1. Présentation des listes .................................................................................................................. 7

2. Prédicats de manipulation de listes .............................................................................................. 8

3. Exercice : Question 1 ................................................................................................................... 11

4. Exercice : Question 3 ................................................................................................................... 11

5. Exercice : Question 4 ................................................................................................................... 11

6. Exercice ....................................................................................................................................... 11

IV - Solutions des exercices 12


Objectifs

À la fin de cette leçon, l'apprenant sera capable de :


o Présenter les opérations d'entrée-sortie ;
o Présenter la notion de liste ;
o Utiliser les entrée-sorties et les listes dans un programme.

3
I. Entrées / sorties

I. Entrées / sorties
I
1. Entrées et sorties
1. Présentation

Le Prolog standard ne connaît que l'ASCII. Les entrées/sorties sont primitives.

2. Les caractères de contrôle

\n : Saut de ligne


\t : Tabulation horizontale
\v : Tabulation verticale
\% : Affiche %
\a : bip
\r : Retour au début de la ligne
\\ : Caractère \
\f : Form feed

Exemple : Exemple d'utilisation


write('toto'),write('\n'),write('tata').
?- write("toto").
Affiche les codes ASCI de t, o, t et o :
[116, 111, 116, 111]

3. Les formats de conversion

%t : Affichage d'un terme


%n : Affichage d'un code ASCII
%s : Affichage d'une chaîne de caractères

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. Lire et écrire des caractères

Le tableau ci-dessous présente des prédicats de lecture et d'écriture de caractères.

4
I. Entrées / sorties

Prédicats de lecture et d'écriture de caractères

5. Lire et écrire des termes

Le terme est terminé par un point (.).

Prédicats de lecture et d'écriture de termes

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 « , ».

A partir de chaque élément, on peut accéder au suivant et éventuellement au précédent.

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 syntaxe de notation de la liste non vide est :


.(Tete , Queue) ou [ Tete | Queue ]

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

Représentation d'une liste

3. Opérateur pipe ( "|")

L'opérateur pipe ( "|") permet d'extraire la tête et la queue.


bgt?- [a, b] = [X | Y].
X = a, Y = [b]
?- [a] = [X | Y].
X = a, Y = []
?- [a, [b]] = [X | Y].
X = a, Y = [[b]]
?- [a, b, c, d] = [X, Y | Z].
X =4k,jsxlm a, Y = b, Z = [c, d]
?- [[a, b, c], d, e] = [X | Y].
X = [a, b, c], Y = [d, e]

Exemple : Notations équivalentes pour les listes Prolog


'.'(a,'.'(b,'.'(c,[]))) équivaut aux notations suivantes:
- [a|[b|[c|[]]]]
- [a|[b|[c]]]
- [a|[b,c|[]]]
- [a|[b,c]]
- [a,b|[c|[]]]
- [a,b|[c]]
- [a,b,c|[]]
- [a,b,c]

2. Prédicats de manipulation de listes


Somme des éléments d'une liste de nombres : Prédicat somme (L, S)

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).

Affichage d'une liste avec parenthèses : Prédicat lwrite(L)

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)

Appartenance : Prédicat in(X, L)

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

Longueur d'une liste : Prédicat longueur(L, Lg).

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

Egalité de deux listes : Prédicat egal(L1, L2)

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

Concaténation de deux listes : Prédicat conc(L1, L2, L)

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

Tableau de 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

Solutions des exercices

> Solution n°1 Exercice p. 11

Exercice
[le,chat]

Question 2
[chat,mange,[S]]

12

Vous aimerez peut-être aussi