Задача про полицейских - Prolog
Формулировка задачи:
Вот задача
Jean был убит во вторник. Luc, Paul, Alain, Bernard и Louis находятся под подозрением.
Известно что:
- убийцей является тот, кто желал смерти Jean-a, имеет оружие и не имеет алиби на вторник;
- алиби представленное персоной не внушающей доверия не является действительным;
- кто-то мог хотеть смерти Jean-a, если он был заинтересован в его смерти или желал ему отомстить;
- персона может быть заинтересована в смерти Jean-a, если она наследует его собственность, если должна ему денег или была замечена Jean-ом на месте преступления.
Анкета дала следующие результаты:
- У Luc-a есть алиби на вторник, которое предоставил Bernard;
- У Paul-a есть алиби на вторник, которое предоставил Bernard;
- У Louis-a есть алиби на вторник, которое предоставил Luc;
- У Alain -a есть алиби на четверг, которое предоставил Luc;
- Alain персона не внушающее доверие;
- Paul хотел отомстить Jean-у;
- Luc хотел отомстить Jean-у;
- Bernard является наследником Jean-a;
- Jean является наследником Louis -a;
- Louis должен денег Jean-у;
- Luc должен денег Jean-у;
- Jean видел Alain –a за совершением преступления;
- У Luc-а есть оружие;
- У Louis -а есть оружие;
- У Alain -а есть оружие.
Кто убийца?
Вот мой код
Почему он выводит 4 ответа,а не один и как это исправить?
Листинг программы
- domains
- name, day = symbol
- predicates
- person(name).
- alibi(name,day,name).
- persona_non(name).
- mesti(name).
- heir(name,name).
- money(name).
- jean_see(name).
- weapon(name).
- motive(name).
- n_al(name).
- killer(name).
- goal
- killer(X),
- write("KILLER -",X), nl.
- clauses
- person(jean).
- person(luc).
- person(paul).
- person(alain).
- person(bernard).
- person(louis).
- alibi(luc,tuesday,bernard). /* У Luc-a есть алиби на вторник, которое предоставил Bernard */
- alibi(paul,tuesday,bernard). /* У Paul-a есть алиби на вторник, которое предоставил Bernard */
- alibi(louis,tuesday,luc). /* У Louis-a есть алиби на вторник, которое предоставил Luc */
- alibi(alain,thursday,luc). /* У Alain -a есть алиби на четверг, которое предоставил Luc */
- persona_non(alain). /* Alain персона не внушающее доверие */
- mesti(paul). /* Paul хотел отомстить Jean-у */
- mesti(luc). /* Luc хотел отомстить Jean-у */
- heir(bernard,jean). /* Bernard является наследником Jean-a */
- heir(jean,louis). /*Jean является наследником Louis -a */
- jean_see(alain). /* Jean видел Alain –a за совершением преступления */
- money(louis). /* Louis должен денег Jean-у */
- money(luc). /* Luc должен денег Jean-у */
- weapon(luc). /* У Luc-а есть оружие */
- weapon(louis). /* У Louis -а есть оружие */
- weapon(alain). /* У Alain -а есть оружие */
- n_al(X) :- not(alibi(X,tuesday,_)); not(alibi(_,tuesday,X)); persona_non(X).
- motive(X) :- mesti(X); heir(X,_); jean_see(X); money(X).
- killer(X) :- motive(X), weapon(X), n_al(X).
Решение задачи: «Задача про полицейских»
textual
Листинг программы
- ?- killer(Killer, jean, tuesday).
- Killer = alain ;
- false.
Объяснение кода листинга программы
- В коде представлено предположение о задаче, связанной с полицейскими и убийцей.
- Убийца обозначается переменной
Killer
, а его имя -alain
. - Вторая переменная -
jean
, вероятно, связана с жертвой или жертвами убийцы. - Третья переменная -
tuesday
, возможно, указывает на день недели, когда произошло убийство. - Код предполагает, что убийца носит имя
alain
, жертва -jean
, а убийство произошло во вторник. - Однако, проверка
false
указывает на то, что данная комбинация переменных не является верной. - Возможно, это означает, что
alain
не является убийцейjean
во вторник. - Или же, это может указывать на отсутствие связи между переменными
Killer
,jean
иtuesday
в данном контексте.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д