我正在尝试用Prolog解决爱因斯坦难题。
我遇到了困难,我的基本方法是添加所有约束条件,然后让Prolog找出唯一可能的解决方案。
问题是Prolog找不到任何解决方案。我已经分离出导致程序从给定的解决方案到无解的约束条件,但我不明白为什么会这样。
/*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。
我希望能够理解为什么会这样。 我注意到在部分解决方案中,挪威人出现了两次,这可能是问题所在。
riddle/1
谓词中的最后一行缺少一个house
参数:exists(house(_,japanese,parlament,_), Houses)
。应该是exists(house(_,japanese,_,parlament,_), Houses)
。 - lurker