莫扎特·奥兹的谜题

时间:2018-02-13 02:19:06

标签: oz zebra-puzzle mozart

我正试图用莫扎特盎司解决下面的谜题。

  苏茜喜欢动物,并且收集了很多毛绒动物。然而,有几个是她的最爱。她今天早上决定重新安排她的毛绒动物,并将她最喜欢的每一个都放在她房间的特殊位置。除了一个名字,她最喜欢的毛绒动物每个都有一个年龄,当然都比她年轻。确定她最喜欢的毛绒动物的名字,每只动物的类型,她认为每只动物的年龄(从一到五年),以及在她的房间里放置她最喜欢的每个动物。

     
      
  1. 臭鼬已经两岁了。老虎比放在书架上的动物年轻一岁,但老虎也比拥抱的年龄大一岁。

  2.   
  3. 放在椅子上的动物比威利大两岁,比鲸鱼年轻一岁。

  4.   
  5. 拥抱不是臭鼬。 Boo不是五岁。

  6.   
  7. 将猫放在床上。

  8.   
  9. 熊比Spot大两岁。 Amee是鲸鱼,但她没有被放在枕头上。

  10.   
  11. Cuddles没有被放在替补席上。

  12.   

这个谜题来自http://www.puzzles.com/Projects/LogicProblems/SusiesAnimals.htm

我的代码是 -

declare
proc {Tiger Nb}
   Groups = [ [cuddles willies boo spot amee]
          [skunk tiger whale cat bear]
              [bookshelf chair bed pillow bench]]
   Properties = {FoldR Groups Append nil}
   proc {Partition Group}
      {FD.distinct {Map Group fun {$ P} Nb.P end}}
   end  
in
   %% Nb maps all properties to age
   {FD.record number Properties 1#5 Nb}
   {ForAll Groups Partition}
   Nb.skunk = 2
   Nb.tiger =(1 - Nb.bookshelf)+
   Nb.tiger = 1 + Nb.cuddles
   Nb.chair = 2 + Nb.willies
   Nb.chair = 1 - Nb.whale
   Nb.cuddles \=: Nb.skunk
   Nb.boo \=: 5
   Nb.cat = Nb.bed
   Nb.bear = 2 + Nb.spot
   Nb.amee = Nb.whale
   Nb.amee \=: Nb.pillow
   Nb.cuddles \=: Nb.bench
   {FD.distribute ff Nb}
end

{Browse {SearchAll Tiger}}

我试图通过使用年龄数作为标题并期望结果与年龄数来解决它。类似于Zebra问题http://doc.uh.cz/Mozart-oz/doc/fdt/node23.html

我得到的输出并不是我所期待的,我不明白:

puzzle output which I have got

你能告诉我哪里出错了吗?

1 个答案:

答案 0 :(得分:0)

问题在于=不是传播者,如果对于Nb.cat = Nb.bed没有区别,那么在Nb.tiger = 1 + Nb.cuddles的情况下它起着至关重要的作用。

虽然您编写了类似Nb.tiger = 1 + Nb.cuddles的内容,但必须已经计算了Nb.cuddles,但是就目前而言,我们所知道的只是它属于区间1#5

有两种可能性:强制计算Nb.cuddles或使用传播器FD.plus(或等效地=:)。当然,这是合法的,因此不建议使用第一种可能性来处理此问题,因为它破坏了整个有限域约束的整体思想,因为它等效于对Nb.cuddles的所有可能值进行简单枚举。

还要注意,它必须是Nb.tiger =(1 - Nb.bookshelf)+而不是Nb.tiger =: Nb.bookshelf - 1-Nb.chair = 1 - Nb.whale,而不是Nb.chair =: Nb.whale - 1

因此,正确的解决方案:


    declare
    proc {Tiger Nb}
       Groups = [ [cuddles willies boo spot amee]
                  [skunk tiger whale cat bear]
                  [bookshelf chair bed pillow bench]]
       Properties = {FoldR Groups Append nil}
       proc {Partition Group}
          {FD.distinct {Map Group fun {$ P} Nb.P end}}
       end
    in
       %% Nb maps all properties to age
       {FD.record number Properties 1#5 Nb}
       {ForAll Groups Partition}
       Nb.skunk = 2
       Nb.tiger =: Nb.bookshelf - 1
       Nb.tiger =: 1 + Nb.cuddles
       Nb.chair =: 2 + Nb.willies
       Nb.chair =: Nb.whale - 1
       Nb.cuddles \=: Nb.skunk
       Nb.boo \=: 5
       Nb.cat = Nb.bed
       Nb.bear =: 2 + Nb.spot
       Nb.amee = Nb.whale
       Nb.amee \=: Nb.pillow
       Nb.cuddles \=: Nb.bench
       {FD.distribute ff Nb}
    end

    {Browse {SearchAll Tiger}}