gpt4 book ai didi

prolog - 在 Prolog 中解答爱因斯坦之谜

转载 作者:行者123 更新时间:2023-12-02 01:20:32 25 4
gpt4 key购买 nike

我正在尝试解决Einstein Riddle在序言中。

我编写的程序遇到了困难,基本方法是添加所有约束并让 Prolog 找出唯一可能的解决方案。

问题是 Prolog 找到了 0 个解。我已经隔离了使程序从给定解决方案变为无解决方案的约束,但我不明白为什么。

/*There are five houses*/
exists(A, list(A,_,_,_,_)).
exists(A, list(_,A,_,_,_)).
exists(A, list(_,_,A,_,_)).
exists(A, list(_,_,_,A,_)).
exists(A, list(_,_,_,_,A)).

middle_house(A, list(_,_,A,_,_)).

first_house(A, list(A,_,_,_,_)).

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

/* each statement will be described using the clues
house conatins: Color,Owner, Drinks, Smokes, Pet*/
riddle(Houses):-
/*exists(house(red, englishman, _,_,_),Houses),*/
nextTo(house(_,norwegian,_,_,_), house(blue,_,_,_,_), Houses),
exists(house(_,spanish,_,_, dog), Houses),
exists(house(green, _, coffee, _,_), Houses),
exists(house(_, ukrain, tea,_,_), Houses),
nextTo(house(white,_,_,_,_), house(green,_,_,_,_), Houses),
exists(house(_,_,_,marlbero, cat),Houses),
exists(house(yellow,_,_,time,_), Houses),
middle_house(house(_,_,milk,_,_), Houses),
first_house(house(_,norwegian,_,_,_), Houses),
nextTo(house(_,_,_,_,fox), house(_,_,_,montena,_), Houses),
nextTo(house(_,_,_,time,_), house(_,_,_,_,horse), Houses),
exists(house(_,_,orange,lucky,_), Houses),
exists(house(_,japanese,parlament,_), Houses).

当前的解决方案是这样的:

?- riddle(Houses).
Houses = list( house(green, norwegian, coffee, marlbero, cat),
house(white, spanish, orange, lucky, dog),
house(yellow, norwegian, milk, time, fox),
house(blue, ukrain, tea, montena, horse),
house(_G7257, japanese, parlament, _G7260)).

如果我取消注释第一行,那么同一语句将返回 false。

我希望帮助理解为什么会出现这种情况。我注意到在部分解决方案中挪威语出现了两次,这可能表明了问题。

最佳答案

以下是您可以自行解决此问题的一般方法。事实上,你确实是从一个非常有希望的方向开始的:你试图消除目标。但是,在你的案件中,谁有过错呢?您注释掉的行还是其余的?你不能肯定地说,因为生成的程序已经工作了。但有一种非常相似且更有希望的方法:尝试尽可能地概括你的程序,这样它仍然会失败。通过这种方式,您将获得一个较小的程序来对失败负责。也就是说,在剩余的可见部分中必须是一个错误!

这是我通过删除目标(在前面添加 *)并用 _ 替换一些术语得到的结果。

:- initialization(riddle(_Sol)).:- op(950, fy, *).*_.riddle(Houses):-    exists(house(red, _/* englishman */, _,_,_),Houses),    nextTo(house(_,_/* norwegian */,_,_,_), house(blue,_,_,_,_), Houses),    * exists(house(_,spanish,_,_, dog), Houses),    * exists(house(green, _, coffee, _,_), Houses),    * exists(house(_, ukrain, tea,_,_), Houses),    nextTo(house(white,_,_,_,_), house(green,_,_,_,_), Houses),    * exists(house(_,_,_,marlbero, cat),Houses),    exists(house(yellow,_,_,_/* time */,_), Houses),    * middle_house(house(_,_,milk,_,_), Houses),    * first_house(house(_,norwegian,_,_,_), Houses),    * nextTo(house(_,_,_,_,fox), house(_,_,_,montena,_), Houses),    * nextTo(house(_,_,_,time,_), house(_,_,_,_,horse), Houses),    * exists(house(_,_,orange,lucky,_), Houses),    exists(house(_,_/* japanese */,_/* parlament */,_), Houses).

该片段仍然失败,因此错误必须位于程序的可见部分。

似乎所有房子的颜色都存在是很重要的。只有一个目标根本不包含任何房屋颜色...看到了吗?

关于prolog - 在 Prolog 中解答爱因斯坦之谜,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45823382/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com