Licence Informatique 3 e année Langages de Programmation II
Examen - 29/03/2007 - 2h00
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 Inversion (7 points)
Soitinversele prédicat d’inversion de liste défini de la façon suivante : inverse([],[]).
inverse([X|L],R) :- inverse(L,S),append(S,[X],R).
1. Soit le butinverse(L,[1,2]).. Construire l’arbre de recherche parcouru par l’interpréteur Prolog lors de la résolution de ce but (on pourra se limiter à une profondeur de 5 résolutions et ne pas détailler la résolution des prédicatsappend).
2. Quel problème pose ce but? Proposer une solution pour le résoudre.
2 Tri (8 points)
Écrire des prédicats permettant de trier une liste par tri-fusion.Rappel : le tri fusion consiste à couper une liste en deux, trier chacune des deux sous-listes puis fusionner les deux listes triées en respectant l’ordre.
[3,2,4,7,1,5,2]
[3,2,4,7] [1,5,2]
decoupe
[2,3,4,7] [1,2,5]
tri tri
[1,2,2,3,4,5,7]
fusion
1
3 Applatissement (5 points)
Écrire un prédicat aplat(+list,?list) qui réussit si la deuxième liste contient tous les éléments de la première sans imbrication. Par exemple, aplat([1,[2,3,[4,5]],6,7],R)doit renvoyerYES R=[1,2,3,4,5,6,7]. Re- marque : on pourra utiliser le prédicatlist(+term)qui réussit si le paramètre est une liste.
2
4 Correction
Exercice 1 : Inversion inverse([],[]) :- !.
inverse([X|L],R) :- inverse(L,S),append(S,[X],R).
Exercice 2 : Tri
decoupe(L,D,F):- length(L,N), LongF is N // 2, LongD is N - LongF, length(F,LongF), length(D,LongD), append(D,F,L).
Autre solution plus compliquée mais jolie trouvée dans une copie :
supprDer([X],[]). supprDer([X|R],[X|L]) :- supprDer(R,L).
decoupe2([],[],[]).
decoupe2([X],[X],[]).
decoupe2([H|X],[H|L1],L) :- last(X,D),supprDer(X,X1),decoupe2(X1,L1,L2), append(L2,[D],L).
Encore une autre solution moins compliquée trouvée dans une copie mais qui ne respecte pas l’ordre de la liste initiale :
decoupe3([],[],[]).
decoupe3([X],[X],[]).
decoupe3([A,B|C],[A|L1],[B|L2]) :- decoupe3(C,L1,L2).
fusion([],L,L).
fusion(L,[],L).
fusion([X1|Xs1],[X2|Xs2], [X1|L]):- X1 < X2, fusion(Xs1,[X2|Xs2],L).
fusion([X1|Xs1],[X2|Xs2], [X2|L]):- X1 >= X2,fusion([X1|Xs1],Xs2,L).
tri([],[]).
tri([X],[X]).
tri([X1,X2|Xs],L2) :- decoupe([X1,X2|Xs],D1,F1), tri(D1,D1triee), tri(F1,F1triee), fusion(D1triee,F1triee,L2).
Exercice 3 : Applatissement aplat([],[]).
aplat([X|L],[X|S]) :- \+list(X), aplat(L,S).
aplat([X|L],R) :- list(X), aplat(X,S), aplat(L,T), append(S,T,R).
3