首页 > 解决方案 > ASP 中的谋杀谜题

问题描述

所以在标签序言下我发现了这个谜题(原始帖子),我想:这在 ASP 中会更好。所以我把这个问题放在这里作为任何想和我一起解决难题的人的问题。我自己找到解决方案后会立即回答这个问题,我很乐意将我的代码与您的代码进行比较。谢谢你。

珍在星期二被杀;唯一的嫌疑人是:

卢克、保罗、阿兰、伯纳德和路易斯。

要遵循的规则是:

  1. 凶手是一个有杀人动机的人,他拥有一把枪,并且在星期二没有不在场证明。

  2. 不接受不值得信赖的人提供的不在场证明。

  3. 如果某人对杀死 jean 有特殊兴趣或想要报复,他就有杀死 jean 的动机。

  4. 有人对杀死 jean 有特殊兴趣,因为他是 jean 财富的受益者,或者他是否拥有 jean 的钱,或者 jean 是否让他感到犯罪。

以下是调查确定的事实:

卢克有伯纳德提供的周二不在场证明

保罗有伯纳德提供的周二不在场证明

路易斯有一个周二的不在场证明,这是卢克给的

Alain 有 Luc 给的星期四不在场证明

阿兰不是一个值得信赖的人

保罗想报复琼

卢克想报复琼

伯纳德是让财富的受益者

让是路易斯财富的受益者

路易斯拥有让的钱

Luc 拥有 Jean 的钱

琼看到阿兰犯罪

卢克拥有一把枪

路易斯有枪

阿兰拥有一把枪

标签: answer-set-programmingclingo

解决方案


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

这或多或少说:如果只有一个凶手,那就是阿兰,保罗或路易斯是否值得信赖并不重要。


推荐阅读