answer-set-programming - ASP 中的谋杀谜题
问题描述
所以在标签序言下我发现了这个谜题(原始帖子),我想:这在 ASP 中会更好。所以我把这个问题放在这里作为任何想和我一起解决难题的人的问题。我自己找到解决方案后会立即回答这个问题,我很乐意将我的代码与您的代码进行比较。谢谢你。
珍在星期二被杀;唯一的嫌疑人是:
卢克、保罗、阿兰、伯纳德和路易斯。
要遵循的规则是:
凶手是一个有杀人动机的人,他拥有一把枪,并且在星期二没有不在场证明。
不接受不值得信赖的人提供的不在场证明。
如果某人对杀死 jean 有特殊兴趣或想要报复,他就有杀死 jean 的动机。
有人对杀死 jean 有特殊兴趣,因为他是 jean 财富的受益者,或者他是否拥有 jean 的钱,或者 jean 是否让他感到犯罪。
以下是调查确定的事实:
卢克有伯纳德提供的周二不在场证明
保罗有伯纳德提供的周二不在场证明
路易斯有一个周二的不在场证明,这是卢克给的
Alain 有 Luc 给的星期四不在场证明
阿兰不是一个值得信赖的人
保罗想报复琼
卢克想报复琼
伯纳德是让财富的受益者
让是路易斯财富的受益者
路易斯拥有让的钱
Luc 拥有 Jean 的钱
琼看到阿兰犯罪
卢克拥有一把枪
路易斯有枪
阿兰拥有一把枪
解决方案
person(luc; paul; alain; bernard; louis).
alibi(luc,tuesday,bernard).
alibi(paul,tuesday,bernard).
alibi(louis,tuesday,luc).
alibi(alain,thurday,luc).
ntw(alain).
revenge(paul,jean).
revenge(luc,jean).
beneficiary(bernard, jean).
beneficiary(jean, louis).
owns(louis,jean).
owns(luc,jean).
seen(jean,alain).
gun(luc;louis;alain).
{murderer(M):person(M)} == 1.
murderer(M) :- person(M), motiv(M,jean), gun(M), not validalibi(M,tuesday,_).
validalibi(M,D,A) :- alibi(M,D,A), tw(A).
{ntw(P);tw(P)} == 1:- person(P).
motiv(P,O) :- revenge(P,O).
motiv(P,O) :- interest(P,O).
interest(P,O) :- beneficiary(P,O).
interest(P,O) :- owns(P,O).
interest(P,O) :- seen(O,P).
#show tw/1.
#show murderer/1.
我的解决方案假设只有一个凶手,每个人要么值得信赖(tw/1
),要么不(ntw/1
)。输出是
Answer: 1
murderer(alain) tw(bernard) tw(luc) tw(paul)
Answer: 2
murderer(alain) tw(bernard) tw(luc) tw(paul) tw(louis)
Answer: 3
murderer(alain) tw(bernard) tw(luc)
Answer: 4
murderer(alain) tw(bernard) tw(luc) tw(louis)
SATISFIABLE
这或多或少说:如果只有一个凶手,那就是阿兰,保罗或路易斯是否值得信赖并不重要。
推荐阅读
- php - 关于“输出缓冲区中的意外数据”的 Slim 错误与 PHP 标记或结束 PHP 标记之前的字符无关
- c++ - 无法通过 int 在 char [size] 上设置大小
- javascript - 单独倒计时
- prolog - 如何在运行时在 Jason 中添加规则
- python - 如何让熊猫从网站中用户的给定链接读取数据库?
- python - 在 python 中调整 DICOM 图像的大小
- spring - 如何在打包为战争的 Spring Boot 应用程序中加载其他属性文件?
- time-complexity - BFS 糟糕的复杂性
- python - 如何让 Tkinter 运行可执行文件?
- c# - 当值太大时,C# 代码返回方法外