为啥我无法在 prolog 中得到斑马谜题的答案?

Posted

技术标签:

【中文标题】为啥我无法在 prolog 中得到斑马谜题的答案?【英文标题】:Why cant i get the answer to the zebra puzzle in prolog?为什么我无法在 prolog 中得到斑马谜题的答案? 【发布时间】:2011-11-12 09:15:55 【问题描述】:

这是我目前的代码,我正在尝试解决the zebra puzzle。

exists(A,(A,_,_,_,_)).
exists(A,(_,A,_,_,_)).
exists(A,(_,_,A,_,_)).
exists(A,(_,_,_,A,_)).
exists(A,(_,_,_,_,A)).

rightOf(A,B,(B,A,_,_,_)).
rightOf(A,B,(_,B,A,_,_)).
rightOf(A,B,(_,_,B,A,_)).
rightOf(A,B,(_,_,_,B,A)).

middleHouse(A,(_,_,A,_,_)).

firstHouse(A,(A,_,_,_,_)).

nextTo(A,B,(B,A,_,_,_)).
nextTo(A,B,(_,B,A,_,_)).
nextTo(A,B,(_,_,B,A,_)).
nextTo(A,B,(_,_,_,B,A)).
nextTo(A,B,(A,B,_,_,_)).
nextTo(A,B,(_,A,B,_,_)).
nextTo(A,B,(_,_,A,B,_)).
nextTo(A,B,(_,_,_,A,B)).

:- Houses = (house(N1,P1,S1,D1,C1),house(N2,P2,S2,D2,C2),house(N3,P3,S3,D3,C3),house(N4,P4,S4,D4,C4),house(N5,P5,S5,D5,C5)),
exists(house(english,_,_,_,red),Houses),
exists(house(spainish,dog,_,_,_),Houses),
exists(house(_,_,_,coffee,green),Houses),
exists(house(ukrainian,_,_,tea,_),Houses),
rightOf(house(_,_,_,_,green),house(_,_,_,_,ivory),Houses),
exists(house(_,dog,oldgold,_,_),Houses),
exists(house(_,_,kools,_,yellow),Houses),
middleHouse(house(_,_,_,milk,_),Houses),
firstHouse(house(norwegian,_,_,_,_),Houses),
nextTo(house(_,_,chesterfields,_,_),house(_,fox,_,_,_),Houses),
nextTo(house(_,_,kools,_,_),house(_,horse,_,_,_),Houses),
exists(house(_,_,luckystike,orangejuice,_),Houses),
exists(house(japanise,_,parliments,_,_),Houses),
nextTo(house(norwegian,_,_,_,_),house(_,_,_,_,blue),Houses),
exists(house(WaterDrinker,_,_,water,_),Houses),
exists(house(ZebraOwner,zebra,_,_,_),Houses).

我已经输入并保存为 zebra.pl,我打开它并在 SWI-prolog 中输入 [zebra],它返回一条关于 N1、P1、C1 等的单例使用的警告消息。然后返回是的,然后我要求它使用 print(WaterDrinker) 打印饮水器,它返回 _G317 和 true,

为什么这样做而不返回可能是挪威语的答案,如果我要求它返回任何变量,如 C3 或 ZebraOwner,它的作用相同

【问题讨论】:

阅读 wiki 文章让我很头疼。 【参考方案1】:

主要问题是您不能在程序中间编写像:- Houses = ... 这样的目标。相反,你应该写类似

solution(WaterDrinker, ZebraOwner) :-
    Houses = ...

然后在程序加载完毕后输入

 solution(W, Z).

-? 提示下计算解。

您也没有指定所有值都应该是不同的。如果您这样做,您将再次使用这些变量,警告就会消失。

如果你真的只需要一个变量,你可以在它前面加上一个下划线来消除警告。或者您可以只使用下划线,就像您已经多次使用的那样。

【讨论】:

以上是关于为啥我无法在 prolog 中得到斑马谜题的答案?的主要内容,如果未能解决你的问题,请参考以下文章

在 Prolog 中使用约束和排列解决难题

斑马之谜的年龄比较

为啥我无法通过 Prolog 获得 Ship Puzzle 的答案?

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

斑马谜题真值表

序言和逻辑谜题