【问题标题】:Advice on solving zebra type puzzle解决斑马式拼图的建议
【发布时间】:2011-10-06 16:32:44
【问题描述】:

我需要您的帮助来解决以下问题:

有 3 个女孩(安、苏珊、爱丽丝)需要选择穿什么颜色的鞋子和衣服。鞋子和连衣裙有 3 种可能的颜色:白色、蓝色和绿色。

主要条件:

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

我的代码只满足两个条件;对于 Susan,我很难满足相同颜色的条件,而其他女孩则需要不同颜色的服装。

这是我想出的:

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个小时。有点让我想为此嘲笑自己:)
  • 别难过。我在我的第一个“简单”序言任务上花了两个多小时。坚持下去。这是一种不同的思维方式。我很乐意帮助你,但所有这些知识几年前就已经离开了我的大脑...... :)
  • 你能缩进你的 will_wear 子句吗?

标签: prolog zebra-puzzle


【解决方案1】:

如果我正确理解这些条件,则它们不是 Shurane 所回答的。

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

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

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

【讨论】:

  • 我在网上找到了类似问题的解决方案。就像我说的逻辑有一点不同。感谢大家的帮助。将尝试开发我的解决方案版本:)
  • 想法是,对于相似的颜色,我们使用对应子句对应(X,Y,Z):-girl(X),鞋子(Y),连衣裙(Z),X=susan,Y=green ,YZ。这应该为每个女孩定制。然后是解决方案子句:solution(X1,Y1,Z1,X2,Y2,Z2,X3,Y3,Z3):- X1=susan,correspond(X1,Y1,Z1), X2=alice,对应(X2,Y2, Z2), X3=ann, 对应(X3,Y3,Z3), Y1Y2, Y2Y3, Y1Y3, Z1Z2, Z2Z3, Z1Z3.
  • 这不是和我的代码中的only_wears 一样吗?此外,dress() 应该是 skirt()
  • 我认为配置器的意思是该子句的逻辑必须绑定到“颜色”属性
  • 哦,我明白了。虽然,这看起来还是很像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_shoesdifferent_skirts 在结构上是相同的。

你可以这样初始化它:

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

【讨论】:

  • not(equals(A,B)) 应该是A \= B,我认为
  • 关于传递子句,这是可能的,但并不漂亮。
  • 我对条款有相同的想法,但在任何地方都找不到答案。您的版本仍然提供 19 个解决方案,但我只需要 3 个。
  • 你的意思是应该只有3个解决方案?
  • 是的,其他解决方案只是重复或不可能(女孩不能穿相同的鞋子或衣服)
猜你喜欢
  • 2019-12-10
  • 2023-04-07
  • 2017-09-29
  • 1970-01-01
  • 2015-02-23
  • 2011-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多