Пазл в Прологе
Кто-нибудь решит эту загадку:
Определите имя, вино, блюдо и цену для каждого человека, используя данные подсказки. Ниже приведены все категории и варианты, используемые в этой головоломке.
Имена: Линда, Ник, Робин, Вирджиния. Вина: бордо, кьянти, мерло, шираз. Закуски: говядина, жареная на цитрусе, филе-миньон, красный люциан.
Ключи:
- У закусочной, которая заказала красного окуня, не было бордо.
- Линда заплатила меньше, чем тот, у кого были бордо.
- Ни тот, у кого был бордо, ни тот, у кого был кьянти, не был человеком, который заплатил 26,99 долларов.
- У закусочной, заказавшей говядину, было кьянти.
- Ужин, который заказал курицу с цитрусовыми, заплатил на 1 доллар меньше, чем тот, у кого были кьянти.
- Ужин, который заказал филе миньон, заплатил меньше, чем тот, у кого был шираз.
- Вирджиния была либо посетительницей, которая заказывала говядину, либо закусочной, которая заказывала красного окуня.
- Тот, у кого был мерло, заплатил на 1 доллар меньше, чем Робин.
ИСТОЧНИК:
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 по тегу зебра-пазл.