爱因斯坦之谜使用Prolog

时间:2016-04-23 21:16:46

标签: prolog zebra-puzzle program-slicing

我试图用Prolog解决爱因斯坦的谜语。当我试图通过房屋(Hs)运行时,它显示否。任务是

  1. 英国人住在红房子里。
  2. 瑞典人将狗作为宠物。
  3. 丹麦人喝茶。
  4. 温室就在白宫的左边。
  5. 温室的主人喝咖啡。
  6. 抽烟Pall Mall的老板饲养鸟类。
  7. 黄屋的主人吸烟登喜路。
  8. 住在中心的老板喝牛奶。
  9. 挪威人居住在第一所房子里。
  10. 吸食Blends的老板住在养猫的旁边。
  11. 让这匹马的主人住在吸烟者的旁边。
  12. 吸烟的主人喝啤酒。
  13. 德国人抽烟王子。
  14. 挪威人住在蓝屋旁边。
  15. 吸食Blends的主人住在喝水的人旁边。
  16.     houses(Hs) :-
           length(Hs, 5),                                            
           member(h(english,_,_,_,red), Hs),                         
           member(h(swede,dog,_,_,_), Hs),                         
           member(h(_,_,_,coffee,green), Hs),                        
           member(h(dane,_,_,tea,_), Hs),                       
           next(h(_,_,_,_,green), h(_,_,_,_,white), Hs),             
           member(h(_,bird,'Pall Mall',_,_), Hs),                       
           member(h(_,_,'Dunhill',_,yellow), Hs),                         
           Hs = [_,_,h(_,_,_,milk,_),_,_],                           
           Hs = [h(norwegian,_,_,_,_)|_],                            
           next(h(_,horse,_,_,_), h(_,_,'Dunhill',_,_), Hs),        
           next(h(_,_,blend,_,_), h(_,cat,_,_,_), Hs),             
           member(h(_,_,'Blue Master',beer,_), Hs),                        
           member(h(german,_,'Prince',_,_), Hs),                      
           next(h(norwegian,_,_,_,_), h(_,_,_,_,blue), Hs),  
           next(h(_,_,'Blend',_,_), h(_,_,_,water,_), Hs), 
           member(h(_,fish,_,_,_), Hs).
    
        next(A, B, Ls) :- append(_, [A,B|_], Ls).
        next(A, B, Ls) :- append(_, [B,A|_], Ls).
    

    我不知道出了什么问题。感谢

1 个答案:

答案 0 :(得分:5)

以下是您的计划的概括。我添加了一些额外的*来删除多个目标,并用_/*origterm*/替换了一些术语。然而,由此产生的程序仍然失败。因此,剩余片段中的错误必须。你没有对程序说什么(编辑:你后来添加了一些东西),所以我没有(编辑:想要)知道它是什么。但无论如何,错误必须在剩下的可见部分:

:- initialization(houses(_Sol)).
:- op(950, fy, *).
*_.

houses(Hs) :-
   length(Hs, 5),
   * member(h(english,_,_,_,red), Hs),                         %  2
   * member(h(swede,dog,_,_,_), Hs),
   * member(h(_,_,_,coffee,green), Hs),
   * member(h(dane,_,_,tea,_), Hs),
   * next(h(_,_,_,_,green), h(_,_,_,_,white), Hs),
   member(h(_,_/*bird*/,'Pall Mall',_,_), Hs),
   member(h(_,_,'Dunhill',_,_/*yellow*/), Hs),
   * Hs = [_,_,h(_,_,_,milk,_),_,_],
   * Hs = [h(norwegian,_,_,_,_)|_],
   * next(h(_,horse,_,_,_), h(_,_,'Dunhill',_,_), Hs),
   next(h(_,_,blend,_,_), _/*h(_,cat,_,_,_)*/, Hs),
   member(h(_,_,'Blue Master',_/*beer*/,_), Hs),
   member(h(_/*german*/,_,'Prince',_,_), Hs),
   * next(h(norwegian,_,_,_,_), h(_,_,_,_,blue), Hs),
   next(h(_,_,'Blend',_,_), _/*h(_,_,_,water,_)*/, Hs),
   * member(h(_,fish,_,_,_), Hs).

next(A, B, Ls) :- append(_, [A,B|_], Ls).
next(A, B, Ls) :- append(_, [B,A|_], Ls).

剩下的不多了!在可见部分至少有一个错误! (严格来说,其他部分可能会有更多错误。我们根本就不知道。)