2e année de la licence MIASHS B. Lemaire Partiel de l’UE INFf3
Durée 1h — Mars 2021
Une feuille A4 autorisée – Appareils électroniques interdits
Exercice 1 (4 points=1+1+1+1, environ 12 minutes)
On dispose des prédicats partie/5 décrivant des parties d’échecs avec, dans l’ordre des arguments : le joueur qui joue les blancs, celui qui joue les noirs, le lieu, l’année, et les coups de la partie dans une liste. Par commodité, les noms propres sont écrits en minuscule. Voici un extrait : partie(kramnik,kasparov,londres,2000,[d4,cf6,c4,e6,….]).
partie(kasparov,karpov,lyon, 1990,[e4,e5,cc3,cf6,…]).
partie(tal,vasiukov,kiev,1964,[e4,c6,cc3,d5,…]).
Écrire les requêtes pour récupérer dans la variable R (s’il y a plusieurs solutions, elles seront obtenues successivement avec ‘ ;’) :
• le nom des joueurs qui ont joué les noirs contre Alekhine en 1934 à Zurich : partie(alekhine,R,zurich,1934,_).
• le 2e coup des parties jouées par Karpov avec les noirs quand les blancs jouent e4 comme premier coup : partie(_,karpov,_,_,[e4,R|_]).
• les villes où Karpov a joué avec les blancs contre Kasparov en 1985 : partie(karpov,kasparov,R,1985,).
• les années où Kasparov a commencé au moins deux parties par d4 : partie(kasparov,_,_,R,[d4|L1]),partie(kasparov,_,_,R,[d4|L2]),L1\=L2.
Exercice 2 (4 points = 2+2, environ 12 minutes)
Soit le programme ci-contre.
a) Quelles sont toutes les solutions (dans l’ordre) pour Y et Z à la requête p([1],Y,Z).
p([X|L],Y,Z):-a(X,Y),b(Y,Z),c(L).
p([X,Y|L],4,_).
p([X|L],Y,Z):-a(X,Y),!,b(Y,Z),c(L).
p([X,Y|L],4,_).
Y=1 Z=2 Y=1 Z=3 Y=2 Z=4 Y=2 Z=6 Y=3 Z=6
b) Même question en ajoutant un ! après a(X,Y) dans la première ligne (programme ci-contre).
Y=1 Z=2 Y=1 Z=3
程序代写 CS代考 加QQ: 749389476
Exercice 3 (4 points, environ 12 minutes)
Écrire le prédicat alterne/3 qui, étant donné deux listes, renvoie une liste contenant les éléments de chaque liste de manière alternée. Si une liste est plus longue que l’autre, ses éléments en surplus sont simplement ajoutés en fin de liste. Exemple :
?- alterne([a,b,c],[1,2,3,4,5],R).
R=[a,1,b,2,c,3,4,5].
alterne([],R,R).
alterne(R,[],R).
alterne([X1|L1],[X2|L2],[X1,X2|R]) :- alterne(L1,L2,R).
Exercice 4 (5 points, environ 15 minutes)
Le nombre miroir d’un nombre est composé des mêmes chiffres mais lus à l’envers. Par exemple, 321 est le miroir de 123. Écrire le prédicat nbMystere/1 qui permet de trouver le seul nombre à trois chiffres qui est multiple de 7, qui est différent de son miroir et dont le miroir est multiple de 31.
nombreMystere(X) :- between(100,999,X), X mod 7 =:=0, Unite is X mod 10, Dizaine is (X//10)mod 10, Centaine is (X//100) mod 10,
Inv is Centaine+10*Dizaine+100*Unite, Inv=\=X,Inv mod 31 =:=0.
Exercice 5 (3 points=1+1+1, environ 9 minutes)
Qu’affiche Prolog suite à ces requêtes : a) [[1,2],[3,4]]=[[X|L]|R]
X=1 L=[2] R=[[3,4]]
b) [[1,2],[3,4]]=[[X|[Y|L]]|R] X=1 Y=2 L=[] R=[[3,4]]
c) [[1,2],[3,4]]=[[X,Y|L]|[R|[]]] X=1 Y=2 L=[] R=[3,4]
Github