Haftungsausschluss: Dies ist Xonix "Lösung. Wenn Sie es wünschen, wählen Sie ihn bis. Aber da ich ein bisschen kratzte, um herauszufinden, was vor sich ging, dachte ich, ich könnte meine Kommentare genauso gut anbieten, damit andere davon profitieren können.
Zuerst hier seine Lösung als eine richtige Klausel ist:
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.
Und es geht so:
Zuerst er durch die Liste der Personen läuft (niedrigerer Fall sein, also sind sie keine Variablen). K
wird nacheinander für jede von ihnen instanziiert.
Mit jedem möglichen Wert von K
läuft er durch den Rest der Klausel. K
kann als die Hypothese interpretiert wer der Verbrecher ist. Die nächsten 4 Zeilen sollen Bindings zu jeder der Variablen A, B, C und D liefern. Sie können sie so lesen: Unter der Annahme, dass a
nicht der Verbrecher ist, ist eine Wahrheit ansonsten nicht wahr. Unter der Annahme, dass d
der Verbrecher ist, ist b wahrheitsgemäß sonst nicht. Asf. Das heißt, die Variablen A, B, ... erfassen die Wahrhaftigkeit des entsprechenden Individuums bei einem bestimmten Kriminellen. Als bekannte Einschränkung ist die Tatsache, dass nur eine von ihnen wahrheitsgemäß ist, die Summe ihrer Wahrheitswerte muss 1 sein. Beim Zurückverfolgen macht Prolog die nächste Bindung für K und läuft erneut durch. Stellt sich heraus, die Einschränkung ist nur erfüllt, wenn a
der Verbrecher ist (und d
sagt die Wahrheit, wenn ich mich nicht irre). Niedlich.
Habe ich das Recht bekommen: ein Verbrecher ist, aber drei sind Lügner ?! – ThomasH