2e année de la licence MIASHS B. Lemaire Partiel de programmation logique
Durée 1h — Mars 2022 — sujet B
Une feuille A4 autorisée – Appareils électroniques interdits
Prénom / Nom : …………………………………………………………………………………………………
Exercice 1 (4 points=1+1+1+1, environ 12 minutes)
On dispose des prédicats releves/5 décrivant des relevés de températures avec, dans l’ordre des arguments : la ville, le mois, l’année, la liste des températures minimles par jour, la liste des températures maximales par jour. Voici un exemple (les listes contiennent en réalité autant de valeurs que de jours dans le mois) : releves(grenoble,fevrier,2018,[3,2,0,-1,-2,-4,1,0,…],[5,7,8,6,7,11,9,12,…]). releves(grenoble,janvier,2018,[-4,-3,0,-3,-2,4,5,2,…],[6,7,8,7,11,9,9,12,…]). releves(annecy,janvier,2019,[2,0,1,1,-2,4,1,0,…],[7,6,7,7,11,10,8,9,…]). releves(annecy,decembre,2019,[-1,0,-3,-4,-6,-2,1,1,…],[2,2,7,9,4,6,9,8…]).
Écrire les requêtes pour récupérer dans la variable R (s’il y a plusieurs solutions, elles seront obtenues successivement avec ‘ ;’) :
• la température maximale du 2 juillet 2017 à Bordeaux : releves(bordeaux, juillet, 2017, _, [_,R|_]).
• les mois où la température du premier jour à Lille en 2019 était négative : releves(lille, R, 2019, [T|_], _), T<0.
• les mois de 2016 où l’écart de températures le 3 à Dijon était exactement de 10 degrés : releves(dijon, R, 2016,[_,_,Min|_],[_,_,Max|_]),Max-Min =:= 10.
• les années où, à Nice, deux premiers jours de deux mois différents ont eu une température minimale égale (il peut y avoir plusieurs solutions pour la même année) :
releves(nice, M1, R, [T|_], _), releves(nice, M2, R, [T|_], _), M1\=M2.
Exercice 2 (4 points, environ 12 minutes)
Écrire le prédicat groupe/2 qui, étant donné une liste de paires de nombres, renvoie une liste dans laquelle les deux éléments de chaque paire ont été remplacés par leur produit. Exemple :
?- groupe([[1,2],[3,4],[5,6]],R).
R = [[2], [12], [30]].
groupe([],[]).
groupe([[X,Y]|L], [[Somme]|R]) :- Somme is X+Y, groupe(L,R).
Programming Help, Add QQ: 749389476
Exercice 3 (3 points=1+1+1, environ 9 minutes)
Qu’affiche Prolog suite à ces requêtes : a) [X,Y|L]=[a,b,c,d].
X = a, Y = b, L = [c, d]............................................................................... b) [X,Y|L]=[[a,b,c,d]].
false.................................................................................................................. c) [[X,Y|L1]|[L2|L3]]=[[a,b,c,d],[e],[f]].
X = a, Y = b, L1 = [c, d], L2 = [e], L3 = [[f]]...............................................................
Exercice 4 (5 points, environ 15 minutes)
Ecrire le prédicat Prolog trouve2nombres/2 qui détermine deux nombres à deux chiffres dont le produit vaut 999 ou 1001, le premier étant inférieur au second. Il y a trois solutions. Voici l’exécution du prédicat :
?- trouve2nombres(X,Y).
X = 11, Y = 91 ; X = 13, Y = 77 ; X = 27, Y = 37 ;
Exercice 5 (4 points = 2+2, environ 12 minutes)
Soit le programme ci-contre.
a) Quelles sont toutes les solutions (dans l’ordre) pour X à la requête a(1,X) ?
b) Même question en ajoutant un ! à la fin de la seconde ligne (voir ci-contre).
a(X,Y):-b(X),Y is X-1.
a(X,X):-c(X).
a(Y,7):-c(Y).
b(X):-c(X).
a(X,Y):-b(X),Y is X-1. a(X,X):-c(X),!. a(Y,7):-c(Y).
b(X):-c(X).
trouve2nombres(X,Y) : -between(10,99,X), between(10,99,Y), X