partiel1 2022 sujetB corr

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