examen21 A corr

2e année de la licence MIASHS B. Lemaire Partiel 2 de l’UE INFf3
Durée 1h — Avril 2021 – version B
Une feuille A4 autorisée – Appareils électroniques interdits
Exercice 1 (8 points=4+4, environ 24 minutes)
On suppose que des opérations arithmétiques sont représentées par des listes à 3 éléments : [opérateur, opérande 1, opérande 2], les opérandes pouvant être des nombres ou des listes. Voici quelques exemples : [+,4,[*,6,2]], [-,5,1], [-,[*,3,2],[+,[*,3,4],[/,5,2]]]
a) Écrire le prédicat calcul/2 qui détermine le résultat d’une opération. Les opérateurs sont +,-,*,/. ?- calcul([+,4,[*,6,2]],R).
b) On suppose maintenant que les opérations peuvent contenir un nom de variable mathématique dont la valeur est définie dans une autre liste. Par exemple [x,6] et [+,3,[*,2,x]]. Écrire le prédicat remplacer/3 qui étant donné ces deux listes, détermine une nouvelle liste dans laquelle la variable a été remplacée par sa valeur dans l’opération.
?-remplacer([z,3],[+,z,[/,z,5]],Res).
Res=[+,3,[/,3,5]]
Exercice 2 (5 points, environ 15 minutes)
Écrire le prédicat sommeDiag/2 qui détermine la somme des éléments de la diagonale d’une matrice carrée de taille quelconque. Vous pouvez utiliser le prédicat prédéfini nth1/3 qui détermine le Ne
élément d’une liste :
?- nth1(2,[a,b,c,d],R).
?- sommeDiag([[1,2,3],[10,20,30],[100,200,300]],R).
calcul(N,N):-number(N).
calcul([+,A,B],R):-calcul(A,RA),calcul(B,RB),R is RA+RB.
calcul([-,A,B],R):-calcul(A,RA),calcul(B,RB),R is RA-RB.
calcul([*,A,B],R):-calcul(A,RA),calcul(B,RB),R is RA*RB.
calcul([/,A,B],R):-calcul(A,RA),calcul(B,RB),R is RA/RB.
remplacer([Var,Val],Var,Val).
remplacer([_,_],N,N):-number(N).
remplacer([Var,Val],[Op,O1,O2],[Op,NO1,NO2]):-
remplacer([Var,Val],O1,NO1),remplacer([Var,Val],O2,NO2).
/* on appelle un autre prédicat avec un argument de plus, qui vaut 1 au début, Cette valeur représente le numéro de la ligne courante */ sommeDiagonale(M,R):- sommeDiagonale(M,1,R).
/* la somme des éléments de la diagonale à partir de la ligne I = la somme des élements de la diagonale à partir de la ligne I+1 plus le Ième élément de la première ligne */
sommeDiagonale([],_,0).
sommeDiagonale([L|S],I,R):-nth1(I,L,E),I1 is I+1,sommeDiagonale(S,I1,R1),R is R1+E.

CS Help, Email: tutorcs@163.com
Exercice 3 (3 points, environ 9 minutes)
Ecrire le prédicat croissants/1 qui étant donné une liste de nombres renvoie true si tous les nombres sont dans l’ordre croissant strict (pas de nombres égaux).
?- croissants([4,5,8,11]).
?- croissants([4,5,12,11]).
Exercice 4 (4 points, environ 12 minutes)
On considère l’égalité mystérieuse suivante: ??+??=??. Chaque point d’interrogation représente un chiffre, tous les chiffres sont différents et sont dans un ordre croissant de gauche à droite. Aucun des 3 nombres ne commence par zéro. La somme des 6 chiffres vaut 32. Écrire le prédicat nbMystere/0 qui trouve les chiffres composant cette addition et les affiche sous la forme: XX+XX=XX
?- nbMystere.
croissant([_]).
croissant([X,Y|L]):-X