Пазл в Прологе

Кто-нибудь решит эту загадку:

Определите имя, вино, блюдо и цену для каждого человека, используя данные подсказки. Ниже приведены все категории и варианты, используемые в этой головоломке.

Имена: Линда, Ник, Робин, Вирджиния. Вина: бордо, кьянти, мерло, шираз. Закуски: говядина, жареная на цитрусе, филе-миньон, красный люциан.

Ключи:

  1. У закусочной, которая заказала красного окуня, не было бордо.
  2. Линда заплатила меньше, чем тот, у кого были бордо.
  3. Ни тот, у кого был бордо, ни тот, у кого был кьянти, не был человеком, который заплатил 26,99 долларов.
  4. У закусочной, заказавшей говядину, было кьянти.
  5. Ужин, который заказал курицу с цитрусовыми, заплатил на 1 доллар меньше, чем тот, у кого были кьянти.
  6. Ужин, который заказал филе миньон, заплатил меньше, чем тот, у кого был шираз.
  7. Вирджиния была либо посетительницей, которая заказывала говядину, либо закусочной, которая заказывала красного окуня.
  8. Тот, у кого был мерло, заплатил на 1 доллар меньше, чем Робин.

ИСТОЧНИК:

http://logic-puzzles.org/

1 ответ

Определите имя, вино, блюдо и цену для каждого человека

таким образом, мы представляем каждого человека как 4-арный сложный термин, p(Name,Wine,Entree,Price), Кажется, их тоже четверо.

Тогда мы просто запишем то, что нам говорят:

wine_and_dine(People):-
  length(People,4),
  Ordered1 = p(_,W1,red_snapper,_),   
             member(Ordered1, People),
             % W1 \= bordeaux, but delay writing this down 
             %                 until it is defined some more
             % or use freeze/2 in SWI:
             freeze( W1, W1 \= bordeaux),
  Lynda2 = p(lynda,_,_,PL2), 
             Had2 = p(_,bordeaux,_,PB2),
             member(Lynda2, People),
             member(Had2, People),
             % PL2 < PB2,     % check this only when they are known; or
             freeze(PL2, freeze(PB2, PL2 < PB2)),
  .... etc.

проконсультируйтесь с Q&A по тегу зебра-пазл.

Другие вопросы по тегам