在Prolog中填写表格,给出具体线索(爱因斯坦之谜)

时间:2016-02-02 21:41:25

标签: prolog zebra-puzzle

有一个假设的五个办公室的表格。每个办公室都有1到5种颜色,部门,个人电脑,饮料,手机和特定位置:

The table is here

我试图给Prolog提供以下线索,以便它可以正确填写表格:

  
      
  1. 男人喝牛奶在办公室#3。
  2.   
  3. 在公共关系('pubrel')部门工作的人在   办公室#1。
  4.   
  5. 公共关系部门的人员在蓝色办公室旁边。
  6.   
  7. 绿色办公室位于粉红色办公室的右侧。
  8.   
  9. 绿色办公室的男人正在喝咖啡。
  10.   
  11. 黄色办公室里的男人有一个黑莓手机,黄色   办公室旁边是拥有windows7个人的办公室。
  12.   
  13. 在红色办公室工作的人来自'cs'部门。
  14.   
  15. 来自'ode'部门的人有mac_pro pc。
  16.   
  17. 来自金融('fin')部门的人正在喝茶。
  18.   
  19. 拥有iphone的人也有一台mac_air pc。
  20.   
  21. 拥有诺基亚手机的男人就在那个有上网本的人旁边    PC。
  22.   
  23. 拥有安卓手机的男人正在喝橙汁。
  24.   
  25. 供应部门的人员有一部爱立信手机。
  26.   

我正在使用

of(X,Y) 

其中X是办公室的属性,Y是办公室的位置。 例如:

of(color(yellow),1) -->office with yellow color is office #1
of(dept(cs),3) -->employee from cs department is in office #3

我将这些线索定义为“规则”,这些线索应该同时起作用。

rule1:-of(drink(milk),3),perm(drink(milk),3).
rule2:-of(dept(relations),1),perm(dept(relations),1).
rule3:-of(dept(relations),1),of(color(blue),2),perm(dept(relations),1),perm(color(blue),2).
rule3:-of(dept(relations),2),of(color(blue),3),perm(dept(relations),2),perm(color(blue),3).
rule3:-of(dept(relations),3),of(color(blue),4),perm(dept(relations),3),perm(color(blue),4).
rule3:-of(dept(relations),4),of(color(blue),5),perm(dept(relations),4),perm(color(blue),5).
rule4:-of(color(pink),1),of(color(green),2),perm(color(pink),1),perm(color(green),2).
rule4:-of(color(pink),2),of(color(green),3),perm(color(pink),2),perm(color(green),3).
rule4:-of(color(pink),3),of(color(green),4),perm(color(pink),3),perm(color(green),4).
rule4:-of(color(pink),4),of(color(green),5),perm(color(pink),4),perm(color(green),5).
rule5:-of(color(green),1),of(drink(coffee),1),perm(color(green),1),perm(drink(coffee),1).
rule5:-of(color(green),2),of(drink(coffee),2),perm(color(green),2),perm(drink(coffee),2).
rule5:-of(color(green),3),of(drink(coffee),3),perm(color(green),3),perm(drink(coffee),3).
rule5:-of(color(green),4),of(drink(coffee),4),perm(color(green),4),perm(drink(coffee),4).
rule5:-of(color(green),5),of(drink(coffee),5),perm(color(green),5),perm(drink(coffee),5).
rule6:-of(cell(blackberry),1),of(color(yellow),1),of(pc(win7),2),perm(cell(blackberry),1),perm(color(yellow),1),perm(pc(win7),2).
rule6:-of(cell(blackberry),2),of(color(yellow),2),of(pc(win7),3),perm(cell(blackberry),2),perm(color(yellow),2),perm(pc(win7),3).
rule6:-of(cell(blackberry),3),of(color(yellow),3),of(pc(win7),4),perm(cell(blackberry),3),perm(color(yellow),3),perm(pc(win7),4).
rule6:-of(cell(blackberry),4),of(color(yellow),4),of(pc(win7),5),perm(cell(blackberry),4),perm(color(yellow),4),perm(pc(win7),5).
rule6:-of(cell(blackberry),2),of(color(yellow),2),of(pc(win7),1),perm(cell(blackberry),2),perm(color(yellow),2),perm(pc(win7),1).
rule6:-of(cell(blackberry),3),of(color(yellow),3),of(pc(win7),2),perm(cell(blackberry),3),perm(color(yellow),3),perm(pc(win7),2).
rule6:-of(cell(blackberry),4),of(color(yellow),4),of(pc(win7),3),perm(cell(blackberry),4),perm(color(yellow),4),perm(pc(win7),3).
rule6:-of(cell(blackberry),5),of(color(yellow),5),of(pc(win7),4),perm(cell(blackberry),5),perm(color(yellow),5),perm(pc(win7),4).
rule7:-of(dept(cs),1),of(color(red),1),perm(dept(cs),1),perm(color(red),1).
rule7:-of(dept(cs),2),of(color(red),2),perm(dept(cs),2),perm(color(red),2).
rule7:-of(dept(cs),3),of(color(red),3),perm(dept(cs),3),perm(color(red),3).
rule7:-of(dept(cs),4),of(color(red),4),perm(dept(cs),4),perm(color(red),4).
rule7:-of(dept(cs),5),of(color(red),5),perm(dept(cs),5),perm(color(red),5).
rule8:-of(dept(ode),1),of(pc(mac_pro),1),perm(dept(ode),1),perm(pc(mac_pro),1).
rule8:-of(dept(ode),2),of(pc(mac_pro),2),perm(dept(ode),2),perm(pc(mac_pro),2).
rule8:-of(dept(ode),3),of(pc(mac_pro),3),perm(dept(ode),3),perm(pc(mac_pro),3).
rule8:-of(dept(ode),4),of(pc(mac_pro),4),perm(dept(ode),4),perm(pc(mac_pro),4).
rule8:-of(dept(ode),5),of(pc(mac_pro),5),perm(dept(ode),5),perm(pc(mac_pro),5).
rule9:-of(dept(fin),1),of(drink(tea),1),perm(dept(fin),1),perm(drink(tea),1).
rule9:-of(dept(fin),2),of(drink(tea),2),perm(dept(fin),2),perm(drink(tea),2).
rule9:-of(dept(fin),3),of(drink(tea),3),perm(dept(fin),3),perm(drink(tea),3).
rule9:-of(dept(fin),4),of(drink(tea),4),perm(dept(fin),4),perm(drink(tea),4).
rule9:-of(dept(fin),5),of(drink(tea),5),perm(dept(fin),5),perm(drink(tea),5).
rule10:-of(cell(iphone),1),of(pc(mac_air),1),perm(cell(iphone),1),perm(pc(mac_air),1).
rule10:-of(cell(iphone),2),of(pc(mac_air),2),perm(cell(iphone),2),perm(pc(mac_air),2).
rule10:-of(cell(iphone),3),of(pc(mac_air),3),perm(cell(iphone),3),perm(pc(mac_air),3).
rule10:-of(cell(iphone),4),of(pc(mac_air),4),perm(cell(iphone),4),perm(pc(mac_air),4).
rule10:-of(cell(iphone),5),of(pc(mac_air),5),perm(cell(iphone),5),perm(pc(mac_air),5).
rule11:-of(cell(nokia),1),of(pc(netbook),2),perm(cell(nokia),1),perm(pc(netbook),2).
rule11:-of(cell(nokia),2),of(pc(netbook),3),perm(cell(nokia),2),perm(pc(netbook),3).
rule11:-of(cell(nokia),3),of(pc(netbook),4),perm(cell(nokia),3),perm(pc(netbook),4).
rule11:-of(cell(nokia),4),of(pc(netbook),5),perm(cell(nokia),4),perm(pc(netbook),5).
rule11:-of(cell(nokia),2),of(pc(netbook),1),perm(cell(nokia),2),perm(pc(netbook),1).
rule11:-of(cell(nokia),3),of(pc(netbook),2),perm(cell(nokia),3),perm(pc(netbook),2).
rule11:-of(cell(nokia),4),of(pc(netbook),3),perm(cell(nokia),4),perm(pc(netbook),3).
rule11:-of(cell(nokia),5),of(pc(netbook),4),perm(cell(nokia),5),perm(pc(netbook),4).
rule12:-of(cell(android),1),of(drink(orangejuice),1),perm(cell(android),1),perm(drink(orangejuice),1).
rule12:-of(cell(android),2),of(drink(orangejuice),2),perm(cell(android),2),perm(drink(orangejuice),2).
rule12:-of(cell(android),3),of(drink(orangejuice),3),perm(cell(android),3),perm(drink(orangejuice),3).
rule12:-of(cell(android),4),of(drink(orangejuice),4),perm(cell(android),4),perm(drink(orangejuice),4).
rule12:-of(cell(android),5),of(drink(orangejuice),5),perm(cell(android),5),perm(drink(orangejuice),5).
rule13:-of(dept(supplies),1),of(cell(ericsson),1),perm(dept(supplies),1),perm(cell(ericsson),1).
rule13:-of(dept(supplies),2),of(cell(ericsson),2),perm(dept(supplies),2),perm(cell(ericsson),2).
rule13:-of(dept(supplies),3),of(cell(ericsson),3),perm(dept(supplies),3),perm(cell(ericsson),3).
rule13:-of(dept(supplies),4),of(cell(ericsson),4),perm(dept(supplies),4),perm(cell(ericsson),4).
rule13:-of(dept(supplies),5),of(cell(ericsson),5),perm(dept(supplies),5),perm(cell(ericsson),5).

然后将它们全部提供给谓词'office',如果它们都可以一起应用,那么它应该是真的,以便正确地形成表。

office:-rule1,rule2,rule3,rule4...

我将perm(X,Y)定义为当允许属性X捕获特定地点Y时变为真的字词,这意味着X没有捕获另一个点perm(X,1):-not(of(X,2)),not(of(X,3)),not(of(X,4)),not(of(X,5)). perm(X,2):-not(of(X,1)),not(of(X,3)),not(of(X,4)),not(of(X,5)). perm(X,3):-.... 因此是允许的。

of(X,Y)

最后,如果另一个Y尚未占用地点X,则of(color(red),3)应该成立。 例如,如果没有其他颜色捕获到点3,则of(color(red),Y):-not(of(color(green),Y)),not(of(color(pink),Y)), not(of(color(blue),Y)),not(of(color(yellow),Y)). of(color(green),Y):-not(of(color(red),Y)),not(of(color(pink),Y)), not(of(color(blue),Y)),not(of(color(yellow),Y)). ... of(dept(cs),Y):-not(of(dept(ode),Y)),not(of(dept(supplies),Y)), not(of(dept(fin),Y)),not(of(dept(relations),Y)). of(dept(ode),Y):-not(of(dept(cs),Y)),not(of(dept(supplies),Y)), not(of(dept(fin),Y)),not(of(dept(relations),Y)). ... 应该为真。

perm(X,Y)

因此,of(X,Y)not(of(color(green),1)) 应该在每个规则中同时为真。

它不起作用,可能是因为它确实有任何具体的开始。它不知道什么时候

{{1}}

将是真的。但我陷入困境,无法想出一种方法来定义特定的东西。任何人都可以帮忙解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

您的方法无法工作,因为它内置了无限递归。它的逻辑是循环的。它永远不会停止。仅限于两种颜色,您的定义是

of(color(red),Y):- not(of(color(green),Y)).
of(color(green),Y):- not(of(color(red),Y)).

你只会在负面建立你的知识。你应该以某种方式在某个地方保持积极的知识:"办公室1是粉红色"而不是"办公室1不是绿色也不是黄色等"。 (1)

您只有五种颜色供您使用;如果四个都没有,那么它必然是第五个。

因此,{p> perm似乎完全是多余的。如果你现在从你的谓词中得到关于办公室颜色的正面知识,那么如果它是红色的,那就是红色。

" next-to"意思是,(例如"来自公共关系部门的人就在蓝色办公室旁边。" ),

of(dept(pubrel),X), of(color(blue),Y),
of(position(I),X), of(position(J),Y), 1 is abs (I-J).
应对

of进行编码,以便以某种方式记录知识。链接答案中有大量示例,或者在标记下有关如何实现这一目标的大量示例。

(1)更新:)另一方面,你可以写

    of(Rec1,color(not_green_nor_yellow),Y,RecN):- 
        not_of(Rec1,color(green),Y,Rec2),
        not_of(Rec2,color(yellow),Y,RecN).

这个想法是从记录完整的可能性开始,然后让它们从该记录中逐一删除(通过not_of/4谓词),直到剩下严格的可能性(如数独)。也许这就是你的想法。您仍然保持积极的知识(即使在表达消极的情况下),这是每个办公室目前可能的所有选择的列表。

因此,在一个范例下,我们添加选择(因此将黄色和绿色添加到同一个办公室是一个矛盾 - 一个办公室只能有一种颜色),另一个我们删除它们(删除黄色和绿色完全没问题)除非这会清空该办公室剩余选择的清单 - 办公室必须有一些颜色,一种颜色。)