Prolog中的爱因斯坦之谜

时间:2016-08-13 02:25:28

标签: prolog zebra-puzzle

我试图用Prolog解决爱因斯坦的谜语。任务是

  
      
  1. 挪威人居住在第一所房子里。
  2.   
  3. 英国人住在红楼。
  4.   
  5. 瑞典人HAS Dogs作为宠物。
  6.   
  7. 丹麦人喝茶。
  8.   
  9. 绿屋位于白宫左侧。
  10.   
  11. 住在温室里的男人喝咖啡。
  12.   
  13. 抽烟Pall Mall的男人饲养鸟类。
  14.   
  15. 居住在黄屋的男子吸烟登喜路。
  16.   
  17. 住在中间屋的男人喝牛奶。
  18.   
  19. 吸食混合物的男人住在有猫的人旁边。
  20.   
  21. 那个养马的男人住在吸烟者的旁边。
  22.   
  23. 吸蓝师的男人喝啤酒。
  24.   
  25. 德国人抽烟王子。
  26.   
  27. 挪威人居住在蓝屋旁边。
  28.   
  29. 吸烟的男人是喝水的邻居。
  30.   
  31. 有人有一个带鱼的水族馆。
  32.   

该计划:

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

1 个答案:

答案 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).