1

我正在尝试使用 Prolog 解决爱因斯坦之谜。任务是

  1. 挪威人住在第一间房子里。
  2. 英国人住在红房子里。
  3. 瑞典有狗作为宠物。
  4. 丹麦人喝茶。
  5. 绿屋在白宫的左边。
  6. 住在温室里的男人喝咖啡。
  7. 抽 Pall Mall 烟的人养鸟。
  8. 住在黄屋的男人抽登喜路。
  9. 住在中屋的男人喝牛奶。
  10. 抽 Blends 的人住在有猫的人旁边。
  11. 养马的人住在抽登喜路的人旁边。
  12. 抽蓝大师的男人喝啤酒。
  13. 德国人抽王子。
  14. 挪威人住在青瓦台旁边。
  15. 抽 Blends 的人是喝水的人的邻居。
  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).
4

1 回答 1

6

这是您必须解决解决此问题的一个原因。下面的程序片段删除了很多目标,但仍然失败。可见的部分已经对失败负责。你能从这个片段中找出原因吗?

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

:- op(950, fy, *)。
*_。

:- 初始化(邻居(_Rua))。

邻居(_ /* Rua */):-
    * 长度(Rua,5)*  Rua = [casa(_,noruegues,_,_,_)|_]* 成员(casa(vermelha,ingles,_, _,_),Rua) ,
    *  member(casa(_,sueco,_,_,cachorros),Rua) ,
    *  member(casa(_,dinamarques,cha,_,_),Rua) ,
   esquerda(casa( _ /* verde */,_,_,_,_), _ /* casa(branca,_,_,_,_) */,Rua),
    *  member(casa(verde,_,咖啡馆,_,_),Rua) ,
    * 会员(casa(_,_,_,pallmall,passaros),Rua) ,
    * 会员(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) ,
    * 成员(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)
于 2016-08-13T11:20:48.103 回答