【问题标题】:Murder puzzle in ASPASP 中的谋杀谜题
【发布时间】:2020-12-13 16:48:22
【问题描述】:

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

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

Luc、Paul、Alain、Bernard 和 Louis。

要遵循的规则是:

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

  2. 一个不值得信任的人提供的不在场证明不是 接受。

  3. 如果某个人对 jean 有特殊兴趣,他就有杀死 jean 的动机 杀了让,否则他要报仇。

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

以下是调查确定的事实:

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

伯纳德给了保罗周二的不在场证明

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

阿兰有一个星期四的不在场证明,这是 Luc 给的

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

保罗想报复琼

卢克想报复琼

伯纳德是琼财富的受益者

让是路易斯财富的受益者

路易斯拥有钱给琼

Luc 拥有 Jean 的钱

让看到阿兰犯罪

卢克有一把枪

路易斯有一把枪

阿兰有一把枪

【问题讨论】:

  • 这是斑马拼图的变体,您可以在stackoverflow.com/questions/23482224/… 中查看用 ASP 解决此问题的技术
  • @vukk 感谢您的链接。在我看来,这个谜题不仅仅是斑马,因为人们会说谎;这使得在 ASP 中解决更具吸引力
  • @vukk 哦,你是对的。谢谢。

标签: answer-set-programming clingo


【解决方案1】:
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

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

【讨论】:

    【解决方案2】:

    我试过这个问题,这就是我的解决方案。希望对您有所帮助,如果有帮助,请点击检查并排名解决方案。

    alibi(luc,bernard,tuesday).
    alibi(paul,bernard,tuesday).
    alibi(louis,luc,tuesday).
    alibi(alain,luc,thursday).
    notrust(alain).
    revenge(paul,jean).
    revenge(luc,jean).
    benefit(bernard,jean).
    benefit(lean,louis).
    owns(louis,jean).
    owns(luc,jean).
    crime_seen(alain,jean).
    gun(luc).
    gun(louis).
    gun(alain).
    special_interest(X,jean):- benefit(X,jean);owns(X,jean);crime_seen(X,jean).
    true_alibi(X):- alibi(X,Y,tuesday), \+ notrust(Y).
    motive(X,jean):- special_interest(X,jean);revenge(X,jean).
    murderer(X,jean):- gun(X),motive(X,jean),\+ true_alibi(X).
    solve(X):-murderer(X,jean).
    

    【讨论】:

    • 您使用哪个 clgo 版本?我的也不接受 \+ 。
    • 另外请提供您的输出。
    猜你喜欢
    • 2020-08-29
    • 1970-01-01
    • 2010-11-14
    • 2017-02-16
    • 1970-01-01
    • 2013-05-03
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    相关资源
    最近更新 更多