zebra_owner(Owner) :-
houses(Hs),
member(h(Owner,zebra,_,_,_), Hs).
water_drinker(Drinker) :-
houses(Hs),
member(h(Drinker,_,_,water,_), Hs).
houses(Hs) :-
length(Hs, 5), % 1
member(h(english,_,_,_,red), Hs), % 2
member(h(spanish,dog,_,_,_), Hs), % 3
member(h(_,_,_,coffee,green), Hs), % 4
member(h(ukrainian,_,_,tea,_), Hs), % 5
adjacent(h(_,_,_,_,green), h(_,_,_,_,white), Hs), % 6
member(h(_,snake,winston,_,_), Hs), % 7
member(h(_,_,kool,_,yellow), Hs), % 8
Hs = [_,_,h(_,_,_,milk,_),_,_], % 9
Hs = [h(norwegian,_,_,_,_)|_], % 10
adjacent(h(_,fox,_,_,_), h(_,_,chesterfield,_,_), Hs), % 11
adjacent(h(_,_,kool,_,_), h(_,horse,_,_,_), Hs), % 12
member(h(_,_,lucky,juice,_), Hs), % 13
member(h(japanese,_,kent,_,_), Hs), % 14
adjacent(h(norwegian,_,_,_,_), h(_,_,_,_,blue), Hs), % 15
member(h(_,_,_,water,_), Hs), % one of them drinks water
member(h(_,zebra,_,_,_), Hs). % one of them owns a zebra
adjacent(A, B, Ls) :- append(_, [A,B|_], Ls).
adjacent(A, B, Ls) :- append(_, [B,A|_], Ls).
如果列表实际上一直是空的,为什么houses(Hs)
谓词不会通过各种检查?member(elem, list)
我知道这听起来可能是个愚蠢的问题,但围绕 Prolog 进行思考实际上很难,尤其是在多年的面向对象编程之后。任何帮助表示赞赏!
编辑:我没有提到我问序言的查询,就是这个zebra_owner(Owner)
编辑2:还发布问题的文本(有点著名)以供参考:
- 一排五座彩色的房子,每座都有一个主人、一只宠物、香烟和一杯饮料。
- 英国人住在红房子里。
- 西班牙人有一条狗。
- 他们在温室里喝咖啡。
- 乌克兰人喝茶。
- 绿房子紧挨着白房子。
- 温斯顿吸烟者有一条蛇。
- 在黄色的房子里,他们抽 Kool。
- 在中间房子里,他们喝牛奶。
- 挪威人住在左边第一个房子里。
- 切斯特菲尔德吸烟者住在养狐狸的人附近。
- 在有马的房子附近的房子里,他们抽着库尔。
- Lucky Strike 吸烟者喝果汁。
- 日本人抽肯特。
- 挪威人住在蓝屋附近。
谁拥有斑马,谁喝水?