列表中的唯一元素(Prolog)

5

我正在实现爱因斯坦谜题的一个变体,但遇到了一些困难。

在尝试计算解决方案时,我尝试了这个方法:

solve(Street) :- Street = [_House1,_House2,_House3,_House4,_House5],
%hint one goes here
%hint two goes here
%etc.

我可以通过输入以下命令来寻求解决方案: solve(Street)

然而,这个解决方案如下:

  1. house(flower, food, pet, sport)
  2. house(flower, food, pet, sport)
  3. house(x , food, pet, sport)
  4. house(flower, food, pet, sport)
  5. house(x, flower, pet, sport)

正如您所看到的,有两个x,其余都是各种食物、花卉、宠物和运动。但每种类型都是唯一的:如果一个人喜欢花X,其他人就不能喜欢X。

现在,我的解决方案为什么会出现2个x很容易理解:我们得到了一些提示,但所有的提示中只提到了4种花。因此Prolog不知道还有另一种花,只是使用了两次x,因为这是可能的,并且满足所有其他提示。

我的意思是,Street中的所有食物、花卉等类型都是唯一的,所以当他已经使用了所有类型时,应该留下一些空白。3看起来像:house(x , food, pet ,sport),5看起来像:house(_, flower, pet, sport)

我也尝试将这个提示添加到提示中:member(house(cactus,_,_,_), Street)

然而,我的程序就不会结束...

提示可能是这样的: is_neighbour(house(_,_,_,football),house(_,_,fish,_), Street), 其中:is_neighbour(A,B,List)List中A和B相邻时返回true。 该提示可以翻译为:喜欢足球的人住在养鱼的人旁边。

如果需要提供更多信息,我很乐意解释。 :)

1个回答

2
为了表达没有任何花被报告两次的意思,并确保所有的花都被绑定,您可以使用permutation/2谓词:所有花的列表应该是指定花的列表的排列。这样就可以像这样阅读[未经测试]。
flowers([], []).
flowers([house(Flower,_,_,_)|Street], [Flower|Rest]) :- flowers(Street, Rest).

-- ...
   flowers(Street, Flowers), 
   permutation(Flowers, [kaktus, tulpe, nelke, rose, fingerhut]),

编辑:对于10朵花,使用排列可能太慢了。另一种方法是

flower(kaktus).
flower(tulpe).
flower(nelke).
--...

       flowers(Street,[F1,F2,F3,F4,F5,F6,F7,F8,F9,F10]),
       flower(F1), flower(F2), F1\=F2,
       flower(F3), F3\=F1, F3\=F2,
       flower(F4), F4\=F1, F4\=F2, F4\=F3,
       --...

听起来是一个合乎逻辑且易于理解的答案,但我一定做错了什么...我已经将第二个排列列表中的所有花卉添加进去了。我还将flowers(Street, Flowers)和排列放入solve(Street)中。但现在它似乎无法结束。(通常它会在5分钟内结束,但现在已经超过15分钟了。)我把permutation放在哪里有关系吗? - Aerus
我相信我在写入方面做错了什么。这是我的代码:http://pastebin.com/5TjJJ5nj(它很长,但所有的东西都很相似,所以在阅读时可以跳过)。你能告诉我在哪里放这个写入吗?另外,当我不传递任何参数时,我该把什么作为写入的参数,因为它会给我一个错误... - Aerus
你能否请提供你在代码中添加写入调用的版本链接? - Aerus
请看我的编辑。对于十个元素来说,使用排列是不合适的(您最初发布的只有5个房子)。 - Martin v. Löwis
你应该在关键位置编写语句,以查明事物如何绑定。据我所知,=是对称的。至于它的作用-我不想解释,因为你应该能够自己解释它。请记住,在代码中更早地放置具有较少替代方案的更具体的约束条件更好。 - Martin v. Löwis
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接