Vous êtes sur la page 1sur 3

Licence Informatique 3e 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)


Soient pred1/2 et pred2/2 des 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écidat pred1? Du prédicat pred2?

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 30 15

1 7 7 2

1. Écrire un prédicat est_arbre, d’arité 1, qui réussit si le paramètre est un


arbre binaire étiqueté par des entiers.
2. Écrire un prédicat feuilles, 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édicat sous_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édicat nb_parents de 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édicat nb_parents peut-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.

Vous aimerez peut-être aussi