CLP 16 settembre 2015
Applicazioni di Intelligenza Artificiale - CLP
Prof. Marco Gavanelli
15 settembre 2015
Esercizio (8 punti)
Un commerciante del 1850 pesava le sue merci con una bilancia a due piatti. Su uno dei piatti poneva le merci, mentre sull'altro metteva dei pesi di misura nota.
Un giorno, un peso da 40 grammi gli cadde e si spezzò in quattro parti. Verificando il peso dei quattro pezzi, constatò che ognuno dei pezzi pesava un numero intero di grammi. Inoltre, usando i pezzi come pesetti, riusciva a pesare qualunque oggetto con un peso (intero) compreso fra 1 e 7 grammi.
Si scriva un programma CLP(FD) che trova il peso dei quattro pezzi.
Soluzione
Costruiamo una lista L di 4 elementi, che rappresentano il peso dei 4 pezzi.
Dobbiamo far si` che con questi 4 pezzi si possano pesare tutti gli oggetti con un peso intero compreso fra 1 e 7 grammi.
Per fare questo, costruiamo una matrice (cioe` una lista di liste) M di dimensione 4x7 (il valore 7 va passato nel parametro Max).
La all_weights impone che si possano creare tutti i numeri da 1 a 7. Viene invocata con N=Max (ovvero 7) ed impone:
- che gli elementi della prima riga di M dicano se i corrispondenti pezzi sono usati per creare il peso 7
- che gli elementi della seconda riga dicano se i corrispondenti pezzi sono usati per creare il peso 6
- ...
- che gli elementi della settima riga dicano se i corrispondenti pezzi sono usati per creare il peso 1.
:- lib(fd).
:- lib(fd_global).
weights(L,M,Max):-
length(L,4),
L :: 1..40,
sumlist(L,40),
all_weights(L,M,Max),
flatten([L,M],All),
labeling(All).
all_weights(_,[],0):-!.
all_weights(L,[L1|M],N):-
length(L1,4),
L1 :: 0..1,
prodotto_scalare(L,L1,N),
N1 is N-1,
all_weights(L,M,N1).
prodotto_scalare([],[],0).
prodotto_scalare([A|LA],[B|LB],P):-
prodotto_scalare(LA,LB,P1),
P #= A*B+P1.