问题标签 [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 投票
6 回答
3903 浏览

prolog - 在 Prolog 中解决文本逻辑难题 - 查找生日和月份

我正在阅读“7 天内的 7 种语言”一书,并且已经读到了 Prolog 章节。作为学习练习,我试图解决一些文本逻辑难题。谜题如下:

五姐妹的生日都在不同的月份和一周中的不同日子。使用下面的线索,确定每个姐妹的生日是星期几。

  1. 宝拉出生于三月,但不是星期六。阿比盖尔的生日不在周五或周三。
  2. 星期一生日的女孩比布伦达和玛丽出生得早。
  3. 塔拉不是二月份出生的,她的生日是在周末。
  4. 玛丽不是在十二月出生,她的生日也不是在工作日。那个六月份生日的女孩是星期天出生的。
  5. 塔拉在布伦达之前出生,布伦达的生日不是星期五。玛丽不是七月出生的。

对于有经验的 Prolog 程序员来说,我当前的实现可能看起来像是一个笑话。代码粘贴在下面。

我希望得到一些关于如何解决问题以及如何使代码既清晰又密集的意见。

IE:

  1. 我怎样才能避免输入限制说天数必须是唯一的。
  2. 我怎样才能避免输入月份必须是唯一的限制。
  3. 添加关于生日排序的限制。

更新根据 chac 的回答,我能够解决这个难题。按照同样的方法,我们(工作中的编程语言能力小组)也能够解决第二个难题。我已经在 GitHub 上发布了完整的实现和示例输出作为要点

0 投票
3 回答
1468 浏览

prolog - Prolog 逻辑测试示例

我有一个关于 Prolog 的测试,但我无法真正掌握它的基本思想。我有点理解我经历过的一些例子,但我不能坐下来立即知道如何解决一个特定的问题。

我们的教授给了我们一些例子,我想知道是否有人可以指导我如何做到这一点,所以我有一些想法如何处理这样的事情。

这个例子来自我们的书:

我尝试了一些方法,每个人都有一个与他们相关的列表,你会填写事实,但我认为这不是正确的方法。有人可以帮我完成这个吗?谢谢!

编辑:

这是我最终得到的代码,它完成了大部分难题,它留下了一份主菜和一份饮料,但这应该是可以修复的:

0 投票
1 回答
3994 浏览

prolog - 如何以约束满足的方式对爱因斯坦的谜语进行建模(Prolog)

我的 IA 任务是解决爱因斯坦问题。

我必须使用 Prolog 中的 CSP 模型来解决它。我没有给出模型,只有问题和一些输入数据。我的解决方案必须是通用的,我的意思是,对于一些输入数据我必须提供一个解决方案。问题的维度是 N,例如 N 可能是 5(我们有 5 个房子),但它可以变化。

我在 Internet 上找到的许多解决方案都将约束直接放在代码中,但我需要使用输入数据生成它们。该问题必须使用 MAC(维护弧一致性)算法来解决。

我已经阅读了很多关于它的内容(爱因斯坦之谜)。为了实现这个问题,我需要一个问题的表示。

问题是,我不知道如何在 Prolog 中准确地表示问题(我知道基本的 Prolog,没有使用其他库,我们不允许使用 clpfd 库 - prolog clp 求解器)。

我知道我应该从输入(14条线索)+约束说明来自同一组的所有变量(例如国籍)应该不同,我可以实现我的谓词,例如:

例如:

现在,我设法解析了这个输入并获得了一个列表列表:

现在我想我需要使用这个生成的信息来构建一些约束,从我读过的内容来看,使用二进制约束(我认为表示为谓词)是一个好主意,但是我也有一些一元约束,所以我应该怎么做代表约束以包括所有这些?

另一个问题是:如何表示变量(我将在其中获得计算数据),这样我就不需要搜索和修改列表(因为在 prolog 中你不能像在命令式语言中那样修改列表)。

所以我想使用一个变量列表,其中每个变量/元素由一个 3 元组表示:(var, domain, attrV),其中 var 包含变量的当前值,域是一个列表说:[1,2,3,4, .., N], attrV 是对应属性(例如红色)的一个值(N)。一个元素是:(C, [1, 2, 3, 4, 5], red).

其他问题:我应该如何在 prolog 中实现 MAC 算法(使用 AC-3 算法),因为我将有一个元组队列,如果不满足约束,这个队列将被修改,这意味着修改变量列表,以及我应该如何修改 Prolog 中的列表。

任何帮助,将不胜感激!


我尝试使用您上面提供的链接中的 CSP 求解器解决特定版本的问题,但我仍然无法找到解决方案,我想获得解决方案,因为通过这种方式,我会知道如何正确表示通用版本的约束。

添加代码:

0 投票
5 回答
10657 浏览

algorithm - Algorithmically generate a Zebra/Einstein puzzle

Firstly I'm not necessarily looking for a complete algorithm I can just copy and paste, then call it a day. Any "general approach" solutions would be fine for me!

This entire post was spurred by a slow day at work, and stumbling upon this site and not being able to figure out how they implemented their generator.

The Problem

For those of you who don't know, the "Zebra Puzzle" or "Einstein's Puzzle" is a famous logic puzzle that you've probably ran into before.

The full wiki article is here, but I'll post the relevent bits.

This is all well and good. I've found several concise and neat ways online to solve this problem, especially using constraint programming. However, what interests me is making more of these types of puzzles.

Making More

Obviously, a matrix representation is a logical way to think about this. With each column containing a person, house, what they drink, what type of car they drive, etc.

My initial thought was to start with a randomly generated grid that is complete (ie, solved) then (somehow) create hints from the solved version that uniquely identify it. Every time something can be determined, it's removed from the grid.

Ripping off the site I listed at the beginning, the following "hints" that can be used to solve the grid can be of the following type:

  • The person/animal/plant lives/grows in a given house.

  • The person/animal/plant does not live/grow in a given house.

  • The person/animal/plant lives in the same house as the other person/animal/plant.

  • The person/animal/plant is a direct neighbor of the other person/animal/plant.

  • The person/animal/plant is the left or right neighbor of other person/animal/plant.

  • There is one house between the person/animal/plant and the other person/animal/plant.

  • There is one house between the person/animal/plan and the other person/animal/plant on the left or right.

  • There are two houses between the person/animal/plant and the other person/animal/plant.

  • There are two houses between the person/animal/plan and the other person/animal/plant on the left or right.

  • The person/animal/plant lives left or right from the other person/animal/plant.

You can see how these could be generalized, extended, etc;

The difficulty is, using my approach (starting with a complete grid and generating these hints), I'm not sure how to make sure the set of hints I create would absolutely result in the target grid.

For example, if you say "The Englishman does not own a pine tree" you cannot decisively pair two things together at any given time in the puzzle. Yet if there were only two trees remaining to solve for, this could in fact be a decisive piece of evidence.

Am I thinking about this the entirely wrong way? Would a better approach be to create a grid with some randomized, pre-defined known elements (ie, the red house is in the middle) and then build up the grid using these hints as rules for building?

Any advice, articles to read, programming techniques to learn about, etc. would be greatly appreciated!

0 投票
1 回答
180 浏览

prolog - 如何在 Prolog 上编写代码?

请你解释一下我将如何在 Prolog 上编码这个东西?

梅森、亚历克斯、史蒂夫和西蒙站在警察队伍中。其中一位金发碧眼、英俊且没有疤痕。其中两个不是金发碧眼的人站在梅森的两侧。亚历克斯是唯一站在一个英俊男人旁边的人。史蒂夫是唯一一个没有站在一个伤痕累累的男人旁边的人。谁是金发,英俊,不害怕?

我在这里,

p --> 站立(x,y)

twoOfThem(不是金发,站在梅森的两边)

亚历克斯只有一个站在旁边正好一个帅哥

史蒂夫只是没有站在无伤大雅的旁边。

0 投票
0 回答
1152 浏览

prolog - 将爱因斯坦谜题表示为一阶逻辑中的一组封闭公式

我得到了这种形式的经典爱因斯坦/斑马谜题:

让我们假设在同一条路上有五个不同颜色的房子相邻。每个房子里住着一个不同国籍的人。每个男人都有他最喜欢的饮料,他最喜欢的香烟品牌,并养着一种特定的宠物。

任务是将这些陈述表达为一阶逻辑中的一组封闭公式,每个陈述一个,假设拼图中的五个人由英国人、瑞典人、丹麦人、挪威人、德国人和保持(X,Y) 表示人 X 养宠物 Y。这些稍后将转换为序言。

我的问题是我是否要以正确的方式转换语句。现在,我有类似的东西:

这是正确的,还是应该更像我尝试的另一种方式:

我也尝试过类似的事情:

我认为第一个是最正确的,但我不确定。我也不确定如何在一阶逻辑中表示中心或邻居之类的东西。这些是否接近正确?

编辑:我想出了一个我认为可能是正确的解决方案。我注意到它说的是 CLOSED 公式,所以我这样做了:

这是正确的方法吗?任何帮助,将不胜感激。

0 投票
1 回答
337 浏览

prolog - 使用 SWI-Prolog,语法,单例错误

我需要使用 SWI-prolog 来解决家庭作业的逻辑难题,但即使有我的编程背景,我也发现语法和含义非常麻烦。我面临的问题是关于单例变量的错误,并且拼图返回错误。

这是我到目前为止所做的:

这就是问题,向正确方向轻推或帮助我更好地理解语言的答案将不胜感激! 问题

0 投票
1 回答
256 浏览

prolog - Prolog - 尝试解决文本难题

我目前正在尝试学习一点Prolog。作为一个练习,我试图解决以下谜题:

给出了这些规则:

现在有四个人:

哪个人没有卡车?

到目前为止,我想出的是:

现在这似乎还不够。或者这不是在prolog中解决此类难题的方法吗?

编辑:前两个陈述似乎是矛盾的。它们共同产生:每个既没有汽车也没有飞机的人都有汽车。我不确定是否有一个明智的解决方案。

0 投票
2 回答
598 浏览

prolog - 在 Prolog 中解决逻辑难题

我正在学习 Prolog,但我遇到了这个问题,我真的不知道如何完成它。我认为我的代码是正确的,但我在 Sictus 中不断收到警告,我不知道我的错误在哪里。

这是问题所在:

这是我的代码:

我使用了一些斑马拼图的例子来做到这一点。

0 投票
5 回答
1260 浏览

prolog - Prolog Logic/爱因斯坦之谜

问题是

布朗、克拉克、琼斯和史密斯是四位重要的公民,他们以建筑师、银行家、医生和律师的身份为社区服务,尽管不一定分别。布朗比琼斯更保守,但比史密斯更自由,他的高尔夫球手比比他大的男人更好,收入也比比克拉克年轻的男人高

比建筑师挣得多的银行家,既不是最年轻的,也不是最年长的。

打高尔夫球比律师差的医生,比建筑师不那么保守

不出所料,最年长的人最保守,收入最高,最年轻的人是最好的高尔夫球手

每个人的职业是什么?

我写过

当我问

我明白了

我不确定这个错误是什么意思,我相信我已经翻译了所有的线索。