TD Programmation en Logique n°2

publicité
Université Pierre Mendès France
U.F.R. Sciences de l’Homme et de la Société
Licence MIASS 2ème année
TD Programmation en Logique n°2
Exercice 1
On considère le programme Prolog ci-dessous.
a) Quelles solutions pour X et Y retourne Prolog à la requête r(X,Y) ?
r(0,0).
r(X,Y):- p(X), q(Y).
r(Y,X):- p(Y), q(Y), X=3, Y<X.
r(5,5).
p(1).
p(2).
q(2).
q(3).
b) Même question avec l'ajout d'un cut en deuxième ligne :
r(X,Y) :- p(X), q(Y), !.
Exercice 2
Soit le programme suivant.
Quelles sont toutes les solutions des requêtes suivantes ?
a)
b)
c)
d)
a(0,X).
a(1,X).
a(2,X).
a(3,X).
a(0,Y):-!,c(Y).
a(X,Y):-b(X,Y),!,c(X).
a(_,_).
b(1,2).
b(1,3).
b(2,5).
c(1).
c(2).
c(3).
Exercice 3
On considère le problème suivant :
« L’an dernier, mon père avait le double de mon âge. Cette année, nos deux âges s’expriment
par les deux mêmes chiffres, mais écrits dans un ordre différent. Quel est l’âge de mon père et
quel est mon âge ? »
Ecrire un petit programme Prolog qui résout ce problème. On définira le prédicat ages/2 qui
détermine les âges du père et du fils.
Exercice 4
a) Ecrire un programme Prolog qui résout le problème suivant :
S E N D
+ M O R E
--------= M O N E Y
Chaque lettre est associée de manière unique à un chiffre. Pour cela, on pourra utiliser le
prédicat suivant pour définir les chiffres :
chiffre(X) :- between(0,9,X).
Affichez la solution de la même manière que ci-dessus à l’aide des instructions write/1 et nl/0
(voir cours n°2)
Licence MASS 2ème année – TD n°2 Prolog
Page 1 sur 2
Manipulation de listes simples
La manipulation des listes est présentée dans le cours n°3.
Une liste en Prolog est représentée par une liste de valeurs séparées par des virgules et
encadrée de crochets comme par exemple [il, fait, beau], et [] représente la liste vide.
La notation [X|Y] représente une liste dont la tête (le 1er élément) est X et la queue (le reste de
la liste) est Y. Cela constitue la base de l’utilisation des listes dans les programmes Prolog.
Cas général : [Tete | Queue] ≡ [Car | Cdr ]
(cf. Scheme)
[a, b, c] ≡ [a | [b | [c | [ ] ] ] ]
Exercice 5
Ecrire le prédicat somme/2 qui détermine la somme des éléments d'une liste. Par exemple :
?- somme([2,4,6,8],R).
R=20
Exercice 6
Ecrire le prédicat multListe/3 qui, étant donné une liste de nombres et un coefficient, détermine
une nouvelle liste dans laquelle tous les nombres de la première liste ont été multipliés par le
coefficient :
?- multListe([5,3,7,1,0],2,L).
L=[10,6,14,2,0]
Exercice 7
Ecrire le prédicat nieme(N,L,X) qui est vrai si X est le Nième élément de la liste L. Par exemple :
?- nieme(2,[3,4,5,6],X).
X=4.
Exercice 8
Ecrire le prédicat Prolog nb(L,Min,Max,N) qui détermine le nombre N d'éléments d'une liste L
appartenant à l’intervalle de valeurs [Min,Max]. Le premier argument est la liste, le second est la
borne inférieure Min, le troisième est la borne supérieure Max et le dernier est le résultat.
?- nb([4,1,7,3,9,11,6],4,9,N).
N=5
Exercice 9
Soit deux listes composées chacune des chiffres de 0 à 9. Ecrire diff/3 qui construit la liste des
différences entre les éléments de la première liste et ceux de la seconde liste.
?- diff([4,6,1,2,9,0,3,7,5,8],[3,4,9,0,1,5,2,7,8,6],R).
R=[1,2,-8,2,8,-5,1,0,-3,2]
Exercice 10
Ecrire le prédicat lettres/2 qui détermine la liste des lettres des mots d'une liste donnée. C'est le
prédicat name/2 qui permet de transformer un terme en une liste de code de lettres.
?- lettres ([baba,ane,bien],R).
R=[b,a,e,i,n]
Exercice 11
On dispose de faits représentant le prix au kilo de fruits.
prix(pomme,7).
prix(melon,13).
prix(banane,8).
...
Ecrire le prédicat Prolog total qui détermine le montant total d'une liste de fruits avec leur poids.
Chaque couple fruit/poids est représenté par une liste à deux éléments. Le premier paramètre
est donc une liste de liste.
?- total([[banane,1.5],[pomme,0.5]],T).
T=15.5
Licence MASS 2ème année – TD n°2 Prolog
Page 2 sur 2
Téléchargement