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

prolog - 序言中的解释器之谜

这是一个谜语的信息


六名口译员:Fran 法语、Geraldine German、Dudley Dutch、Spike 西班牙语、Polly 波兰语和罗马尼亚语 Ron。每个人都会说两种语言,其中表明他们的姓氏,即法语(French)、Deutsch(德语)、Dutch(荷兰语)、西班牙语(Spanish)、波兰语(Polish)和罗马尼亚语(Romanian)。以下适用:

  1. 没有口译员会说与他的姓氏相对应的语言。
  2. 没有两个口译员会说相同的两种语言 ​</li>
  3. 六种语言中的每一种都由两个口译员讲。
  4. 斯派克会说荷兰语和德语。
  5. 有会说荷兰语和波兰语的翻译。
  6. Fran 和 Dudley 会讲四种语言(各两种),与他们的姓氏不对应。
  7. 以达德利所说的语言为姓氏的口译员会说法语。
  8. 没有会说德语和波兰语的翻译。

每个口译员都说什么语言?


这是我到现在为止所做的。规则 1,4 和 8 正在返回正确的结果。

我主要需要规则 2 和 7 的帮助。任何帮助表示赞赏。

0 投票
1 回答
162 浏览

prolog - 排除序言中的提示

我有口译员和语言。

和规则:没有口译员说同一种语言。

有什么帮助吗?

0 投票
0 回答
126 浏览

prolog - prolog文件结束错误

操作员错误来自这一行:all_different([H | T]):- member(H,T),!,fail. 文件结尾错误来自这一行:tell(X,Y,Z):- 我正在尝试让它输出类似这样的内容 对于每个客户,以某种格式显示他们的姓名、鞋码和鞋的制造商与此类似:乔买了 13 号耐克。

0 投票
1 回答
115 浏览

prolog - prolog 为不同的参数打印出相同的答案

我正在编写一个解决逻辑难题的 Prolog 程序。当试图打印出答案时,它给了我所有答案的相同答案。逻辑难题的答案是:

  • 吉纳维芙买了一个 4 号的曼扎里塔
  • lucia 买了一个 7 号的 Graffetz
  • 肖娜买了一件 5 号的威利福德
  • vanessa 买了 6 号 Abbot Hill

我的代码如下:

当我去 SWI 并要求它:

-tell(X,Y,Z) 它输出:X 等于genevieve,Y 等于4,Z 等于方丈山。

如果我指定变量之一,例如tell(vanessa,Y,Z),它将打印出:vanessa买了一个4号的方丈山;保持 Y 和 Z 的值相同。

0 投票
4 回答
1202 浏览

logic - 斑马谜题真值表

我正在阅读“计算机科学提炼”一书,但遇到了麻烦。作者建议通过真值表解决爱因斯坦的“斑马谜题”,但我不知道如何解决。我找不到起始条件和变量。你对最小的桌子有什么想法吗?我想我只能创建一个 6^6 版本

0 投票
1 回答
314 浏览

prolog - 给定知识库的 Prolog 谜题 - 不工作

我知道这里有题目的标题:反映人们坐在圆桌旁的序言程序

但我需要一个不同的解决方案,更简单。

所以我有这个问题,4个人围坐在一张方桌旁。

我们知道他们的名字。有人是骨科医生,有人是牙医,有人是外科医生,有人是儿科医生。

我们有一个知识库,您将在代码中看到。

我们必须找到儿科医生的名字。

我的程序找到了它,但没有打印代表桌子上座位的列表的所有四种可能组合。

在终端上我得到:

?- 表(列表),成员(convive(姓名,儿科,_),列表)。

列表 = [convive(basilis, 牙医, 男性), convive(argiro, 儿科医师, 女性), convive(格鲁吉亚, 外科医生, 女性), convive(dimitris, 骨科医生, 男性)], Name = argiro ;

列表 = [convive(格鲁吉亚,外科医生,女性),convive(dimitris,骨科医生,男性),convive(basilis,牙医,男性),convive(argiro,儿科,女性)],名称 = argiro;

错误的。

如您所见,我得到了名字,但只有 2 个可能的列表代表每个人的座位。还应该有:

List = [convive(dimitris,骨科医生,男性),convive(basilis,牙医,男性),convive(argiro,儿科,女性),convive(格鲁吉亚,外科医生,女性)]

List = [convive(argiro, 儿科医师, 女性), convive(格鲁吉亚, 外科医生, 女性), convive(dimitris, 骨科医生, 男性), convive(basilis, 牙医, 男性)]

我已经使用了线条

但是,他们什么也没做,如果我删除它们,我会得到相同的结果。

更新

所以,oppo/3 似乎在给定的列表上运行良好

?- 表(列表)、oppo(convive(argiro、儿科、女性)、姓名、列表)。

List = [convive(basilis, 牙医, 男性), convive(argiro, 儿科医师, 女性), convive(格鲁吉亚, 外科医生, 女性), convive(dimitris, 骨科医生, 男性)],

姓名 = convive(dimitris, 骨科医生, 男性) ;

List = [convive(格鲁吉亚,外科医生,女性),convive(dimitris,骨科医生,男性),convive(basilis,牙医,男性),convive(argiro,儿科医师,女性)],

姓名 = convive(dimitris, 骨科医生, 男性) ;

错误的。


left/3 似乎在做与我首先要解决的事情相同的事情,它适用于 argiro 为 2 且 georgia 为 3 的列表,这是一个简单的情况,但在第二个列表中你可以见上面的 oppo/3 结果,其中 argiro 是第 4 号,georgia 是第 1 号,它应该看到 georgia 再次在 argiro 的左侧,但没有。

?- 表(列表),(convive(argiro,儿科,女性),姓名,列表)。

List = [convive(basilis, 牙医, 男性), convive(argiro, 儿科医师, 女性), convive(格鲁吉亚, 外科医生, 女性), convive(dimitris, 骨科医生, 男性)],

姓名 = convive(格鲁吉亚,外科医生,女性);

错误的。


现在 next/3 返回一些非常令人不安的结果。我不知道该怎么做,我是Prolog的新手。有些还可以,但有些似乎将整个数组作为结果,有些说 List = Name。

前三个结果没问题,第四个和 left/3 一样,它看不到列表中的第一个在最后一个的旁边,所以它返回一个空数组。

这里发生了什么?

?- 表(列表),下一个(convive(argiro,儿科,女性),姓名,列表)。

List = [convive(basilis, 牙医, 男性), convive(argiro, 儿科医师, 女性), convive(格鲁吉亚, 外科医生, 女性), convive(dimitris, 骨科医生, 男性)],

姓名 = convive(格鲁吉亚,外科医生,女性);

List = [convive(basilis, 牙医, 男性), convive(argiro, 儿科医师, 女性), convive(格鲁吉亚, 外科医生, 女性), convive(dimitris, 骨科医生, 男性)],

姓名 = convive(basilis, 牙医, 男性) ;

List = [convive(格鲁吉亚,外科医生,女性),convive(dimitris,骨科医生,男性),convive(basilis,牙医,男性),convive(argiro,儿科医师,女性)],

姓名 = convive(basilis, 牙医, 男性) ;

List = [convive(格鲁吉亚,外科医生,女性),convive(dimitris,骨科医生,男性),convive(basilis,牙医,男性),convive(argiro,儿科医师,女性)],

名称 = [] ;

List = [convive(格鲁吉亚,外科医生,女性),convive(dimitris,骨科医生,男性),convive(basilis,牙医,男性),convive(argiro,儿科医师,女性)],

姓名= [convive(格鲁吉亚,外科医生,女性)];

List = [convive(格鲁吉亚,外科医生,女性),convive(dimitris,骨科医生,男性),convive(basilis,牙医,男性),convive(argiro,儿科医师,女性)],

姓名 = [convive(格鲁吉亚,外科医生,女性),convive(dimitris,骨科医生,男性)];

List = [convive(格鲁吉亚,外科医生,女性),convive(dimitris,骨科医生,男性),convive(basilis,牙医,男性),convive(argiro,儿科医师,女性)],

姓名 = [convive(格鲁吉亚,外科医生,女性),convive(dimitris,骨科医生,男性),convive(basilis,牙医,男性)];

列表 = 名称,

姓名 = [convive(格鲁吉亚,外科医生,女性),convive(dimitris,骨科医生,男性),convive(basilis,牙医,男性),convive(argiro,儿科医师,女性)];

List = [convive(格鲁吉亚,外科医生,女性),convive(dimitris,骨科医生,男性),convive(basilis,牙医,男性),convive(argiro,儿科医师,女性)],

名称 = [] ;

List = [convive(格鲁吉亚,外科医生,女性),convive(dimitris,骨科医生,男性),convive(basilis,牙医,男性),convive(argiro,儿科医师,女性)],

姓名= [convive(格鲁吉亚,外科医生,女性)];

List = [convive(格鲁吉亚,外科医生,女性),convive(dimitris,骨科医生,男性),convive(basilis,牙医,男性),convive(argiro,儿科医师,女性)],

姓名 = [convive(格鲁吉亚,外科医生,女性),convive(dimitris,骨科医生,男性)];

List = [convive(格鲁吉亚,外科医生,女性),convive(dimitris,骨科医生,男性),convive(basilis,牙医,男性),convive(argiro,儿科医师,女性)],

姓名 = [convive(格鲁吉亚,外科医生,女性),convive(dimitris,骨科医生,男性),convive(basilis,牙医,男性)];

列表 = 名称,

姓名 = [convive(格鲁吉亚,外科医生,女性),convive(dimitris,骨科医生,男性),convive(basilis,牙医,男性),convive(argiro,儿科医师,女性)];

错误的。

更新

所以我了解到 prefix/2 与字符串一起使用,例如, prefix(x,[x,y,z]).返回 false。这就是它不起作用的原因,这解释了 next/3 中的结果,但我的问题仍然没有解决。

还有其他方法可以让 left 和 next 与列表的第一部分和最后一部分一起工作吗?

0 投票
1 回答
1020 浏览

prolog - 在 Prolog 中解决爱因斯坦之谜

我正在尝试在 Prolog中解决爱因斯坦谜语。

我编写的程序遇到了困难,基本方法是添加所有约束并让 Prolog 找出唯一可能的解决方案。

问题是 Prolog 找到 0 个解决方案。我已经隔离了使程序从给定解决方案变为无解决方案的约束,但我不明白为什么。

目前对此的解决方案是:

如果我取消注释第一行,那么相同的语句将返回 false。

我想帮助理解为什么会这样。我注意到在部分解决方案中,挪威语出现了两次,这可能表明存在问题。

0 投票
1 回答
1078 浏览

prolog - 序言和逻辑谜题

我似乎对 Prolog 中的事实统一有疑问,但无法确认。一切看起来应该可以工作,考虑到 Prolog 的相对稀有性,我已经查找了使用 Prolog 解决逻辑难题的示例,但没有实际效果。

一个额外的学分分配,所以我不确定它是否有效,但我真的很难从这里开始

问题是它不会将solution(L)其视为谓词或规则,而只是一段文本,因此我什至无法测试它是否正确。我最感兴趣的是为什么它甚至不起作用。

0 投票
3 回答
229 浏览

prolog - prolog 基于网格的逻辑难题卡住了

谜题是这样的:一个岛上有 4 座寺庙。每个寺庙都有一个名称、位置和建造日期。您将获得 4 条线索来帮助您确定哪 4 种组合(姓名、位置、日期)是正确的。我必须使用 prolog 来解决这个问题。

寺庙的名称是:hori_takesi、okabe honzo、sama takako 和 takahashi。地点是:船内,toyagi,uchida和usui。日期是 1525、1585、1645 和 1705。

你会得到以下线索:

  1. 内田神社和建于 1645 年的寺庙,一个是高子大人,另一个是冈部本藏。
  2. 船内的寺庙建于高桥之前
  3. 枥木寺建于臼井寺前120年
  4. Hori Takesi wasa 在 sama takako 之后建造

我创建了以下知识库,其中包含所有可能的组合。

你要问 prolog 的查询是:?-solution(X)。这必须返回所有 4 个正确的组合。所以 X 是 4 个元素的列表,即太阳穴。

解决方案(X)。如果所有线索都为真,则为真。所以我做了以下事情:

我不确定如何从这里继续前进。我得到的另一个提示是使用 member/2。但我不确定如何实现它。如果有人可以帮助我,我会喜欢它。

0 投票
1 回答
174 浏览

oz - 莫扎特奥兹之谜

我正在尝试解决莫扎特盎司中的以下难题。

苏西喜欢动物,收藏了大量的毛绒玩具。然而,有几个是她最喜欢的。今天早上,她决定重新安排她的毛绒玩具,并在她的房间里给她最喜欢的每个人一个特别的地方。除了名字,她最喜欢的每一个毛绒玩具都有一个年龄,当然都比她年轻。确定她最喜欢的毛绒玩具的名称、每只动物的类型、她认为每只动物的年龄(从一岁到五年),以及她将每只最喜欢的毛绒玩具放在房间的什么地方。

  1. 臭鼬两岁了。老虎比放在书架上的动物小一岁,但老虎也比Cuddles大一岁。

  2. 放在椅子上的动物比威利大两岁,比鲸鱼小一岁。

  3. 拥抱不是臭鼬。小布还不到五岁。

  4. 猫被放在了床上。

  5. 这只熊比 Spot 大两岁。艾米是鲸鱼,但她没有被放在枕头上。

  6. 拥抱没有被放在板凳上。

这个谜题取自http://www.puzzles.com/Projects/LogicProblems/SusiesAnimals.htm

我的代码是 -

我试图通过使用年龄数字作为标题并期待年龄数字的结果来解决它。类似于斑马问题http://doc.uh.cz/Mozart-oz/doc/fdt/node23.html

我得到的输出不是我所期望的,我不明白:

我得到的拼图输出

你能告诉我哪里出错了吗?