prolog - 使用 Prolog 的爱因斯坦谜语

标签 prolog zebra-puzzle program-slicing

我正在尝试使用 Prolog 解决爱因斯坦之谜。当我尝试按房屋(Hs)运行时,它显示否。任务是

  1. 英国人住在红房子里。
  2. 瑞典人养狗作为宠物。
  3. 丹麦人喝茶。
  4. 绿房子就在白宫的左边。
  5. 温室的主人喝咖啡。
  6. 抽 Pall Mall 烟的老板养鸟。
  7. 黄色房子的主人抽登喜路香烟。
  8. 住在中间房子的主人喝牛奶。
  9. 挪威人住在第一栋房子里。
  10. 抽 Blends 烟的主人住在养猫的主人旁边。
  11. 养马的主人住在抽 Dunhill 烟的主人旁边。
  12. 抽 Bluemasters 烟的老板喝啤酒。
  13. 德国人抽 Prince 烟。
  14. 挪威人住在蓝房子旁边。
  15. 抽 Blends 的主人住在喝水的主人旁边。
    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).

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

最佳答案

这是您的程序的概括。我添加了一些额外的 * 来删除多个目标,并用 _/*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).

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

关于prolog - 使用 Prolog 的爱因斯坦谜语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36816529/

相关文章:

prolog - 下一个谓词混淆

Prolog Logic Puzzle 不工作?

prolog - 使用 clpfd Prolog 库解决斑马拼图(又名爱因斯坦拼图)

c - 如何在Ubuntu 14.04上安装Frama-c影响分析插件?

c - 使用 frama-c 进行切片

list - 如何在Prolog中将split/3转换为split/4?

prolog - 如何从 XPCE 传递选择值以生成 prolog 代码

将输出合并到 Prolog 中的一个列表中

prolog - 爱因斯坦谜语中的数值比较

Prolog - 获取给定数字的因子不会停止吗?