2e année de la licence MIASHS B. Lemaire Partiel de programmation logique
Durée 1h — Mars 2022 — sujet A
Une feuille A4 autorisée – Appareils électroniques interdits
Prénom / Nom : …………………………………………………………………………………………………
Exercice 1 (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) ?
a(X,Y):-b(X),Y is X-1.
a(X,X):-c(X).
a(Y,5):-c(Y).
b(X):-c(X).
a(X,Y):-b(X),Y is X-1. a(X,X):-c(X),!. a(Y,5):-c(Y).
b(X):-c(X).
X=0 X=0 X=1 X=5
b) Même question en ajoutant un ! à la fin de la seconde ligne (voir ci-contre).
X=0 X=0 X=1
Exercice 2 (3 points=1+1+1, environ 9 minutes)
Qu’affiche Prolog suite à ces requêtes : a) [A,B|L]=[1,2,3,4].
A = 1, B = 2, L = [3, 4]………………………………………………………………………………. b) [A,B|L]=[[1,2,3,4]].
false………………………………………………………………………………………………………………
c) [[A,B|L1]|[L2|L3]]=[[1,2,3,4],[5],[6]].
A = 1, B = 2, L1 = [3, 4], L2 = [5], L3 = [[6]]…………………………………………………….
Code Help
Exercice 3 (4 points, environ 12 minutes)
Écrire le prédicat fusionnePaires/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 somme. Exemple : ?- fusionnePaires([[1,2],[3,4],[5,6]],R).
R = [[3], [7], [11]].
fusionnePaires([],[]).
fusionnePaires([[X,Y]|L], [[Somme]|R]) :- Somme is X+Y, fusionnePaires(L,R).
Exercice 4 (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 minimales 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(paris,fevrier,2022,[3,2,0,-1,-2,-4,1,0,…],[5,7,8,6,7,11,9,12,…]). releves(paris,janvier,2022,[-4,-3,0,-3,-2,4,5,2,…],[6,7,8,7,11,9,9,12,…]). releves(paris,decembre,2021,[2,0,1,1,-2,4,1,0,…],[7,6,7,7,11,10,8,9,…]).
É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 avril 2021 à Nantes : releves(nantes, avril, 2021, _, [_,R|_]).
• les mois où la température du premier jour à Toulouse en 2017 était négative : releves(toulouse, R, 2017, [T|_], _), T<0.
• les mois de 2019 où l’écart de températures le 3 à Amiens était exactement de 5 degrés : releves(amiens, R, 2019, [_,_,Min|_], [_,_,Max|_]), Max-Min =:= 5.
• les années où, à Lyon, 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(lyon, M1, R, [T|_], _),releves(lyon, M2, R, [T|_], _), M1\=M2.
Exercice 5 (5 points, environ 15 minutes)
Ecrire le prédicat Prolog presque1000/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 :
?- presque1000(X,Y).
X = 11, Y = 91 ; X = 13, Y = 77 ; X = 27, Y = 37 ;
presque1000(X,Y) : -between(10,99,X), between(10,99,Y), X