问题标签 [zebra-puzzle]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
15 回答
26844 浏览

language-agnostic - 以编程方式解决“谁拥有斑马”?

编辑:这个谜题也被称为“爱因斯坦之谜”

谁拥有 Zebra(您可以在此处尝试在线版本)是一组经典难题的示例,我敢打赌 Stack Overflow 上的大多数人都可以用笔和纸解决它。但是程序化解决方案会是什么样子?

根据下面列出的线索...

  • 有五间房子。
  • 每个房子都有自己独特的颜色。
  • 所有房主都是不同国籍的。
  • 他们都有不同的宠物。
  • 他们都喝不同的饮料。
  • 他们都抽不同的香烟。
  • 英国人住在红房子里。
  • 瑞典人有一条狗。
  • 丹麦人喝茶。
  • 绿房子在白房子的左边。
  • 他们在温室里喝咖啡。
  • 抽 Pall Mall 的人有鸟。
  • 在黄色的房子里,他们抽登喜路。
  • 在中间房子里,他们喝牛奶。
  • 挪威人住在第一间房子里。
  • 抽 Blend 的男人和猫一起住在房子旁边的房子里。
  • 在他们有一匹马的房子旁边的房子里,他们抽登喜路。
  • 抽蓝大师的人喝啤酒。
  • 德国人抽王子烟。
  • 挪威人住在蓝屋旁边。
  • 他们在抽Blend的房子旁边的房子里喝水。

...谁拥有斑马?

0 投票
2 回答
1685 浏览

owl - 如何在 Protégé 中用 OWL 解决爱因斯坦之谜时获得个人结果?

0 投票
1 回答
5298 浏览

prolog - 列表中的唯一元素(Prolog)

我正在实施爱因斯坦谜语的变体,但遇到了一些麻烦。

在尝试计算解决方案时,我尝试这样做:

然后我可以通过键入以下内容来询问解决方案:solve(Street)

然而,这作为解决方案出现:

  1. 房子(花、食物、宠物、运动)
  2. 房子(花、食物、宠物、运动)
  3. 房子(x ,食物,宠物,运动)
  4. 房子(花、食物、宠物、运动)
  5. 房子(x,花,宠物,运动)

如您所见,有 2 次x,其余的是所有类型的食物、鲜花、宠物和运动。但每一种类型都是独一无二的:如果一个人喜欢花 X,那么其他人就不会喜欢 X。

现在,我的解决方案给出 2 x 的原因很容易看出:我们得到了大量的提示,但在所有提示中只提到了 4 朵花。所以 Prolog 不知道还有另一朵花,只是使用 x 两次,只是因为它是可能的并且满足了所有其他提示。

我想说的是,街上所有类型的食物和鲜花等都是独一无二的,所以当他已经使用所有类型时,他应该留一些空白。3 看起来像:house(x , food, pet ,sport)和 5 看起来像:house(_, flower, pet, sport)

我还尝试将其添加到提示中:(假设“仙人掌”是提示中未提及的花之一) member(house(cactus,_,_,_), Street)

然而,我的程序并没有结束......

提示可能如下所示: is_neighbour(house(_,_,_,football),house(_,_,fish,_), Street), with :当 A 和 B 在 中彼此相邻时is_neighbour(A,B,List)给出。提示可以翻译为:热爱足球的人住在有鱼的人旁边。trueList

如果需要提供更多信息,我愿意详细说明。:)

0 投票
1 回答
3271 浏览

prolog - 爱因斯坦之谜

我是 Prolog 的新手,我正在尝试在 Prolog 中为爱因斯坦之谜(也称为斑马之谜)建模(但有 10 个房子和 30 个提示),我使用这个模型示例作为起点:

http://www.baptiste-wicht.com/2010/09/solve-einsteins-riddle-using-prolog/

但在我的谜语中,我必须能够说 X 是 Y 的对。而且我的意思不是直接对,而是在列表中的对。所以 Y 可以在 1 号屋,而 X 可以在 9 号屋。

我怎样才能在 Prolog 中做到这一点?我在考虑一个谓词,它说 Y 是通过将 X 和 X 之前的所有元素从该列表中取出而构造的列表的成员,但我不知道如何做到这一点或如何做到这一点,以便我可以适应它前面提到的例子。

0 投票
2 回答
6356 浏览

prolog - 在 Prolog 中解决逻辑难题

我正在阅读“立即学习 Prolog”,其中一个我自己无法解决的练习如下:

有一条街道,有三个相邻的房子,它们都有不同的颜色。它们是红色、蓝色和绿色。不同国籍的人住在不同的房子里,他们都有不同的宠物。以下是关于它们的更多事实:

  • 英国人住在红房子里。
  • 美洲虎是西班牙家庭的宠物。
  • 日本人住在蜗牛饲养员的右边。
  • 蜗牛饲养员住在蓝房子的左边。

谁养的斑马?

定义一个谓词zebra/1,告诉您斑马主人的国籍。

提示:考虑房屋和街道的表示。在 Prolog 中对四个约束进行编码。member并且sublist可能是有用的谓词。

任何想法如何在 Prolog 下对其进行编码?谢谢。

0 投票
1 回答
4058 浏览

prolog - 为什么我无法在 prolog 中得到斑马谜题的答案?

这是我目前的代码,我正在尝试解决斑马难题

我已经输入了这个并将它保存为 zebra.pl,我打开它并将 [zebra] 输入到 SWI-prolog 中,它返回一条关于 N1、P1、C1 等的单例使用的警告消息。然后返回 true,然后我要求它使用 print(WaterDrinker) 打印饮水器,它返回 _G317 和 true,

为什么这样做而不返回可能是挪威语的答案,如果我要求它返回任何变量,如 C3 或 ZebraOwner

0 投票
2 回答
263 浏览

prolog - 解决斑马式拼图的建议

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

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

主要条件:

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

我的代码只满足两个条件;对于苏珊来说,我很难满足相同颜色的条件,而其他女孩需要不同颜色的衣服。

这是我想出的:

上面的代码工作正常,但提供了太多的解决方案。另外,对于苏珊穿同色鞋子和衣服的条件,我想不出任何合乎逻辑的解决方案。

谢谢。

0 投票
3 回答
14216 浏览

prolog - 爱因斯坦谜语序言

我需要一些帮助来完成我的 AI 课程的序言作业。问题是为爱因斯坦的谜题编写序言代码。我知道如何自己写下来,但在家庭作业中有一些限制。

我知道我需要使用列表来显示房屋,因为它们是有序的。我也想将列表用于房屋特征,但我在这里遇到了问题。

我打算使用匿名变量house(englishman, red, _, _, _)。但我不知道如何为作业解释它。

以下是约束:您应该使用以下二进制谓词符号:

除此之外,您可以自由使用任意数量的谓词。

这是我初始化事实的方式,但在这种情况下我不知道如何制定规则

这有点道理,但同时看起来完全错误。我不认为我可以带着这个去任何地方。:/

0 投票
0 回答
1252 浏览

algorithm - 爱因斯坦的谜语解决方案使用 F#

我正在寻找使用 F# 的Einstein's Riddle解决方案,我发现只有Einstein 遇到 F#

F# 是否适合这个问题,还有其他实现吗?

0 投票
2 回答
4520 浏览

prolog - 使用 clpfd Prolog 库解决斑马谜题(又名爱因斯坦谜题)

我得到了一个练习来使用我选择的约束求解器来解决斑马难题,我使用Prolog clpfd library进行了尝试。

我知道在 Prolog 中还有其他更惯用的方法来解决这个问题,但这个问题是专门关于clpfd包的!

因此,我试图解决的难题的具体变体(鉴于其中有很多)是这个:

有五间房子

  1. 英国人住在红房子里
  2. 瑞典人养狗
  3. 丹麦人喜欢喝茶
  4. 绿房子留给白房子
  5. 温室的主人喝咖啡
  6. 抽 Pall Mall 的人拥有一只鸟
  7. 中间屋喝牛奶
  8. 黄房子的主人抽登喜路
  9. 挪威人住在第一所房子里
  10. 万宝路吸烟者住在猫主人旁边
  11. 马主住在抽登喜路的人旁边
  12. 温菲尔德吸烟者喜欢喝啤酒
  13. 挪威人住在蓝屋旁边
  14. 德国人抽罗斯曼烟
  15. 万宝路吸烟者有一个喝水的邻居

我试图用以下方法解决它:

房子可以拥有的每个属性都被建模为一个变量,例如“British”、“Dog”、“Green”等。属性可以取 1 到 5 的值,具体取决于它们所在的房子,例如,如果变量“狗”取值3,狗住在第三宫。

这种方法可以很容易地模拟这样的邻居约束:

但不知何故,clpfd即使(IMO)问题被正确建模(我使用与Choco 约束求解器完全相同的模型,结果是正确的),该包也没有产生解决方案。

这是完整的代码:

我是否误解了 中的概念clpfd,或者我只是在这里遗漏了一些明显的东西?如果有帮助,您可以在这里找到使用 Choco 和 Scala 实现的相同方法。


编辑:我认为求解器无法解决问题的原因在于它从来没有为变量提供明确的值,而只是提供范围,例如“Fish 1..3\/5”。