关于解决斑马型拼图的建议

时间:2011-10-06 16:32:44

标签: prolog zebra-puzzle

我需要你帮助解决以下问题:

有3个女孩(Ann,Susan,Alice)需要选择穿什么颜色的鞋子和衣服。鞋子和连衣裙有3种颜色可供选择:白色,蓝色和绿色。

主要条件:

  • 安恨白。
  • 苏珊穿着相同颜色的鞋子和衣服。
  • 爱丽丝有白鞋。
  • Alice和Ann的鞋子和连衣裙有不同的颜色。

我的代码只满足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 个答案:

答案 0 :(得分:1)

在我的脑海中,我正在思考这些问题:

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_shoesdifferent_skirts的结构相同。

你会像这样初始化它:

only_wears(ann, white).
different_shoes(alice, ann).
different_skirt(alice, ann).

答案 1 :(得分:1)

如果我正确理解了这些条件,那么他们就不是Shurane的回答了。

这将确保女孩穿着相同颜色的衣服和鞋子:

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

我会将不同的颜色作为练习,但暗示说两件事与你说A \= B不一样。如果您在使用different_color时遇到困难,请发表评论 - 并告诉我您尝试了什么。