问题标签 [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.
prolog - 序言中的解释器之谜
这是一个谜语的信息
六名口译员:Fran 法语、Geraldine German、Dudley Dutch、Spike 西班牙语、Polly 波兰语和罗马尼亚语 Ron。每个人都会说两种语言,其中表明他们的姓氏,即法语(French)、Deutsch(德语)、Dutch(荷兰语)、西班牙语(Spanish)、波兰语(Polish)和罗马尼亚语(Romanian)。以下适用:
- 没有口译员会说与他的姓氏相对应的语言。
- 没有两个口译员会说相同的两种语言 </li>
- 六种语言中的每一种都由两个口译员讲。
- 斯派克会说荷兰语和德语。
- 有会说荷兰语和波兰语的翻译。
- Fran 和 Dudley 会讲四种语言(各两种),与他们的姓氏不对应。
- 以达德利所说的语言为姓氏的口译员会说法语。
- 没有会说德语和波兰语的翻译。
每个口译员都说什么语言?
这是我到现在为止所做的。规则 1,4 和 8 正在返回正确的结果。
我主要需要规则 2 和 7 的帮助。任何帮助表示赞赏。
prolog - 排除序言中的提示
我有口译员和语言。
和规则:没有口译员说同一种语言。
有什么帮助吗?
prolog - prolog文件结束错误
操作员错误来自这一行:all_different([H | T]):- member(H,T),!,fail.
文件结尾错误来自这一行:tell(X,Y,Z):-
我正在尝试让它输出类似这样的内容 对于每个客户,以某种格式显示他们的姓名、鞋码和鞋的制造商与此类似:乔买了 13 号耐克。
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 的值相同。
logic - 斑马谜题真值表
我正在阅读“计算机科学提炼”一书,但遇到了麻烦。作者建议通过真值表解决爱因斯坦的“斑马谜题”,但我不知道如何解决。我找不到起始条件和变量。你对最小的桌子有什么想法吗?我想我只能创建一个 6^6 版本
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 与列表的第一部分和最后一部分一起工作吗?
prolog - 在 Prolog 中解决爱因斯坦之谜
我正在尝试在 Prolog中解决爱因斯坦谜语。
我编写的程序遇到了困难,基本方法是添加所有约束并让 Prolog 找出唯一可能的解决方案。
问题是 Prolog 找到 0 个解决方案。我已经隔离了使程序从给定解决方案变为无解决方案的约束,但我不明白为什么。
目前对此的解决方案是:
如果我取消注释第一行,那么相同的语句将返回 false。
我想帮助理解为什么会这样。我注意到在部分解决方案中,挪威语出现了两次,这可能表明存在问题。
prolog - 序言和逻辑谜题
我似乎对 Prolog 中的事实统一有疑问,但无法确认。一切看起来应该可以工作,考虑到 Prolog 的相对稀有性,我已经查找了使用 Prolog 解决逻辑难题的示例,但没有实际效果。
这是一个额外的学分分配,所以我不确定它是否有效,但我真的很难从这里开始
问题是它不会将solution(L)
其视为谓词或规则,而只是一段文本,因此我什至无法测试它是否正确。我最感兴趣的是为什么它甚至不起作用。
prolog - prolog 基于网格的逻辑难题卡住了
谜题是这样的:一个岛上有 4 座寺庙。每个寺庙都有一个名称、位置和建造日期。您将获得 4 条线索来帮助您确定哪 4 种组合(姓名、位置、日期)是正确的。我必须使用 prolog 来解决这个问题。
寺庙的名称是:hori_takesi、okabe honzo、sama takako 和 takahashi。地点是:船内,toyagi,uchida和usui。日期是 1525、1585、1645 和 1705。
你会得到以下线索:
- 内田神社和建于 1645 年的寺庙,一个是高子大人,另一个是冈部本藏。
- 船内的寺庙建于高桥之前
- 枥木寺建于臼井寺前120年
- Hori Takesi wasa 在 sama takako 之后建造
我创建了以下知识库,其中包含所有可能的组合。
你要问 prolog 的查询是:?-solution(X)。这必须返回所有 4 个正确的组合。所以 X 是 4 个元素的列表,即太阳穴。
解决方案(X)。如果所有线索都为真,则为真。所以我做了以下事情:
我不确定如何从这里继续前进。我得到的另一个提示是使用 member/2。但我不确定如何实现它。如果有人可以帮助我,我会喜欢它。
oz - 莫扎特奥兹之谜
我正在尝试解决莫扎特盎司中的以下难题。
苏西喜欢动物,收藏了大量的毛绒玩具。然而,有几个是她最喜欢的。今天早上,她决定重新安排她的毛绒玩具,并在她的房间里给她最喜欢的每个人一个特别的地方。除了名字,她最喜欢的每一个毛绒玩具都有一个年龄,当然都比她年轻。确定她最喜欢的毛绒玩具的名称、每只动物的类型、她认为每只动物的年龄(从一岁到五年),以及她将每只最喜欢的毛绒玩具放在房间的什么地方。
臭鼬两岁了。老虎比放在书架上的动物小一岁,但老虎也比Cuddles大一岁。
放在椅子上的动物比威利大两岁,比鲸鱼小一岁。
拥抱不是臭鼬。小布还不到五岁。
猫被放在了床上。
这只熊比 Spot 大两岁。艾米是鲸鱼,但她没有被放在枕头上。
拥抱没有被放在板凳上。
这个谜题取自http://www.puzzles.com/Projects/LogicProblems/SusiesAnimals.htm
我的代码是 -
我试图通过使用年龄数字作为标题并期待年龄数字的结果来解决它。类似于斑马问题http://doc.uh.cz/Mozart-oz/doc/fdt/node23.html
我得到的输出不是我所期望的,我不明白:
你能告诉我哪里出错了吗?