【问题标题】:Einstein puzzle in PrologProlog 中的爱因斯坦谜题
【发布时间】:2016-12-20 02:18:44
【问题描述】:

我正在尝试使用 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).

【问题讨论】:

标签: prolog zebra-puzzle


【解决方案1】:

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

(有关此方法的更多信息,请参阅 this 解释。)

:- op(950, fy, *)。 *_。 :- 初始化(邻居(_Rua))。 邻居(_/*Rua*/):- * 长度(Rua, 5), * Rua = [casa(_,noruegues,_,_,_)|_], * 成员(casa(vermelha,ingles,_,_,_),Rua), * 会员(casa(_,sueco,_,_,cachorros),Rua), * 成员(casa(_,dinamarques,cha,_,_),Rua), esquerda(casa(_/*verde*/,_,_,_,_), _/*casa(布兰卡,_,_,_,_)*/,Rua), * 会员(casa(verde,_,cafe,_,_),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), * 成员(casa(_,_,_,_,peixes),Rua)。 esquerda([A|As], _/*A*/, E) :- * 成员(E,As)。 esquerda([_|As], A, E) :- * esquerda(As, A, E)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-17
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    相关资源
    最近更新 更多