Vous êtes sur la page 1sur 3

Li

en e Informatique 3e année

Langages de Programmation II

Examen - 25/03/2008 - 2h00

Les notes de ours et de TD sont autorisées. Il sera tenu ompte pour la


notation de la qualité de réda tion et de la lisibilité des opies. Le barême est
donné à titre indi atif.

1 Résolution (6 points)
Soit (+list,?list) le prédi at déni de la façon suivante :

([℄,[℄).

([X℄,[X℄).

([X,X|R℄,L) :- ([X|R℄,L).

([X,Y|R℄,[X|L℄):- X \= Y, ([Y|R℄,L).

1. Soit le but ([a,a,b,a℄,L). Construire l'arbre de re her he par ouru par


l'interpréteur Prolog lors de la résolution de e but (ne pas oublier les
bran hes a essibles par ba ktra k!).
2. À quoi sert le prédi at ?

2 Répétitions dans les listes (8 points)


1. É rire un prédi at adja ents(+atom, +atom, +list) qui réussit si les
deux atomes sont adja ents dans la liste, l'ordre d'apparition des ato-
mes n'ayant pas d'importan e. Par exemple adja ents(a,b,[ ,b,a℄)
et adja ents(a,b,[ ,a,b,d℄)renvoient YES, adja ents(a,b,[ ,b,d,a℄)
renvoie NO.
2. É rire un prédi at repete(+list,?list) qui réussit si la deuxième liste
ontient les éléments de la première liste répétés ha un une fois. Par
exemple, l'appel de repete([a,b, ℄,L) renvoie YES L=[a,a,b,b, , ℄.
3. É rire un prédi at repete_n(+list,+int,?list) qui réussit si la deuxième
liste ontient les éléments de la première liste répétés ha un n fois, où n est
le deuxième paramètre. Par exemple, repete_n([a,b℄,3,L) renvoie YES
L=[a,a,a,b,b,b℄, repete_n([a,b℄,1,L) renvoie YES L=[a,b℄. Il n'est
pas interdit d'é rire des prédi ats supplémentaires en as de besoin!

1
3 Nombres pseudo-aléatoires de von Neumann (6
points)
La méthode de von Neumann pour générer des nombres pseudo-aléatoires
onsiste, à partir d'un nombre donné, à l'élever au arré et à extraire de e arré
les hires les plus entraux, puis à re ommen er ( ette méthode est en fait assez
mauvaise ar elle bou le souvent rapidement). Par exemple, si on onsidère des
nombres de 4 hires et qu'on part de 1111, son arré vaut 1234321, on en
extrait 3432, dont le arré vaut 11778624, on en extrait 7786, et .
É rire un prédi at pseudo_aléatoire_vn(+int,+int,?int) qui réussit si,
le premier paramètre étant le nombre initial de quatre hires et le deuxième
étant le nombre d'itérations, le troisième est le nombre pseudo-aléatoire généré
par la méthode de von Neumann au bout du nombre d'itérations donné. Par
exemple, pseudo_aléatoire_vn(1111,2,N) renvoie YES N=7786. Il n'est pas
interdit d'é rire des prédi ats supplémentaires en as de besoin!
On pourra utiliser le prédi at prédéni number_ hars(+number,?list) qui
réussit si la liste ontient les ara tères des hires omposant le nombre. Ce pré-
di at peut également être utilisé en mode (-,+). Par exemple, number_ hars(123
,L) renvoie YES L=['1','2','3'℄ et number_ hars(N,['1','2','3'℄) ren-
voie YES N=123.

Anyone who onsiders arithmeti al methods of produ ing random digits, is, of
, John Von Neumann (ainsi, si vous faites orre tement
ourse, in a state of sin
l'exer i e, vous aurez 6 points, mais vous irez en enfer).

2
4 Corre tion
Exer i e 1 : Résolution

permet de ré upérer en deuxième paramètre la liste passée en premier pa-


ramètre et débarassée des doublons onsé utifs. Par exemple, ([a,a,b,a℄,L)
renvoie YES L=[a,b,a℄.

Exer i e 2 : Répétitions dans les listes

adja ents(X,Y,[X,Y|_℄):- !.
adja ents(X,Y,[Y,X|L℄):- !.
adja ents(X,Y,[A,B|L℄):- adja ents(X,Y,[B|L℄).

repete([℄,[℄).
repete([X|R℄,[X,X|L℄):- repete(R,L).

liste_e(X,1,[X℄).
liste_e(X,N,[X|R℄):- N>1, M is N-1, liste_e(X,M,R).

repete_n([℄,_,[℄).
repete_n([A|B℄,N,L):- liste_e(A,N,R),repete_n(B,N,S), append(R,S,L).

Exer i e 3 : Nombres pseudo-aléatoires de von Neumann

extrait4([A,B,C,D,E,F|_℄,[C,D,E,F℄).

pseudo_aléatoire_vn(N,0,N).

pseudo_aléatoire_vn(N,I,R) :- I>0, M is N*N, number_ hars(M,L), extrait4(L,E),


number_ hars(P,E), J is I-1, pseudo_aléatoire_vn(P,J,R).

Vous aimerez peut-être aussi