爱因斯坦之谜在序言(Einstein puzzle in Prolog)

2019-09-27 16:57发布

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

  1. 挪威人住在第一间房子。
  2. 英国人住在红房子。
  3. 瑞典有狗作为宠物饲养。
  4. 丹麦喝茶。
  5. 绿房子是白宫的左边。
  6. 谁住在绿房子的人喝咖啡。
  7. 谁抽Pall Mall香烟的人养鸟。
  8. 该名男子居住在黄房子抽Dunhill香烟。
  9. 谁住在房子中的牛奶饮料的人。
  10. 谁抽烟共混物中的人生活旁边谁拥有猫的人。
  11. 谁养马的人住旁边给谁抽Dunhill香烟的人。
  12. 谁吸烟蓝法师的人喝啤酒。
  13. 德国人抽Prince香烟。
  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).

Answer 1:

这里是你必须解决解决这个问题的原因之一。 下面的程序片段具有相当多的去除的目标,但它仍然失败。 单独的可见部分已经失败负责。 你可以当场从这个片段的原因是什么?

(欲了解更多关于这种方法看到这个解释。)

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


文章来源: Einstein puzzle in Prolog