Licence Informatique 3 e année Langages de Programmation II
Examen - 22/06/2006 - 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 Prédicat mystère (7 points)
Soientpred1/2etpred2/2des prédicats définis de la façon suivante : pred1([],_).
pred1([X|L],[X|L1]) :- pred1(L,L1).
pred2([_],[]) :- fail.
pred2([X|L],[X|M]) :- pred1(L,M).
pred2([X|L],[_|M]) :- pred2([X|L],M).
1. Soit le but pred2([5,7],[5,5,7,8]).. 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écidatpred1? Du prédicatpred2?
2 Arbres en listes (8 points)
On veut manipuler à l’aide de listes des arbres binaires étiquetés par des entiers. 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édicatest_arbre, d’arité 1, qui réussit si le paramètre est un arbre binaire étiqueté par des entiers.
2. Écrire un prédicatfeuilles, d’arité 2, qui réussit si le deuxième paramètre est la liste des feuilles du premier paramètre, qu’on supposera être un arbre binaire étiqueté par des entiers.
3. Écrire un prédicatsous_arbre, d’arité 2, qui réussit si le premier para- mètre est un sous-arbre du deuxième paramètre, qui est supposé être un arbre. On considére qu’un arbre est sous-arbre de lui-même.
3 Coupure au paradis (5 points)
On définit le prédicatnb_parentsde la façon suivante : nb_parents(eve,0) :- !.
nb_parents(adam,0) :- !.
nb_parents(_,2).
1. Quel type de coupure est utilisé ici : rouge ou verte? Réponse à justifier!
2. Le prédicatnb_parentspeut-il est utilisé correctement en mode (+,+)?
En mode (+,-)? Réponses à justifier aussi!
3. Proposer une modification du programme pour qu’il fonctionne correcte- ment en mode (+,+) et (+,-).
2
4 Éléments de correction
Exercice 1 : Prédicat mystère
Question 1.1 : trois branches, 2 échecs, une réussite.
Question 1.2 : pred1 réussit si le premier paramètre est une liste préfixe du deuxième paramètre. pred2 réussit si le premier paramètre est une liste conte- nue dans la deuxième.
Exercice 2 : Arbres en listes Question 2.1 :
est_arbre(X) :- integer(X).
est_arbre([X,G,D]) :- integer(X),est_arbre(G),est_arbre(D).
Question 2.2 :
feuilles(X,[X]) :- integer(X).
feuilles([_,G,D],L) :- feuilles(G,L1),feuilles(D,L2),append(L1,L2,L).
Question 2.3 : sous_arbre(S,S).
sous_arbre(X,[_,G,_]) :- sous_arbre(X,G).
sous_arbre(X,[_,_,D]) :- sous_arbre(X,D).
Exercice 3 : Coupure au paradis
Question 3.1 : la coupure est rouge car si on enlève une des deux coupures, le résultat n’est plus le même (par exemple nb_parents(eve,X) renverra YES X=0 ou X=2 alors qu’avec les coupures, ce but renverra uniquement YES X=0).
Question 3.2 : ce prédicat ne fonctionne pas correctement en mode (+,+) (par exemple nb_parents(eve,2) renvoie vrai). Il fonctionne correctement en mode (+,-) car quelque soit la valeur donnée en premier paramètre (eve, adam ou autre chose), la valeur affectée au deuxième paramètre par Prolog sera correcte.
Question 3.3 : modification possible nb_parents2(eve,0).
nb_parents2(adam,0).
nb_parents2(X,2) :- X \= eve, X \= adam.
3