爱因斯坦谜语使用 Prolog
Posted
技术标签:
【中文标题】爱因斯坦谜语使用 Prolog【英文标题】:Einstein Riddle using Prolog 【发布时间】:2016-08-17 10:11:46 【问题描述】:我正在尝试使用 Prolog 解决爱因斯坦之谜。当我试图通过房屋(Hs)运行时,它显示 No. Task is
-
英国人住在红房子里。
瑞典人养狗作为宠物。
丹麦人喝茶。
温室就在白宫的左边。
温室的主人喝咖啡。
抽 Pall Mall 烟的店主养鸟。
黄房子的主人抽登喜路。
住在中心屋的主人喝牛奶。
挪威人住在第一所房子里。
抽 Blends 的主人住在养猫的主人旁边。
养马的主人住在抽登喜路的主人旁边。
抽 Bluemasters 的店主喝啤酒。
德国人抽王子烟。
挪威人住在蓝屋旁边。
抽 Blends 的主人住在喝水的人旁边。
我不知道出了什么问题。谢谢
【问题讨论】:
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的主要内容,如果未能解决你的问题,请参考以下文章