Головоломка в Прологе

Никто не решает эту головоломку:

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

Все имена: Линда, Ник, Робин, Вирджиния  Вина: бордо, кьянти, мерло, шираз  Входит: говяжий жаркий, цыпленок цитрусовых, филе миньон, красный окунь  Цены: $24.99, $25.99, $26.99, $27.99

Улики:

  • У закусочного, заказавшего красную стрелу, не было бордо.
  • Линда заплатила меньше, чем тот, у кого были бордо.
  • Ни тот, кто имел бордо, и тот, у кого был Кьянти, был человеком, который заплатил $26,99.
  • У закусочной, которая заказала говядину, был ханти.
  • Обед, который заказал цыпленка цитрусовых, заплатил на 1 доллар меньше, чем тот, у которого были кьянти.
  • Обед, который заказал финтовый миньон, заплатил меньше, чем тот, у кого был шираз.
  • Вирджиния была либо закусочной, которая заказала жаркую говядину, или закусочную, которая заказала красный окунь.
  • Тот, у кого был мерло, заплатил на 1 доллар меньше, чем Робин.

Источник:

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 на .