0

我正在尝试解决莫扎特盎司中的以下难题。

苏西喜欢动物,收藏了大量的毛绒玩具。然而,有几个是她最喜欢的。今天早上,她决定重新安排她的毛绒玩具,并在她的房间里给她最喜欢的每个人一个特别的地方。除了名字,她最喜欢的每一个毛绒玩具都有一个年龄,当然都比她年轻。确定她最喜欢的毛绒玩具的名称、每只动物的类型、她认为每只动物的年龄(从一岁到五年),以及她将每只最喜欢的毛绒玩具放在房间的什么地方。

  1. 臭鼬两岁了。老虎比放在书架上的动物小一岁,但老虎也比Cuddles大一岁。

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

  3. 拥抱不是臭鼬。小布还不到五岁。

  4. 猫被放在了床上。

  5. 这只熊比 Spot 大两岁。艾米是鲸鱼,但她没有被放在枕头上。

  6. 拥抱没有被放在板凳上。

这个谜题取自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}}

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

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

我得到的拼图输出

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

4

1 回答 1

0

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

虽然你写了类似的东西Nb.tiger = 1 + Nb.cuddlesNb.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

因此,正确的解决方案:

    宣布
    proc {Tiger Nb}
       Groups = [[拥抱willies boo spot amee]
                  [臭鼬虎鲸猫熊]
                  【书架椅床枕凳】】
       属性 = {FoldR Groups Append nil}
       proc {分区组}
          {FD.distinct {Map Group fun {$P} Nb.P end}}
       结尾
    在
       %% Nb 将所有属性映射到年龄
       {FD.record number 属性 1#5 Nb}
       {ForAll 组分区}
       Nb.臭鼬 = 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}
    结尾

    {浏览 {SearchAll Tiger}}

于 2018-06-20T10:21:53.720 回答