responsabilità: Questo è Xonix 'soluzione. Se ti piace vota lui su. Ma siccome mi è costato un po 'di grattacapi per capire cosa stava succedendo, ho pensato che avrei potuto anche offrire i miei commenti in modo che altri potessero trarne beneficio.
In un primo momento, ecco la sua soluzione come clausola corretta:
criminal(K):-
member(K,[a,b,c,d]),
(K\=a -> A=1;A=0),
(K=d -> B=1;B=0),
(K=b -> C=1;C=0),
(K\=d -> D=1;D=0),
A+B+C+D=:=1.
E va in questo modo:
In un primo momento, si attraversa l'elenco delle persone (devono essere minuscolo, quindi non sono variabili). K
viene istanziato a ciascuno di essi a turno.
Con ogni possibile valore di K
, viene eseguito il resto della clausola. K
può essere interpretato come l'ipotesi di chi è il criminale. Le 4 linee successive sono per fornire associazioni a ciascuna delle variabili A, B, C e D. Puoi leggerle così: Partendo dal presupposto che a
non è il criminale, a è vero altrimenti no. Partendo dal presupposto che d
è il criminale, b è vero altrimenti no. Asf. Cioè, le variabili A, B, ... catturano la veridicità dell'individuo corrispondente, dato un criminale specifico.
Come un vincolo noto è il fatto che solo uno di essi è veritiero, la somma dei loro valori di verità deve essere 1. In retrocessione, Prolog effettua il successivo legame per K, e lo attraversa di nuovo. Risulta che il vincolo è soddisfatto solo se a
è il criminale (e d
sta dicendo la verità, se non mi sbaglio). Carina.
ho ricevuto tale diritto: uno è un criminale, ma tre sono bugiardi ?! – ThomasH