Советы по решению головоломки типа зебры - PullRequest
0 голосов
/ 06 октября 2011

Мне нужна ваша помощь в решении следующей задачи:

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 ]

1 голос
/ 06 октября 2011

Если я правильно понимаю условия, это не то, что ответил Шуране.

Это гарантирует, что девушка носит платье и туфли одного цвета:

same_color(Girl) :-
    shoes(Girl, Color),
    dress(Girl, Color).

Я оставлю другой цвет в качестве упражнения, но намекаю, что если говорить две вещи не одинаково, вы говорите A \= B.Пожалуйста, оставьте комментарий, если у вас есть трудности с different_color - и скажите мне, что вы пробовали.

1 голос
/ 06 октября 2011

От макушки головы я что-то думаю по этому поводу:

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).
...