Salta ai contenuti. | Salta alla navigazione

Strumenti personali

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.