Отказ от ответственности : Это решение Xonix '. Если вам это нравится, проголосуйте ему . Но так как мне потребовалось немного усилий, чтобы понять, что происходит, я подумал, что с тем же успехом могу предложить свои комментарии, чтобы другие могли извлечь выгоду.
Сначала вот его решение как правильное предложение:
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.
И это выглядит так:
Сначала он просматривает список лиц (должен быть в нижнем регистре, чтобы они не были переменными). K
создается каждому из них по очереди.
С каждым возможным значением K
он проходит через остальную часть предложения. K
можно интерпретировать как гипотезу о том, кто является преступником. Следующие 4 строки должны предоставить привязки к каждой из переменных A, B, C и D. Вы можете прочитать их так: При условии, что a
не является преступником, a является правдивым, иначе нет. Исходя из предположения, что d
является преступником, b является правдивым, иначе нет. Asf. То есть переменные A, B, ... фиксируют правдивость соответствующего человека, данного конкретного преступника.
Поскольку известным ограничением является тот факт, что только один из них является правдивым, сумма их значений истинности должна быть равна 1. При возврате, Пролог делает следующее связывание для K и снова проходит через него. Оказывается, ограничение выполняется только в том случае, если a
является преступником (а d
говорит правду, если я не ошибаюсь). Cute.