我正试图用莫扎特盎司解决下面的谜题。
苏茜喜欢动物,并且收集了很多毛绒动物。然而,有几个是她的最爱。她今天早上决定重新安排她的毛绒动物,并将她最喜欢的每一个都放在她房间的特殊位置。除了一个名字,她最喜欢的毛绒动物每个都有一个年龄,当然都比她年轻。确定她最喜欢的毛绒动物的名字,每只动物的类型,她认为每只动物的年龄(从一到五年),以及在她的房间里放置她最喜欢的每个动物。
臭鼬已经两岁了。老虎比放在书架上的动物年轻一岁,但老虎也比拥抱的年龄大一岁。
放在椅子上的动物比威利大两岁,比鲸鱼年轻一岁。
拥抱不是臭鼬。 Boo不是五岁。
将猫放在床上。
熊比Spot大两岁。 Amee是鲸鱼,但她没有被放在枕头上。
- 醇>
Cuddles没有被放在替补席上。
这个谜题来自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
我得到的输出并不是我所期待的,我不明白:
你能告诉我哪里出错了吗?
答案 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}}