我正在实现爱因斯坦谜题的一个变体,但遇到了一些困难。
在尝试计算解决方案时,我尝试了这个方法:
solve(Street) :- Street = [_House1,_House2,_House3,_House4,_House5],
%hint one goes here
%hint two goes here
%etc.
我可以通过输入以下命令来寻求解决方案: solve(Street)
然而,这个解决方案如下:
- house(flower, food, pet, sport)
- house(flower, food, pet, sport)
- house(x , food, pet, sport)
- house(flower, food, pet, sport)
- 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
。
该提示可以翻译为:喜欢足球的人住在养鱼的人旁边。
如果需要提供更多信息,我很乐意解释。 :)
flowers(Street, Flowers)
和排列放入solve(Street)
中。但现在它似乎无法结束。(通常它会在5分钟内结束,但现在已经超过15分钟了。)我把permutation
放在哪里有关系吗? - Aerus