Советы по решению головоломки типа zebra

#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. да, другие решения просто дублируют друг друга или это невозможно (девочки не могут носить одинаковые туфли или платье)