在 Prolog 中解答爱因斯坦之谜

2024-03-08

我正在尝试解决爱因斯坦之谜 https://www.wikiwand.com/en/Zebra_Puzzle在序言中。

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

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

/*There are five houses*/
exists(A, list(A,_,_,_,_)).
exists(A, list(_,A,_,_,_)).
exists(A, list(_,_,A,_,_)).
exists(A, list(_,_,_,A,_)).
exists(A, list(_,_,_,_,A)).

middle_house(A, list(_,_,A,_,_)).

first_house(A, list(A,_,_,_,_)).

nextTo(A, B, list(B,A,_,_,_)).
nextTo(A, B, list(_,B,A,_,_)).
nextTo(A, B, list(_,_,B,A,_)).
nextTo(A, B, list(_,_,_,B,A)).
nextTo(A, B, list(A,B,_,_,_)).
nextTo(A, B, list(_,A,B,_,_)).
nextTo(A, B, list(_,_,A,B,_)).
nextTo(A, B, list(_,_,_,A,B)).

/* each statement will be described using the clues 
house conatins: Color,Owner, Drinks, Smokes, Pet*/
riddle(Houses):-
    /*exists(house(red, englishman, _,_,_),Houses),*/
    nextTo(house(_,norwegian,_,_,_), house(blue,_,_,_,_), Houses),
    exists(house(_,spanish,_,_, dog), Houses),
    exists(house(green, _, coffee, _,_), Houses),
    exists(house(_, ukrain, tea,_,_), Houses),
    nextTo(house(white,_,_,_,_), house(green,_,_,_,_), Houses),
    exists(house(_,_,_,marlbero, cat),Houses),
    exists(house(yellow,_,_,time,_), Houses),
    middle_house(house(_,_,milk,_,_), Houses),
    first_house(house(_,norwegian,_,_,_), Houses),
    nextTo(house(_,_,_,_,fox), house(_,_,_,montena,_), Houses),
    nextTo(house(_,_,_,time,_), house(_,_,_,_,horse), Houses),
        exists(house(_,_,orange,lucky,_), Houses),
    exists(house(_,japanese,parlament,_), Houses).

目前的解决方案是这样的:

?- riddle(Houses).
Houses = list( house(green, norwegian, coffee, marlbero, cat),
               house(white, spanish, orange, lucky, dog),
               house(yellow, norwegian, milk, time, fox),
               house(blue, ukrain, tea, montena, horse),
               house(_G7257, japanese, parlament, _G7260)).

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

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


以下是您可以自行解决此问题的一般方法。事实上,你确实是从一个非常有希望的方向开始的:你试图消除目标。但是,在你的案件中,谁有过错呢?您注释掉的行还是其余的行?你不能肯定地说,因为生成的程序已经工作了。但有一种非常相似且更有希望的方法:尝试尽可能地概括你的程序,这样它仍然会失败。通过这种方式,您将获得一个较小的程序来对失败负责。也就是说,在剩余的可见部分内一定是一个错误!

这是我通过删除目标(在前面添加 *)并用 _ 替换一些术语得到的结果。



:- initialization(riddle(_Sol)).
:- op(950, fy, *).
*_.

riddle(Houses):-
    exists(house(red, _/* englishman */, _,_,_),Houses),
    nextTo(house(_,_/* norwegian */,_,_,_), house(blue,_,_,_,_), Houses),
    * exists(house(_,spanish,_,_, dog), Houses),
    * exists(house(green, _, coffee, _,_), Houses),
    * exists(house(_, ukrain, tea,_,_), Houses),
    nextTo(house(white,_,_,_,_), house(green,_,_,_,_), Houses),
    * exists(house(_,_,_,marlbero, cat),Houses),
    exists(house(yellow,_,_,_/* time */,_), Houses),
    * middle_house(house(_,_,milk,_,_), Houses),
    * first_house(house(_,norwegian,_,_,_), Houses),
    * nextTo(house(_,_,_,_,fox), house(_,_,_,montena,_), Houses),
    * nextTo(house(_,_,_,time,_), house(_,_,_,_,horse), Houses),
    * exists(house(_,_,orange,lucky,_), Houses),
    exists(house(_,_/* japanese */,_/* parlament */,_), Houses).
  

该片段仍然失败,因此错误必须位于程序的可见部分。

似乎所有房子的颜色都存在是很重要的。只有一个目标完全不包含任何房屋颜色……看到了吗?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Prolog 中解答爱因斯坦之谜 的相关文章

  • 在 Prolog 中表达“交换性”的替代方案?

    作为一个Prolog的初学者 我发现Prolog中的交换表达式非常不直观 例如 如果我想表达 X 和 Y 属于一个家庭 例如 family X Y married X Y relative X Y father son X Y 我还应该在定
  • YAP Prolog 中的正向链接?

    我需要在某些 Prolog 问题中使用前向链接器 我想避免使用普通元解释器从头开始实现它 但如果没有其他选项可用 这就是我必须要做的 因为使用元解释器执行此操作会很慢 而且我我确信应该有一些好的实现 有人知道 YAP 或 SWI Prolo
  • 使用 F# 的爱因斯坦之谜解决方案 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我在找爱因斯坦之谜 http en
  • 控制 Prolog 变量值选择

    灵感来自之前的一个问题 https stackoverflow com questions 41595786 using operator to save variables in a list我尝试实现一些可以枚举布尔表达式可能性的东西
  • 计算序言中列表的排列

    在 序言艺术 第二版中有一个问题 您应该定义一个谓词 Even permutation Xs Ys 和类似的奇数排列 当您查询时 例如 Even permutation 1 2 3 2 3 1 和 odd permutation 1 2 3
  • 如何在 Prolog 中解决这个算术表达式难题?

    我有一个编程问题 https blog svpino com 2015 05 08 solution to problem 5 and some other thoughts about this type of questions htt
  • 如何找到排列的索引

    index List Idx Predicate will get List with permutation and I want to know index of permutation For example index 4 1 3
  • 谓词对于列表中的所有元素都必须为 true

    我有一组事实 likes john mary likes mary robert likes robert kate likes alan george likes alan mary likes george mary likes har
  • Prolog中如何选择bagof、setof和findall

    如何在 bagof setof 和 findall 之间做出选择 有什么重要的区别吗 哪个最常用 哪个最安全 感谢您的评论 回答 我检查了SWI Prolog 手册页findall 3 http www swi prolog org pld
  • 查找相邻成员

    我必须找出列表中的两个成员是否相邻 限制是使用append 3谓词 到目前为止 我已经完成了下面的操作 如果它是真的 它就有效 否则我得不到答案 就像它永远运行一样 adjacent X Y L append L1 X Y T1 appen
  • SWI-Prolog 中的跨模块“接口”调用

    这可能是 SWI Prolog 模块系统特有的 假设我们有三个 Prolog 模块 在 SWI Prolog 模块系统中 robin 在文件中robin pl arthur 在文件中arthur pl helper 在文件中helper p
  • 如何验证涉及 diff/2 约束的交换性?

    围绕 diff 2 约束有很多炒作 特别是作为对 2 和 2 的某些非声明性的救援 这种非声明性通常被描述为非单调性 并给出了非交换性的例子 但是测试涉及 diff 2 的测试用例是否可交换的方法是什么 这是我想要做的元解释 我做了交换性测
  • SWI Prolog 转义引号

    我需要在序言中将 放在字符串周围 我从另一个程序获取输入 看起来我无法转义该程序中的 因此我必须在序言中添加 否则序言语句将不起作用 感谢您的帮助 为了讨论strings https stackoverflow com a 39922411
  • Prolog 列表列表获取所有元素

    我有一个列表列表 decide 1 2 3 2 3 6 4 K 我想按 返回所有可能的解决方案 规则是首先返回其列表大小为 1 的值 然后我想返回其大小大于1的值 size 0 size Xs L size Xs N L is N 1 he
  • 我应该如何在序言中设计这个谓词?

    我必须写一个谓词stepup L Z X where L是一个列表并且Z and X是整数 它应该返回true if the Z可以步入X使用列表中用户给出的合法步骤 例如 stepup 7 12 19 6 32 应该返回true sinc
  • Prolog 在技术上是如何工作的?引擎盖下是什么?

    我想更多地了解 Prolog 的内部结构并了解它是如何工作的 我知道如何使用它 但不是它内部如何运作 Prolog 中使用的算法和概念的名称是什么 它可能会构建某种树结构或有向对象图 然后在查询时使用复杂的算法遍历该图 也许是深度优先搜索
  • 将“mod”运算符与“or”一起使用时是否强制具体化?

    我使用 CLP FD 和 SWI Prolog 编写了一个 CSP 程序 我认为当我使用时我需要改进我的约束写作mod操作员 和 一起 在我的谓词中 一个简短的例子 use module library clpfd constr X Y Z
  • WAM 中的扁平化形式

    WAM 教程重构指出查询 p Z h Z W f W 需要使用以下原则进行扁平化 话虽这么说 查询扁平化形式是 X3 h X2 X5 X4 f X5 X1 p X2 X3 X4 我对外部变量的定义感到困惑 请考虑以下内容 p Z h Y a
  • Prolog真的基于封闭世界假设吗?

    在下面封闭世界假设 https en wikipedia org wiki Closed world assumption 目前未知的事实是错误的 Prolog 的语义通常被认为遵循封闭世界假设 例如 here https cstheory
  • Prolog 谓词参数中实例化模式指示符的含义

    查看Prolog文档 谓词签名有时会写成如下 foo Bar Baz Qux Mop 什么是 and 我该如何解释它们 另外 这些是唯一存在的还是还有更多 在这种情况下 这些前缀运算符代表实例化模式 即它们告诉您哪些参数应该是变量或在调用谓

随机推荐

  • 使用适用于 Android 的 LibVLC 创建视频播放器

    我正在尝试使用最后一个 LibVLC 为 Android 应用程序创建一个视频播放器 问题是我不知道这个库是如何工作的 而且我找不到示例来帮助我 正如这里所说https bitbucket org edwardcw libvlc andro
  • Cygwin 中的库“rt”和“dl”

    也许这很愚蠢 但我无法找出必须在 Cygwin 中安装哪个软件包才能修复以下缺失的库 config status creating unix buildinfo config status creating include HsUnixCo
  • 当手机不使用时,AlarmManager 重复警报会随机丢失

    我正在调用背景Service每隔30分钟读取当前位置的经纬度并通过POST API发送到服务器 我在用setRepeating 的方法AlarmManager班级每 30 分钟安排一次闹钟 但有时警报会被错过 服务也不会被调用 为了监控每
  • SQL Server 数据透视表中为空?

    我有这个查询 DECLARE Test TABLE RowID INT IDENTITY 1 1 PRIMARY KEY Name VARCHAR 10 NOT NULL tool VARCHAR 10 NOT NULL stam NVAR
  • ubuntu中libusb.h和usb.h有什么区别?哪一个更好?

    我是 libusb c 编程的新手 我应该知道 libusb h 和 usb h 之间的区别吗 我已经在 Ubuntu xenial 中安装了它们 并带有 libusb 1 0 0 dev 和 libusb dev 包 哪一个更好 它们来自
  • 在 Android 10 / Android Q 上使用捆绑的 ttf 字体时发生崩溃

    当我将 Android 应用程序的目标级别从 28 更新到 29 Android 10 后 应用程序在 Pixel 3 使用 Android 10 上崩溃 使用的版本 Android Gradle 插件 3 5 0 摇篮5 5 1 问题 这
  • 新的 HTML5 Canvas API 支持

    我发现了几篇关于 HTML5 Canvas API 中新功能的帖子 例如路径基元或命中区域 目前的规范 4 8 11 似乎具有以下功能 http www whatwg org specs web apps current work mult
  • 仅加载适用于 ipad 的 css 文件

    我正在尝试加载仅适用于 ipad 的 css 文件 我试过这个 它适用于 iPad 但如果我在桌面上将分辨率降低到 1024 x 768 并在 Firefox 中查看该网站 ipad 样式表也会加载 所以我尝试 但仍然是同样的问题 我如
  • Express JS 路由中使用 formData 获取 POST 为空

    我有一个表单 它使用 fetch 到 AJAX 并在 NodeJS 上有一个路由 当 AJAX POST 命中路由时 req body 显示一个空对象 这是代码 在 app js 中 app use bodyParser json app
  • Web 服务一次只允许我获取 1000 行,但总数超过 30000

    我正在使用 Netsuite 提供的一些 Web 服务https system netsuite com help helpcenter en US Output Help SuiteFlex WebServices STP searchM
  • AWS Lambda:任务超时

    我的学校项目要求我们编写在 AWS Lambda 中运行的 Java 代码 它应该获取特定 URL 的源代码 然后将其上传到 S3 存储桶 Java 代码应在 AWS Lambda 上运行 我获取了 Java 中 String 变量的源代码
  • ElementTree的iterparse() XML解析错误

    我需要解析一个编码为 ISO 8859 1 的 1 2GB XML 文件 在阅读了 NET 上的几篇文章后 似乎 Python 的 ElementTree 的 iterparse 比 SAX 解析更受青睐 我写了一段非常短的代码只是为了测试
  • Selenium chrome 浏览器中的 Feign 焦点

    我正在使用 Selenium 从网站上抓取数据 该网站需要窗口焦点才能显示我需要的某些元素 我希望能够在后台运行我的程序 而不必在运行时聚焦窗口 有没有什么办法可以让网站认为它的重点是 我正在使用硒铬驱动程序 Edit 这是我构建的一个快速
  • Android是否阉割了ARM的Jazelle技术?

    我认为 Android 中的 Java 字节码 混蛋 的理由是性能 我怀疑还有另一个原因 但是 通过更改字节码 他们难道没有让 Jazelle 等硬件加速技术变得毫无意义 从而实际上降低了 Mobile Java 平台的可用性能吗 目标平台
  • 通过蓝牙传输文件,如 Android 蓝牙聊天示例

    如何使用 Android 蓝牙聊天示例并将其更改为文件传输 我想通过蓝牙将本地 SQLite 数据库传输到另一台 Android 设备 我更改了示例代码 http developer android com resources sample
  • 在多个文件之间共享枚举的正确方法是什么?

    我想在当前 C 项目的客户端和服务器部分使用相同的枚举 但不确定执行此操作的正确方法 我可以轻松地将枚举写入它自己的文件中 并将其包含在两个文件中 但这感觉像是不好的做法 将其放入命名空间然后将其包含在两者中是正确的方法吗 我知道这有点主观
  • 如何在 Django 模板上下文中获取“调试”变量?

    根据这个SO帖子 如何检查 django 模板中的 TEMPLATE DEBUG 标志 https stackoverflow com questions 1271631 how to check the template debug fl
  • 将 aSmack 0.8.3 用于 XMPP 聊天应用程序时出现 NoSuchAlgorithmException

    我已经包含了 logcat 输出 请帮我解决这个问题 08 09 11 06 32 762 警告 NetworkManagementSocketTagger 883 setKernelCountSet 10012 0 失败 错误号 2 08
  • 检测多个if语句中哪个条件为假

    我尝试缩短我的代码 因此我来缩短以下类型的 if 语句 a b c d needed to run if empty a echo a is empty elseif empty b echo b is empty elseif empty
  • 在 Prolog 中解答爱因斯坦之谜

    我正在尝试解决爱因斯坦之谜 https www wikiwand com en Zebra Puzzle在序言中 我在编写程序时遇到了困难 基本方法是添加所有约束并让 Prolog 找出唯一可能的解决方案 问题是 Prolog 找到了 0