Licence Informatique 3 e année
Langages de Programmation II - Partie Prolog
Examen 2e session - 07/09/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.
Partie Prolog
1 Résolution (3 points)
Soitpred/2un prédicat défini de la façon suivante : pred(_,[],[],[]).
pred(P,[X|R],[X|LG],LD) :- X=<P, pred(P,R,LG,LD).
pred(P,[X|R],LG,[X|LD]) :- X>P, pred(P,R,LG,LD).
1. Soit le but pred(4,[5,7,5,3],L1,L2).. Construire l’arbre de recherche parcouru par l’interpréteur Prolog lors de la résolution de ce but.
2. Quel est le sens du précidatpred?
2 Arbres (7 points)
On veut manipuler à l’aide de listes des arbres binaires étiquetés par des entiers (on utilise bien des listes, et non des foncteurs comme feuille ou nœud). Une feuille est représentée par un entier. Un nœud est représenté par une liste[i,g,d]où i est un entier, et où g et d sont des arbres. Par exemple, [2,[4,[5,1,7],6],[9,30,[15,7,2]]]représente l’arbre de la figure.
1
2
4 9
5 6
1 7
30 15
7 2
1. Écrire un prédicatpostfixe, d’arité 2, qui réussit si le deuxième paramètre est la liste des nœuds de l’arbre lors d’un parcours postfixé (traiter le nœud gauche, puis le nœud droit, puis la racine).
2. Écrire un prédicatniveau, d’arité 3, qui réussit si le troisième paramètre est la liste des nœuds de l’arbre donné en deuxième paramètre situés au niveau (ou à la profondeur) de l’entier donné en premier paramètre.
3. En utilisant le prédicathauteur vu en TD, écrire un prédicat largeur, d’arité 2, qui réussit si le deuxième paramètre est la liste des nœuds de l’arbre lors d’un parcours en largeur (traiter les nœuds du niveau, puis ceux du niveau en dessous etc).
2
3 Éléments de correction
Exercice 1 : Résolution
Question 1.1 : une seule branche, réussite.
Question 1.2 :predréussit si les troisième et quatrième paramètres sont respec- tivement la liste des éléments du deuxième paramètre inférieurs ou égaux au premier paramètre et la liste des éléments du deuxième paramètre strictement supérieurs au premier paramètre.
Exercice 2 : Arbres
Question 2.1 :
postfixe(X,[X]) :- integer(X).
postfixe([X,G,D],R) :- postfixe(G,L),postfixe(D,M),append(L,M,T),append(T,[X],R).
Question 2.2 :
niveau(0,[X,_,_],[X]).
niveau(0,X,[X]) :- integer(X).
niveau(I,X,[]) :- integer(X),I>0.
niveau(I,[_,G,D],R) :- I>0,J is I-1,niveau(J,G,R1),niveau(J,D,R2),append(R1,R2,R).
Question 2.3 :
max(X,Y,Z) :- X > Y, !, Z = X.
max(_,Y,Y).
hauteur(X,0) :- integer(X).
hauteur([_,G,D],H) :- hauteur(G,H1),hauteur(D,H2),max(H1,H2,T),H is T+1.
largeur(H,A,L) :- hauteur(A,H), niveau(0,A,L),!.
largeur(I,A,L) :- J is I+1, niveau(I,A,S), largeur(J,A,R), append(S,R,L).
larg(A,R) :- largeur(0,A,R).
3