Советы по решению головоломки типа зебры
Мне нужна ваша помощь в решении следующей проблемы:
Есть 3 девушки (Энн, Сьюзан, Алиса), которым нужно выбрать обувь и платье какого цвета. Есть 3 возможных цвета для обуви и платьев: белый, синий и зеленый.
Основные условия:
- Энн ненавидит белых.
- Сьюзен носит туфли и платье того же цвета.
- У Алисы белые туфли.
- Обувь и платье Алисы и Энн имеют разные цвета.
Мой код удовлетворяет только 2 условиям; У меня вроде бы тяжелые времена, когда я встречаюсь с Сьюзен в таком же цвете, в то время как другим девушкам нужно одевать разные цвета.
Вот что я придумаю:
PREDICATES
girl(symbol)
shoes(symbol,symbol)
skirt(symbol,symbol)
hates(symbol,symbol)
will_wear(symbol, symbol, symbol)
CLAUSES
will_wear(X,Y,Z):-
girl(X),
shoes(X,Y),
skirt(X,Z),
not(hates(X,Y)),
not(hates(X,Z)).
girl(ann).
girl(susan).
girl(alice).
hates(ann,white).
skirt(_,white).
skirt(_,blue).
skirt(_,green).
shoes(alice,white).
shoes(_,blue).
shoes(_,green).
GOAL
will_wear(Name,Shoes,Dress).
Код выше работает нормально, но дает слишком много решений. Кроме того, я не мог придумать никакого логического решения для Сьюзен носить обувь и платье того же цвета.
Благодарю.
2 ответа
Если я правильно понимаю условия, это не то, что ответил Шуране.
Это позволит убедиться, что девушка носит платье и туфли одинакового цвета:
same_color(Girl) :-
shoes(Girl, Color),
dress(Girl, Color).
Я оставлю другой цвет в качестве упражнения, но намекаю, что сказать, что две вещи не совпадают, вы говорите A \= B
, Пожалуйста, оставьте комментарий, если у вас есть трудности с different_color - и скажите мне, что вы пробовали.
Сверху головы я думаю что-то вроде этого:
only_wears(Girl,Color):-
shoes(Girl, Color),
skirt(Girl, Color).
different_shoes(F, S):-
shoes(F,F_color),
shoes(S,S_color),
not(equals(F_color,S_color)).
different_skirts(F, S):-
skirt(F,F_color),
skirt(S,S_color),
not(equals(F_color,S_color)).
Мне интересно, есть ли способ передать пункты в другие пункты, потому что different_shoes
а также different_skirts
идентичны по структуре.
Вы бы инициализировали это так:
only_wears(ann, white).
different_shoes(alice, ann).
different_skirt(alice, ann).