#prolog #zebra-puzzle
#пролог #zebra-головоломка
Вопрос:
Мне нужна ваша помощь в решении следующей проблемы:
Есть 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).
Приведенный выше код работает нормально, но дает слишком много решений. Кроме того, я не мог придумать никакого логического решения для условия, при котором Сьюзан должна носить обувь и платье одного цвета.
Спасибо.
Комментарии:
1. Это домашнее задание? Ничего страшного, если это так, просто дайте нам знать и расскажите, что вы уже пробовали….
2. На самом деле это так. Приведенный выше код — это то, что я придумал сам. Учитель дал нам только условия. Я думаю, что основная проблема заключается в логике решения. Я уже думал об этом в течение 2 часов. Мне хочется посмеяться над собой за это 🙂
3. Не расстраивайтесь. Я потратил более 2 часов на свое первое «простое» задание prolog. Продолжайте в том же духе. Это другой способ мышления. Я бы хотел вам помочь, но все эти знания покинули мой мозг много лет назад … 🙂
4. Не могли бы вы сделать отступ в своем предложении will_wear?
Ответ №1:
Если я правильно понимаю условия, это не то, на что ответил Шуране.
Это позволит убедиться, что девушка носит платье и туфли одного цвета:
same_color(Girl) :-
shoes(Girl, Color),
dress(Girl, Color).
Я оставлю другой цвет в качестве упражнения, но намекну, что сказать, что две вещи — это не то же самое, что вы говорите A = B
. Пожалуйста, оставьте комментарий, если у вас возникли трудности с different_color — и расскажите мне, что вы пробовали.
Комментарии:
1. Я нашел решение аналогичной проблемы в Интернете. Как я уже сказал, логика здесь немного другая. Спасибо всем за вашу помощь. Попытаюсь разработать свою версию решения, хотя 🙂
2. идея в том, что для похожих цветов мы используем соответствующее предложение, соответствующее (X, Y, Z): -девушка (X), обувь (Y), платье (Z), X = сьюзан, Y = зеленый, Y<>Z. И это должно быть настроено для каждой из девочек. Затем есть предложение решения: решение (X1, Y1, Z1, X2, Y2, Z2, X3, Y3, Z3): — X1 = Сьюзан, соответствует (X1, Y1, Z1), X2 = алиса, соответствует (X2, Y2, Z2), X3 = энн, соответствует (X3, Y3, Z3), Y1<>Y2, Y2<>Y3, Y1<>Y3, Z1<>Z2, Z2<>Z3, Z1<>Z3.
3. Разве это не то же
only_wears
самое, что и в моем коде? Кроме того,dress()
должно бытьskirt()
.4. Я думаю, что конфигуратор имел в виду, что логика предложения должна быть привязана к атрибуту «color»
5. О, я понимаю. Хотя это все еще похоже на
only_wears(Girl, _)
Ответ №2:
С головы до ног я думаю о чем-то в этом роде:
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).
Комментарии:
1.
not(equals(A,B))
A = B
я думаю, действительно должно быть2. А что касается предложений о передаче, это возможно, но не красиво.
3. у меня была такая же идея по предложениям, но нигде не мог найти ответа. Ваша версия по-прежнему дает 19 решений, но мне нужно только 3.
4. Вы имеете в виду, что должно быть только 3 решения?
5. да, другие решения просто дублируют друг друга или это невозможно (девочки не могут носить одинаковые туфли или платье)