【问题标题】:Puzzle in Mozart Oz莫扎特奥兹之谜
【发布时间】:2018-02-13 02:19:05
【问题描述】:

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

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

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

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

  3. Cuddles 不是臭鼬。 Boo 还不到五岁。

  4. 猫被放在床上了。

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

  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

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

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

【问题讨论】:

    标签: oz zebra-puzzle mozart


    【解决方案1】:

    问题在于= 不是传播者,如果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 =: Nb.bookshelf - 1 而不是 Nb.tiger =(1 - Nb.bookshelf)+,而不是 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}}

    【讨论】:

      猜你喜欢
      • 2014-05-10
      • 2014-06-08
      • 2019-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-18
      • 2010-09-22
      相关资源
      最近更新 更多