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
- il dado A ha battuto il dado B
- il dado B ha battuto il dado C
- 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.