Пазл в Моцарте Оз

Я пытаюсь решить загадку ниже в Моцарт Оз.

Сьюзи любила животных и имела большую коллекцию чучел животных. Однако, было несколько, которые были ее фаворитами. Этим утром она решила переставить своих чучел животных и дать каждому из ее любимых особенное место в ее комнате. Наряду с именем, у каждого из ее любимых чучел животных был также возраст, и все, конечно, были моложе ее. Определите имена ее любимых чучел животных, тип каждого животного, сколько лет она считала каждым из животных (от одного до пяти лет) и где в своей комнате она разместила каждого из своих любимцев.

  1. Скунсу было два года. Тигр был на год моложе животного на книжной полке, но тигр был также на год старше объятий.

  2. Животное, помещенное на стул, было на два года старше Вилли и на год моложе кита.

  3. Объятия не были скунсом. Бу не было пяти лет.

  4. Кошку положили на кровать.

  5. Медведь был на два года старше Спота. Эми была китом, но ее не положили на подушку.

  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

Я получаю вывод, который не соответствует ожиданиям, и я не понимаю этого:

вывод головоломки, который я получил

Можете ли вы сказать мне, где я иду не так?

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}}
Другие вопросы по тегам