我试图用Prolog解决爱因斯坦的谜语。任务是
- 挪威人居住在第一所房子里。
- 英国人住在红楼。
- 瑞典人HAS Dogs作为宠物。
- 丹麦人喝茶。
- 绿屋位于白宫左侧。
- 住在温室里的男人喝咖啡。
- 抽烟Pall Mall的男人饲养鸟类。
- 居住在黄屋的男子吸烟登喜路。
- 住在中间屋的男人喝牛奶。
- 吸食混合物的男人住在有猫的人旁边。
- 那个养马的男人住在吸烟者的旁边。
- 吸蓝师的男人喝啤酒。
- 德国人抽烟王子。
- 挪威人居住在蓝屋旁边。
- 吸烟的男人是喝水的邻居。
- 有人有一个带鱼的水族馆。
醇>
该计划:
neighbor(Rua):-
length(Rua, 5),
Rua = [casa(_,noruegues,_,_,_)|_],
member(casa(vermelha,ingles,_,_,_),Rua),
member(casa(_,sueco,_,_,cachorros),Rua),
member(casa(_,dinamarques,cha,_,_),Rua),
esquerda(casa(verde,_,_,_,_), casa(branca,_,_,_,_),Rua),
member(casa(verde,_,cafe,_,_),Rua),
member(casa(_,_,_,pallmall,passaros),Rua),
member(casa(amarela,_,_,dunhill,_),Rua),
Rua = [_,_,casa(_,_,leite,_,_),_,_],
ao_lado(casa(_,_,_,blends,_), casa(_,_,_,_,gatos),Rua),
ao_lado(casa(_,_,_,_,cavalos), casa(_,_,_,dunhill,_),Rua),
member(casa(_,_,cerveja,bluemaster,_),Rua),
member(casa(_,alemao,_,prince,_),Rua),
ao_lado(casa(_,noruegues,_,_,_), casa(azul,_,_,_,_),Rua),
ao_lado(casa(_,_,_,blends,_), casa(_,_,agua,_,_),Rua),
member(casa(_,_,_,_,peixes),Rua).
ao_lado([X,Y|_],X, Y).
ao_lado([X,Y|_],Y, X).
ao_lado([_|L],X, Y):-
ao_lado(L, X, Y).
esquerda([A|As], A, E) :-
member2(E, As).
esquerda([_|As], A, E) :-
esquerda(As, A, E).
答案 0 :(得分:6)
以下是您必须解决此问题的原因之一。程序碎片下面已经删除了很多目标,但它仍然失败了。仅可见部分已经导致失败。你能从这个片段中找出原因吗?
(有关此方法的更多信息,请参阅 this 说明。)
:- op(950, fy, *). *_. :- initialization(neighbor(_Rua)). neighbor(_/*Rua*/):- *length(Rua, 5), *Rua = [casa(_,noruegues,_,_,_)|_], *member(casa(vermelha,ingles,_,_,_),Rua), *member(casa(_,sueco,_,_,cachorros),Rua), *member(casa(_,dinamarques,cha,_,_),Rua), esquerda(casa(_/*verde*/,_,_,_,_), _/*casa(branca,_,_,_,_)*/,Rua), *member(casa(verde,_,cafe,_,_),Rua), *member(casa(_,_,_,pallmall,passaros),Rua), *member(casa(amarela,_,_,dunhill,_),Rua), *Rua = [_,_,casa(_,_,leite,_,_),_,_], *ao_lado(casa(_,_,_,blends,_), casa(_,_,_,_,gatos),Rua), *ao_lado(casa(_,_,_,_,cavalos), casa(_,_,_,dunhill,_),Rua), *member(casa(_,_,cerveja,bluemaster,_),Rua), *member(casa(_,alemao,_,prince,_),Rua), *ao_lado(casa(_,noruegues,_,_,_), casa(azul,_,_,_,_),Rua), *ao_lado(casa(_,_,_,blends,_), casa(_,_,agua,_,_),Rua), *member(casa(_,_,_,_,peixes),Rua). esquerda([A|As], _/*A*/, E) :- *member(E, As). esquerda([_|As], A, E) :- *esquerda(As, A, E).