Académique Documents
Professionnel Documents
Culture Documents
Programmation
Logique
Enseignant: Arous Mokdad
Niveau: 3eme Année Informatique
2016/2017
Les Listes et l'Opérateur de
Coupure en Prolog
1. Les Listes
La liste est un terme composé particulier de symbole
de fonction " . " et d'arité 2:
?- [a | [b, c] ] = L.
L = [a, b, c].
?- [ a, b ] = [ X | Y ].
X=a
Y = [b].
1. Les Listes
?- [a] = [ X | Y ].
X=a
Y = [].
?- [ a, [ b ] ] = [ X | Y ].
X=a
Y = [[b]].
1. Les Listes
?- [a, b, c, d ] = [ X, Y | Z ].
X=a
Y=b
Z = [c, d].
?- [ [a, b, c] , d, e ] = [ X | Y ].
X = [a, b, c]
Y = [d, e].
1. Les Listes
Une liste est une structure récursive: la liste [X|L] est
composée d'un élément de tête X et d'une queue de liste L
qui est elle-même une liste.
Par conséquent, les relations Prolog qui "manipulent'' les listes
seront généralement définies par:
une ou plusieurs clauses récursives, définissant la relation
sur la liste [X|L] en fonction de la relation sur la queue de
liste L,
une ou plusieurs clauses non récursives assurant la
terminaison de la manipulation, et définissant la relation
pour une liste particulière (par exemple, la liste vide, ou la
liste dont l'élément de tête vérifie une certaine condition...
etc.).
1. Les Listes
1.1. Prédicat member/2
Ce prédicat permet d'examiner l'appartenance d'un
élément à une liste. Première façon d'écrire ce prédicat:
member(X, [Tete|Queue]) :- X =Tete.
member(X, [Tete|Queue]) :- X \=Tete, member(X, Queue).
length( [] ,0).
length( [Tete | Queue] ,N) :- length(Queue, N1), N is N1 + 1.
2. Opérateur de Coupure
Par défaut Prolog tente de prouver la requête de toutes
les façons possibles (suivant le programme) jusqu’à ce
qu’une preuve soit trouvée.
Première solution :
membre1(X, [ Y | L ]) :- X = Y.
membre1(X, [ Y | L ]) :- X \= Y, membre1(X, L).
2. Opérateur de Coupure
Exemple:
Deuxième solution :
membre2(X, [ X | _ ]).
membre2(X, [ _ | L ]) :- membre2(X, L).
L’idée ici, c’est que le cas d’égalité a été traité avec la
première règle et que l’on n’a pas à en tenir compte lors
de l’écriture de la deuxième règle.
2. Opérateur de Coupure
Conclusions
?- plat(P), viande(P).
P = steak ;
P = escalope
2. Opérateur de Coupure
La question:
?- plat(P), viande(P) , ! .
fournit en réponse le premier plat qui est de la viande.
?- plat(P) , viande(P) , ! .
P = steak
2. Opérateur de Coupure
La question:
?- plat(P), ! , viande(P).
vérifie si le premier plat est de la viande.
?- plat(P), ! , viande(P).
False
2. Opérateur de Coupure
Exemple 2:
?- repas(E,P,D), poisson(P). /* quels sont tous les repas
comprenant du poisson? */
?- poisson(P), repas(E,P,D). /* idem */
?- repas(E,P,D), ! , poisson(P). /* le premier repas de la base
comprend-il du poisson? */
?- poisson(P), ! ,repas(E,P,D). /* construire un repas avec le
premier poisson de la base */
?- repas(E,P,D), poisson(P), ! . /* quel est le premier repas
contenant du poisson ? */
?- poisson(P), repas(E,P,D), ! . /* idem */
?- !, repas(E,P,D), poisson(P). /* tous les repas comprenant
du poisson */
2. Opérateur de Coupure
Exemple 3:
Dans la recherche d’appartenance d’un élément à une
liste, la coupure permet d’arrêter le programme lors de la
découverte de la première solution possible. On peut donc
écrire:
membre(X, [ X | _ ]) :- ! .
membre(X, [ _ | L ]) :- membre(X, L).