Prolog中的爱因斯坦之谜

Had*_*oto 1 prolog zebra-puzzle

我正试图用Prolog解决爱因斯坦之谜.任务是

  1. 挪威人居住在第一所房子里.
  2. 英国人住在红楼.
  3. 瑞典有狗作为宠物.
  4. 丹麦人喝茶.
  5. 绿屋位于白宫的左侧.
  6. 住在温室里的男人喝咖啡.
  7. 抽烟Pall Mall的男人饲养鸟类.
  8. 住在黄屋的那个人抽烟了登喜路.
  9. 住在中楼的男人喝牛奶.
  10. 抽烟的人混合生活在有猫的人旁边.
  11. 养马的男人住在吸烟登喜路的旁边.
  12. 抽烟师傅的男人喝啤酒.
  13. 德国人抽烟王子.
  14. 挪威人居住在蓝屋旁边.
  15. 抽烟混合的男人是喝水的邻居.
  16. 有人有一个带鱼的水族馆.

该程序:

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).
Run Code Online (Sandbox Code Playgroud)

fal*_*lse 6

这里是你的原因之一必须解决来解决这个问题.程序碎片下面已经删除了很多目标,但它仍然失败了.仅可见部分已经导致失败.你能从这个片段中找出原因吗?

(有关此方法的更多信息,请参阅 说明.)

:- 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).