Prolog 中的爱因斯坦谜题

Posted

技术标签:

【中文标题】Prolog 中的爱因斯坦谜题【英文标题】:Einstein puzzle in Prolog 【发布时间】:2016-12-20 02:18:44 【问题描述】:

我正在尝试使用 Prolog 解决爱因斯坦之谜。任务是

    挪威人住在第一所房子里。 英国人住在红房子里。 瑞典人有狗作为宠物。 丹麦人喝茶。 绿屋位于白宫左侧。 住在温室里的男人喝咖啡。 抽Pall Mall烟的人养鸟。 住在黄屋的人抽登喜路。 住在中屋的男人喝牛奶。 抽 Blends 的人住在养猫的人旁边。 养马的人住在抽登喜路的人旁边。 抽蓝大师的人喝啤酒。 德国人抽王子烟。 挪威人住在蓝屋旁边。 抽 Blends 的人是喝水的人的邻居。 有人有一个鱼缸。

程序:

neighbor(Rua):-
   length(Rua, 5),
   Rua = [casa(_,noruegues,_,_,_)|_],
   member(casa(vermelha,ingles,_,_,_),Rua),
   member(casa(_,sueco,_,_,cachorros),Rua),
   member(casa(_,dinamarques,cha,_,_),Rua),
   esquerda(casa(verde,_,_,_,_), casa(branca,_,_,_,_),Rua),
   member(casa(verde,_,cafe,_,_),Rua),
   member(casa(_,_,_,pallmall,passaros),Rua),
   member(casa(amarela,_,_,dunhill,_),Rua),
   Rua = [_,_,casa(_,_,leite,_,_),_,_],
   ao_lado(casa(_,_,_,blends,_), casa(_,_,_,_,gatos),Rua),
   ao_lado(casa(_,_,_,_,cavalos), casa(_,_,_,dunhill,_),Rua),
   member(casa(_,_,cerveja,bluemaster,_),Rua),
   member(casa(_,alemao,_,prince,_),Rua),
   ao_lado(casa(_,noruegues,_,_,_), casa(azul,_,_,_,_),Rua),
   ao_lado(casa(_,_,_,blends,_), casa(_,_,agua,_,_),Rua),
   member(casa(_,_,_,_,peixes),Rua).

ao_lado([X,Y|_],X, Y).
ao_lado([X,Y|_],Y, X).
ao_lado([_|L],X, Y):-
   ao_lado(L, X, Y).

esquerda([A|As], A, E) :-
   member2(E, As).
esquerda([_|As], A, E) :-
   esquerda(As, A, E).

【问题讨论】:

Einstein Riddle with List of terms的可能重复 【参考方案1】:

这是您必须解决此问题的原因之一。下面的程序片段删除了很多目标,但仍然失败。可见的部分已经对失败负责。你能从这个片段中找出原因吗?

(有关此方法的更多信息,请参阅 this 解释。)

:- op(950, fy, *)。 *_。 :- 初始化(邻居(_Rua))。 邻居(_/*Rua*/):- * 长度(Rua, 5), * Rua = [casa(_,noruegues,_,_,_)|_], * 成员(casa(vermelha,ingles,_,_,_),Rua), * 会员(casa(_,sueco,_,_,cachorros),Rua), * 成员(casa(_,dinamarques,cha,_,_),Rua), esquerda(casa(_/*verde*/,_,_,_,_), _/*casa(布兰卡,_,_,_,_)*/,Rua), * 会员(casa(verde,_,cafe,_,_),Rua), * 会员(casa(_,_,_,pallmall,passaros),Rua), * 会员(casa(amarela,_,_,dunhill,_),Rua), * Rua = [_,_,casa(_,_,leite,_,_),_,_], * ao_lado(casa(_,_,_,blends,_), casa(_,_,_,_,gatos),Rua), * ao_lado(casa(_,_,_,_,cavalos), casa(_,_,_,dunhill,_),Rua), * member(casa(_,_,cerveja,bluemaster,_),Rua), * 会员(casa(_,alemao,_,prince,_),Rua), * ao_lado(casa(_,noruegues,_,_,_), casa(azul,_,_,_,_),Rua), * ao_lado(casa(_,_,_,blends,_), casa(_,_,agua,_,_),Rua), * 成员(casa(_,_,_,_,peixes),Rua)。 esquerda([A|As], _/*A*/, E) :- * 成员(E,As)。 esquerda([_|As], A, E) :- * esquerda(As, A, E)

【讨论】:

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

爱因斯坦谜语使用 Prolog

有没有办法在 Prolog 中扩展爱因斯坦的谜语?

列表中的唯一元素(Prolog)

爱因斯坦之谜

斑马拼图 - 谁住在哪一层?

斑马谜题真值表