Salta ai contenuti. | Salta alla navigazione

Strumenti personali

CLP 15 giugno 2015

Applicazioni di Intelligenza Artificiale - CLP

Prof. Marco Gavanelli

 

15 giugno 2015

Esercizio (7 punti)

Il piccolo Gino sta giocando con dei dadi; ha 3 dadi classici a 6 facce, e decide di fare una gara per vedere quale dado vince più spesso.

Ha stabilito questa regola: Gino lancia ciascuno dei dadi N volte; il dado A batte il dado B se il numero di lanci in cui A ha ottenuto un punteggio maggiore di B è più della metà dei lanci. Ad esempio, per N=5

 

A 1 2 6 1 5
B 1 1 5 3 2

 

il dado A batte il dado B, in quanto nei lanci 2, 3 e 5 ha ottenuto un punteggio superiore a B.

Una volta effettuata la gara, Gino si accorge che nessuno dei dadi ha battuto gli altri due e che

  1. il dado A ha battuto il dado B
  2. il dado B ha battuto il dado C
  3. il dado C ha battuto il dado A.

Come è possibile? Quali punteggi sono stati ottenuti dai 3 dadi negli N lanci?

Si scriva un programma CLP che, dato in ingresso un numero N di lanci, fornisca dei possibili punteggi ottenuti dai dadi (N punteggi per ogni dado) in modo che le condizioni 1, 2 e 3 siano soddisfatte.

 

Esercizio (1 punto)

La soluzione ottenuta non è unica: ci sono più combinazioni di punteggi che soddisfano le condizioni 1, 2 e 3.

Sappiamo che Gino, negli N lanci, ha ottenuto pochissimi punteggi minori di 5.

Si modifichi il programma in modo che, fra tutte le combinazioni che soddisfano le condizioni 1, 2 e 3, fornisca quella in cui il numero di punteggi minori di 5 è minimo.

 

 

Soluzione

:- lib(fd).
:- lib(fd_global).

dice(LA,LB,LC,N):-
	length(LA,N),
	N>0,
	length(LB,N),
	length(LC,N),
	flatten([LA,LB,LC],All),
	All :: 1..6,
	beats(LA,LB),
	beats(LB,LC),
	beats(LC,LA),
	occ(4,All,Nocc),
	minimize(labeling(All),Nocc).

beats(LA,LB):-
	count_beats(LA,LB,Nb),
	length(LA,N),
	Nb*2 #> N.

count_beats([],[],0).
count_beats([A|LA],[B|LB],N):-
	A #> B #<=> C,
	count_beats(LA,LB,N1),
	N #= N1+C.

occ(0,_,0):- !.
occ(K,L,N):-
	occurrences(K,L,N1),
	K1 is K-1,
	occ(K1,L,N2),
	N #= N1+N2.