爱因斯坦谜语使用 Prolog

Posted

技术标签:

【中文标题】爱因斯坦谜语使用 Prolog【英文标题】:Einstein Riddle using Prolog 【发布时间】:2016-08-17 10:11:46 【问题描述】:

我正在尝试使用 Prolog 解决爱因斯坦之谜。当我试图通过房屋(Hs)运行时,它显示 No. Task is

    英国人住在红房子里。 瑞典人养狗作为宠物。 丹麦人喝茶。 温室就在白宫的左边。 温室的主人喝咖啡。 抽 Pall Mall 烟的店主养鸟。 黄房子的主人抽登喜路。 住在中心屋的主人喝牛奶。 挪威人住在第一所房子里。 抽 Blends 的主人住在养猫的主人旁边。 养马的主人住在抽登喜路的主人旁边。 抽 Bluemasters 的店主喝啤酒。 德国人抽王子烟。 挪威人住在蓝屋旁边。 抽 Blends 的主人住在喝水的人旁边。
房屋(Hs):- 长度(Hs,5), 成员(h(英语,_,_,_,红色),Hs), 成员(h(瑞典人,狗,_,_,_),Hs), 成员(h(_,_,_,咖啡,绿色),Hs), 成员(h(丹麦人,_,_,茶,_),Hs), 下一个(h(_,_,_,_,green), h(_,_,_,_,white), Hs), 成员(h(_,鸟,'Pall Mall',_,_),Hs), 成员(h(_,_,'登喜路',_,黄色),Hs), Hs = [_,_,h(_,_,_,牛奶,_),_,_], Hs = [h(挪威语,_,_,_,_)|_], 下一个(h(_,马,_,_,_), h(_,_,'登喜路',_,​​_), Hs), 下一个(h(_,_,混合,_,_), h(_,cat,_,_,_), Hs), 成员(h(_,_,'蓝色大师',啤酒,_),Hs), 成员(h(德语,_,'王子',_,_),Hs), 下一个(h(挪威语,_,_,_,_), h(_,_,_,_,blue), Hs), 下一个(h(_,_,'混合',_,_), h(_,_,_,水,_), Hs), 成员(h(_,鱼,_,_,_),Hs)。 下一个(A,B,Ls):-追加(_,[A,B|_],Ls)。 下一个(A,B,Ls):-追加(_,[B,A|_],Ls)。

我不知道出了什么问题。谢谢

【问题讨论】:

next 在哪里定义?它不是内置的 SWI Prolog 谓词。 很抱歉我忘记添加了。下一个(A,B,Ls):-追加(,[A,B|],Ls)。下一个(A,B,Ls):-追加(,[B,A|],Ls)。 当我试图经营房屋时(Hs)。它显示不。我不知道为什么。 @user3637775 - 您可能误译了一条规则。能贴出原始拼图文字吗? 现在您一定已经意识到您为 5 长列表提供了 6 种不同的烟雾规格:'Pall Mall', 'Dunhill', blend, 'Blue Master', 'Prince''Blend'。没有办法让他们都融入其中。否则,将规则手动转换为h(....) 规范很容易出错; better use Prolog 为那个too。 【参考方案1】:

这是您的程序的概括。我添加了一些额外的* 以删除几个目标,并用_/*origterm*/ 替换了一些术语。然而,由此产生的程序仍然失败。因此,错误必须在剩余的片段中。你没有说任何关于程序的事情(编辑:你后来添加了一些东西),所以我不(编辑:想)知道它是关于什么的。但无论如何,错误必须在剩余的可见部分:

:- 初始化(房屋(_Sol))。
:- op(950, fy, *)。
*_。

房屋(Hs):-
   长度(Hs,5),
   * member(h(english,_,_,_,red), Hs), % 2
   * 成员(h(swede,dog,_,_,_), Hs),
   * member(h(_,_,_,coffee,green), Hs),
   * 成员(h(dane,_,_,tea,_), Hs),
   * 下一个(h(_,_,_,_,green), h(_,_,_,_,white), Hs),
   member(h(_,_/*bird*/,'Pall Mall',_,_), Hs),
   成员(h(_,_,'Dunhill',_,_/*黄色*/), Hs),
   * Hs = [_,_,h(_,_,_,牛奶,_),_,_],
   * Hs = [h(挪威语,_,_,_,_)|_],
   * 下一个(h(_,马,_,_,_), h(_,_,'Dunhill',_,_), Hs),
   下一个(h(_,_,混合,_,_), _/*h(_,cat,_,_,_)*/, Hs),
   member(h(_,_,'蓝大师',_/*啤酒*/,_), Hs),
   成员(h(_/*德语*/,_,'王子',_,_), Hs),
   * 下一个(h(挪威语,_,_,_,_), h(_,_,_,_,blue), Hs),
   下一个(h(_,_,'混合',_,_), _/*h(_,_,_,water,_)*/, Hs),
   * 成员(h(_,fish,_,_,_), Hs)。

下一个(A,B,Ls):-追加(_,[A,B|_],Ls)。
下一个(A,B,Ls):-追加(_,[B,A|_],Ls)。

所剩无几!在可见部分至少有一个错误! (而且,严格来说,其他部分可能还有更多错误。我们根本不知道)。

【讨论】:

@user3637775:这能回答你的问题吗?真的应该!

以上是关于爱因斯坦谜语使用 Prolog的主要内容,如果未能解决你的问题,请参考以下文章

爱因斯坦谜语与术语列表

爱因斯坦之谜

列表中的唯一元素(Prolog)

爱因斯坦谜语中的数值比较

Prolog 中的爱因斯坦谜题

使用 clpfd Prolog 库解决斑马谜题(又名爱因斯坦谜题)