Licence Informatique 3 e année
Langages de Programmation II - Partie Prolog
Examen 2e session - 27/07/2006 - 1h00
Les notes de cours et de TD sont autorisées. Il sera tenu compte pour la notation de la qualité de rédaction et de la lisibilité des copies. Le barême est donné à titre indicatif.
1 Résolution (6 points)
On donne le programme Prolog suivant (qui date un peu je crois) :
soleil.
lobes(kafelnikov).
petit(pioline).
meilleur(sampras).
gagnant(A,B) :- meilleur(A).
gagnant(C,D) :- plus_malin(C,D).
gagnant(E,F) :- plus_chanceux(E,F).
plus_malin(G,_) :- soleil, lobes(G).
plus_malin(H,I) :- petit(I), lobes(H).
plus_chanceux(_,pioline).
Donnez l’arbre de résolution du butgagnant(X,_).
2 Ensembles (4 points)
On veut manipuler en Prolog des ensembles sous forme de listes d’éléments, non ordonnées etsans doublon.
1. Écrire un prédicatunion(+list,+list,?list)qui réussit si la troisième liste est l’union des deux premières (c’est-à-dire contient les éléments des deux listes mais sans doublon).
2. Écrire un prédicatintersection(+list,+list,?list)qui réussit si la troisième liste est l’intersection des deux premières (c’est-à-dire contient les éléments communs aux deux listes mais sans doublon).
1
Ensembles
On suppose que les listes initiales sont sans doublon. Dans le cas contraire, on peut supprimer les doublons en utilisant le prédicat suivant :
sans_doublon([],[]).
sans_doublon([X|L],R) :- member(X,L),sans_doublon(L,R).
sans_doublon([X|L],[X|R]) :- \+member(X,L),sans_doublon(L,R).
Question 2.1 : union([],X,R).
union([X|L],Y,[X|S]) :- \+member(X,Y),union(L,Y,S).
union([X|L],Y,S) :- member(X,Y),union(L,Y,S).
Question 2.2 :
intersection([],X,[]).
intersection([X|L],Y,[X|R]) :- member(X,Y),intersection(L,Y,R).
intersection([X|L],Y,R) :- \+member(X,Y),intersection(L,Y,R).
2