我在Prolog中实现了爱因斯坦之谜,我试图找出谁家里有鱼。
我在此代码中找不到错误,跟踪选项无助于解决此问题;)
规则:
- 挪威人住在第一所房子
- 英国人住在一座红房子里。
- 温室位于白宫的左侧。
- 戴恩喝茶。
- 轻度吸烟者住在猫的饲养员旁边。
- 黄房子的一位居民抽着雪茄。
- 德国人抽水烟。
- 中心房子的一位居民喝牛奶。
- 轻度吸烟者有一个喝水的邻居。
- 抽烟,不带滤嘴繁殖鸟类。
- 瑞典饲养的狗。
- 挪威人住在蓝房子旁边。
- 马的饲养员住在黄色的房子旁边。
- 抽薄荷醇喝啤酒。
- 在温室里,他们喝咖啡。
这是我的代码:
on_the_left(X, Y, N) :-
Y is X - 1,
+ Y < 1,
+ X > N.
next_to(X, Y, N) :-
( Y is X + 1;
Y is X - 1),
+ X > N,
+ Y > N,
+ X < 1,
+ Y < 1.
fish(Who) :-
Houses = [
house(1, _Color1, _From1, _Animal1, _Drink1, _Smoke1),
house(2, _Color2, _From2, _Animal2, _Drink2, _Smoke2),
house(3, _Color3, _From3, _Animal3, _Drink3, _Smoke3),
house(4, _Color4, _From4, _Animal4, _Drink4, _Smoke4),
house(5, _Color5, _From5, _Animal5, _Drink5, _Smoke5) ],
N is 5,
%-- hint 1
member(house(1, _, norway, _, _, _), Houses),
%-- hint 2
member(house(_, red, england, _, _, _), Houses),
%-- hint 3 - on_the_left
member(house(GREEN, green, _, _, _, _), Houses),
member(house(WHITE, white, _, _, _, _), Houses),
on_the_left(GREEN, WHITE, N),
%-- hint 4
member(house(_, _, denmark, _, tea, _), Houses),
%-- hint 5 - next_to
member(house(LIGHT, _, _, _, _, light), Houses),
member(house(CAT, _, _, cat, _, light), Houses),
next_to(LIGHT, CAT, N),
%-- hint 6
member(house(_, yellow, _, _, _, cigar), Houses),
%-- hint 7
member(house(_, _, germany, _, _, waterpipe), Houses),
%-- hint 8
member(house(3, _, _, _, milk, _), Houses),
%-- hint 9 - next_to
member(house(WATER, _, _, _, water, _), Houses),
next_to(LIGHT, WATER, N),
%-- hint 10
member(house(_, _, _, bird, _, nofilter), Houses),
%-- hint 11
member(house(_, _, sweden, dog, _, _), Houses),
%-- hint 12 - next_to
member(house(NORWAY, _, norway, _, _, _), Houses),
member(house(BLUE, blue, _, _, _, _), Houses),
next_to(NORWAY, BLUE, N),
%-- hint 13 - next_to
member(house(HORSE, _, _, horse, _, _), Houses),
next_to(HORSE, GREEN, N),
%-- hint 14
member(house(_, _, _, _, beer, menthol), Houses),
%-- hint 15
member(house(_, green, _, _, coffee, _), Houses),
%-- FINAL QUESTION - WHO LET THE FISH OUT?
member(house(_, _, _, fish, _, _), Houses),
member(house(_, _, Who, fish, _, _), Houses).
我尝试了很多组合,但是:
?- 鱼(谁)。
假。
编辑:
代码现在可以工作了,我改变了什么:
1* 来自:
%-- hint 5 - next_to
member(house(LIGHT, _, _, _, _, light), Houses),
member(house(CAT, _, _, cat, _, light), Houses),
自:
%-- hint 5 - next_to
member(house(LIGHT, _, _, _, _, light), Houses),
member(house(CAT, _, _, cat, _, _), Houses),
2* 来自:
%-- hint 13 - next_to
member(house(HORSE, _, _, horse, _, _), Houses),
next_to(HORSE, GREEN, N),
自:
%-- hint 13 - next_to
member(house(YELLOW, yellow, _, _, _, _), Houses),
member(house(HORSE, _, _, horse, _, _), Houses),
next_to(HORSE, YELLOW, N),
如果您正在阅读本文,请查看@Enigmativity有关帮助程序谓词中结构的评论。
你的线索中有两个错误——第一个你已经用light
吸烟者修复了。二是horse
主人住在yellow
房子旁边,而不是green
。
现在,我的 prolog 被 +
运算符噎住了,所以我重新编码了你的帮助器谓词。这是我所做的:
first(H,[H|_])。on_the_left(X,Y,[X,Y|_])。on_the_left(X,Y,[_|Hs]) :- on_the_left(X,Y,Hs).next_to(X,Y,[X,Y|_])。next_to(X,Y,[Y,X|_]).next_to(X,Y,[_|Hs]) :- next_to(X,Y,Hs).middle(X,[_,_,X,_,_])。
现在,这个谜题很好地处理了这些线索:
鱼(谁) :- 房屋 = [ 房子(_Color1, _From1, _Animal1, _Drink1, _Smoke1), 房子(_Color2, _From2, _Animal2, _Drink2, _Smoke2), 房子(_Color3, _From3, _Animal3, _Drink3, _Smoke3), 房子(_Color4, _From4, _Animal4, _Drink4, _Smoke4), 房子(_Color5, _From5, _Animal5, _Drink5, _Smoke5) ], first(house(_, norway, _, _), Houses), %-- hint 1 成员(房子(红色, 英格兰, _, _, _), 房子), %-- 提示 2 on_the_left(房子(绿色, _, _, _), 房子(白色, _, _, _), 房子), %-- 提示 3 - on_the_left 成员(房子(_, 丹麦, _, 茶, _), 房子), %-- 提示 4 next_to(房子(_, _, _, 光), 房子( _, _, 猫, _, _), 房子), %-- 提示 5 - next_to 成员(房子(黄色, _, _, _, 雪茄), 房子), %-- 提示 6 成员(房子(_, 德国, _, _, 水管), 房子), %-- 提示 7 middle(house(_, _, _, milk, _), Houses), %-- hint 8 next_to(房子(_, _, _, 光), 房子(_, _, _, 水, _), 房子), %-- 提示 9 - next_to 成员(房子(_, _, 鸟, _, 无过滤器), 房子), %-- 提示 10 成员(房子(_, 瑞典, 狗, _, _), 房子), %-- 提示 11 next_to(房子(_, 挪威, _, _, _), 房子(蓝色, _, _, _), 房子), %-- 提示 12 - next_to next_to(房子(_, _, 马, _, _), 房子(黄色, _, _, _), 房子), %-- 提示 13 - next_to 成员(房子(_, _, _, 啤酒, 薄荷醇), 房子), %-- 提示 14 成员(房子(绿色, _, _, 咖啡, _), 房子), %-- 提示 15 成员(房子(_, 谁, 鱼, _, _), 房子), 写(房子),nl。
我得到了:
[房子(黄色,挪威,猫,水,雪茄),房子(蓝色,丹麦,马,茶,光),房子(红色,英格兰,鸟,牛奶,无过滤器),房子(绿色,德国,鱼,咖啡,水烟),房子(白色,瑞典,狗,啤酒,薄荷醇)]德国
只是为了显示另一种编码方案:
solve :- solve(Sol, From), writeln(From), maplist(writeln, Sol).
solve(Sol, From) :-
phrase( (from(1, norway)
,color(red) = from(england)
,color(GREEN, green), color(WHITE, white), {GREEN is WHITE-1}
,from(denmark) = drink(tea)
,smoke(Light, light), animal(Cat, cat), next_to(Light, Cat)
,color(Yellow, yellow), smoke(Yellow, cigar)
,from(germany) = smoke(waterpipe)
,drink(3, milk)
,drink(Water, water), next_to(Light, Water)
,animal(bird) = smoke(nofilter)
,from(sweden) = animal(dog)
,from(NORWAY, norway), color(BLUE, blue), next_to(NORWAY, BLUE)
,animal(HORSE, horse), next_to(HORSE, GREEN) % next_to(HORSE, Yellow)
,drink(beer) = smoke(menthol)
,color(green) = drink(coffee)
,animal(Fish, fish), from(Fish, From)
), [[1,_,_,_,_,_],
[2,_,_,_,_,_],
[3,_,_,_,_,_],
[4,_,_,_,_,_],
[5,_,_,_,_,_]
], Sol).
state(S), [A,B,C,D,E] --> [A,B,C,D,E], {member(S, [A,B,C,D,E])}.
color(A, B) --> state([A,B,_,_,_,_]).
from(A, B) --> state([A,_,B,_,_,_]).
animal(A, B) --> state([A,_,_,B,_,_]).
drink(A, B) --> state([A,_,_,_,B,_]).
smoke(A, B) --> state([A,_,_,_,_,B]).
X = Y --> {
X=..[Fx|Ax], Y=..[Fy|Ay],
Xs=..[Fx,S|Ax], Ys=..[Fy,S|Ay]
}, call(Xs), call(Ys).
next_to(X, Y) --> {1 is abs(X-Y)}.