Пазл в Моцарте Оз
Я пытаюсь решить загадку ниже в Моцарт Оз.
Сьюзи любила животных и имела большую коллекцию чучел животных. Однако, было несколько, которые были ее фаворитами. Этим утром она решила переставить своих чучел животных и дать каждому из ее любимых особенное место в ее комнате. Наряду с именем, у каждого из ее любимых чучел животных был также возраст, и все, конечно, были моложе ее. Определите имена ее любимых чучел животных, тип каждого животного, сколько лет она считала каждым из животных (от одного до пяти лет) и где в своей комнате она разместила каждого из своих любимцев.
Скунсу было два года. Тигр был на год моложе животного на книжной полке, но тигр был также на год старше объятий.
Животное, помещенное на стул, было на два года старше Вилли и на год моложе кита.
Объятия не были скунсом. Бу не было пяти лет.
Кошку положили на кровать.
Медведь был на два года старше Спота. Эми была китом, но ее не положили на подушку.
Обниматься не было на скамейке.
Эта головоломка была взята с 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
Я получаю вывод, который не соответствует ожиданиям, и я не понимаю этого:
Можете ли вы сказать мне, где я иду не так?
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 =(1 - Nb.bookshelf)+
Это должно быть Nb.tiger =: Nb.bookshelf - 1
и вместо Nb.chair = 1 - Nb.whale
- Nb.chair =: Nb.whale - 1
,
Таким образом, правильное решение:
объявлять proc {Tiger Nb} Группы = [ [обнимает Уиллис, пятно Ами] [медведь-тигр [книжная полка, кресло, кровать, скамейка] Properties = {FoldR Groups Append nil} proc {Partition Group} {FD.distinct {Карта группы весело {$ P} Nb.P end}} конец в %% Nb отображает все свойства на возраст {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} конец {Browse {SearchAll Tiger}}