Prolog 变量查询中的“\+”问题

2024-04-12

我正在读《七周七种语言》atm,我对一些 Prolog 查询感到困惑,我不明白对“否”的回答。

The friends.pl文件看起来像这样:

likes(wallace, cheese).
likes(grommit, cheese).
likes(wendolene, sheep).

friend(X, Y) :- \+(X = Y), likes(X, Z), likes(Y, Z).

我可以对其进行一些简单的查询,例如:

| ?- ['friends'].
compiling /home/marc/btlang-code/code/prolog/friends.pl for byte code...
/home/marc/btlang-code/code/prolog/friends.pl compiled, 12 lines read - 994 bytes written, 8 ms

yes
| ?- friend(wallace,grommit).

yes
| ?- friend(wallace,wendolene).

no

这一切都在预料之中。现在,我想在查询中引入一个变量。我的意图是 Prolog 将为我提供华莱士所有朋友的列表。我期待着X = grommit,但我得到了no:

| ?- trace.
The debugger will first creep -- showing everything (trace)

yes
{trace}
| ?- friend(wallace,X).
      1    1  Call: friend(wallace,_16) ?
      2    2  Call: \+wallace=_16 ?
      3    3  Call: wallace=_16 ?
      3    3  Exit: wallace=wallace ?
      2    2  Fail: \+wallace=_16 ?
      1    1  Fail: friend(wallace,_16) ?

no
{trace}

它甚至没有尝试统一X (_16) with grommit. Why?


这是朋友的定义:

friend(X, Y) :- \+(X = Y), likes(X, Z), likes(Y, Z).

这里重要的是你从\+(X = Y)通常定义为:

\+ Goal :- Goal,!,fail

请注意,这意味着如果目标成功,您肯定会失败。自由变量(尚未分配的变量)将始终统一,因此是相等的,因此自由变量总是会失败。因此,如果 X 或 Y 还没有值,它永远不会分配值。

Instead

friend(X, Y) :-  likes(X, Z), likes(Y, Z), \+(X = Y)

会表现得更符合你的预期。

这里的问题是,prolog 为您提供了控制程序流程的强大方法,但这些方法并不太适合其更面向逻辑的设计。应该可以以不会产生这些问题的方式表达“否定为失败”类型的约束。由于这个原因,我并不是 prolog 的忠实粉丝。

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

Prolog 变量查询中的“\+”问题 的相关文章

  • 在Prolog中,可以按随机顺序选择解决方案吗?

    如果我有以下情况 a X X 1 X 2 X 3 X 4 我可以按确定性顺序生成解决方案 a X X 1 X 2 X 3 X 4 是否有任何方法可以要求系统以非确定性 随机顺序产生解决方案 例如 a X X 4 X 1 X 3 X 2 我知
  • Prolog - 回文函子

    我正在尝试写一个谓词palindrome 1在 Prolog 中 当且仅当其列表输入由回文列表组成时 这才是正确的 例如 palindrome 1 2 3 4 5 4 3 2 1 is true 有什么想法或解决方案吗 回文列表是一个向后读
  • 序言排列函数

    我是 Prolog 的新手 我知道排列的递归函数 即 per per L X P del X L L1 per L1 P 我想知道当我们收到时这个函数在最后一次迭代中的逻辑树per 它返回哪个元素 Sonia 您还没有给我们 del 谓词
  • Prolog 的良好初学者材料 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在SWI-Prolog中启用所有统一中的发生检查?

    根据维基百科 https en wikipedia org wiki Occurs check 为所有统一提供声音统一的实现是 Qu Prolog 和 Strawberry Prolog 以及 可选地 通过运行时标志 XSB SWI Pro
  • 如何确定矩阵的所有给定坐标都是相连的?

    给定一个网格 我如何确定网格的元素是否都在单个区域中 在下面的情况下是正确的 因为矩阵中的每个元素都有一个邻居 示例1 gridneighbours 1 1 1 2 1 3 2 1 2 2 2 3 3 1 4 1 4 2 true 然而在我
  • 如何在 Prolog 中修复这个循环谓词?

    为什么这不能在 Prolog 中定义 已婚 married X Y married Y X 这些类型的循环谓词不允许吗 我该如何解决它 Thanks 如果我的语法错误请原谅我 我已经有一段时间没有使用 Prolog 了 典型的解决方案是在子
  • 如何在 SWI-Prolog 中创建事实?

    我只想创建类似的东西 like x y 我已经尝试了很长时间了 真的很沮丧 谁能告诉我该怎么做 我假设您正在交互地使用 swi 并尝试输入事实会给您一个如下错误 1 like x y ERROR toplevel Undefined pro
  • 获取 Prolog 中的解决方案列表

    我正在学习 Prolog 并且正在阅读一本名为 人工智能 Prolog 编程 的书 作为练习 我想学习如何扩展本书中的示例之一 有人可以帮忙吗 假设您有以下事实 parent pam bob pam is a parent of bob p
  • 二叉树的 Herbrand 宇宙、Herbrand 基础和 Herbrand 模型(序言)

    什么是二叉树的 Herbrand 宇宙 Herbrand Base 和 Herbrand Model binary tree empty binary tree tree Left Element Right binary tree Lef
  • 什么是谓词调度

    我最近看到很多关于 Clojure 中谓词分派的讨论 想知道这件事是否有什么意义 换句话说 什么是谓词分派以及它与泛型函数 OOP 多态性和模式有何不同 谢谢 谓词分派包含泛型函数 OOP 多态性 模式匹配等 一个好的概述是谓词调度 统一的
  • 依赖规则顺序

    为了计算两个相同长度列表之间的汉明距离 我使用foldl hamm A B 0 R 有了这个定义hamm 4 hamm A A V V hamm A B V0 V1 A B V1 is V0 1 第一条规则的删减可以防止不必要的回溯 然而
  • 如何在 swi-prolog 的 prolog 文件中运行 prolog 查询?

    如果我有一个定义规则的 prolog 文件 并在 Windows 中的 prolog 终端中打开它 它会加载事实 然而 然后它显示 提示我手动输入一些内容 如何将代码添加到文件中 以便它实际上会评估这些特定的语句 就像我输入它们一样 像这样
  • 使用 Java 8 谓词的 JPA 存储库过滤器

    我在使用 Spring Boot 的一次面试测试中有一个要求 我必须创建一个端点 该端点接受一堆可选请求参数 然后根据这些参数 如汽车型号 车牌 发动机类型 制造商 返回汽车列表 司机 租赁公司等 汽车 司机和制造商都是独立的实体 我在 J
  • 在序言中减去或添加列表的列表?

    我对序言相当陌生 正在尝试摆弄列表列表 我很好奇如何添加两个列表列表或减去它们从而得到一个列表列表 如果我有两个列表 可以说 SomeList 1 2 3 4 5 6 7 8 SomeList2 1 2 3 4 5 6 7 8 我该如何添加
  • 在 Prolog 中动态拆分列表

    我从序言开始几周 但我看到了更深入的操作列表的递归谓词的构造 我的问题是 是否可以构建一个谓词 将给定列表拆分为给定数量的其他列表 比如我想象的 split H T NumberLists Lists 递归实现 split 1 2 3 4
  • 列表中的连续元素

    我正在阻止一个谓词来编码Prolog 我需要对两个谓词进行编码 如果我打电话 u a b c d e f X 它会给X a b X b c X c d 如果我打电话 v a b c d e f X 它会给X a b X c d X e f
  • 导入 csv 文件数据以填充 Prolog 知识库

    我有一个 csv 文件example csv其中包含两列 标题为 var1 和 var2 我想填充一个最初为空的 Prolog 知识库文件import pl具有重复的事实 而每一行example csv处理方式相同 fact A1 A2 f
  • 问题 - 序言中的形式语言

    我正在尝试构建一个 DCG 它可以识别与此形式匹配的所有列表 a n b 2m c 2m d n 我写下了以下规则 s gt s gt ad ad gt a ad d ad gt bc bc gt b b bc c c bc gt a gt
  • 计算序言中列表的排列

    在 序言艺术 第二版中有一个问题 您应该定义一个谓词 Even permutation Xs Ys 和类似的奇数排列 当您查询时 例如 Even permutation 1 2 3 2 3 1 和 odd permutation 1 2 3

随机推荐

  • Jax-RS 中可选的 @PathParam

    我有一项服务 其中路径的最后一部分是可选的 用户都可以输入 mypath and mypath param1 我尝试使用正则表达式来过滤路径的最后部分 Path mypath param1 param1 我使用 RestEasy 作为我的
  • 使用 IF 语句时如何将 shell 命令拆分为多行?

    当命令是 shell 的一部分时 如何将命令拆分为多行if陈述 这有效 if fab fabfile deploy fabfile py forward agent disable known hosts deploy target the
  • 有没有优化 R 性能的文档? [复制]

    这个问题在这里已经有答案了 我对 R 相当陌生 令我印象深刻的一件事是它运行得相当慢 有没有优化R的文档 比如优化Python描述的很好here http wiki python org moin PythonSpeed Performan
  • 防止/禁用 Xcode 滚动导航

    每当我在故事板模式下使用 Xcode 时 我都会用触控板滚动 如果我向左滚动太远 Xcode 会将我带到我正在处理的最后一个 m h 文件 这太令人沮丧了 我不希望能够向左或向右滑动两根手指来在 Xcode 中导航 但我真的很喜欢 Safa
  • 将 .git 文件夹在工作树层次结构中向上移动

    昨天 我在 git 存储库上执行了其中一项操作 请参阅下面的代码片段 以便有效地将我的项目向上移动文件夹层次结构中的几个文件夹 这基本上列出了所有文件并向它们添加前缀文件夹名称并相应地更新索引 旧布局 Root Sublevel 1 Sub
  • 为什么我的应用没有在 Google Play 上显示?刚刚发布

    我只是第一次尝试发布我的应用程序 我完成了开发者控制台上的步骤 它现在显示 已发布 并带有绿色复选标记 在我点击 激活 和 发布 后 没有错误 然而 我尝试在手机 平板电脑和 Chrome 浏览器上的 Google Play 商店 称为 U
  • 将 PHP 多维数组返回到 Javascript/AJAX

    我的理解是 为了将复杂的 PHP 变量返回给 Javascript 应该通过 AJAX 和 json encode 来完成 有人能给我一个实际的例子 PHP 和 Javascript 代码 吗 假设我们在 PHP 中有一个两维数组 twoD
  • Firebase 字段名称会自动更改吗?

    你好 firebase 开始自动更改我的字段名称 这造成了一个大问题 我怎么解决这个问题 My Class public class TUser private String UserKey private String LicenceKe
  • C# 4 中会有通用属性吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 备份文件关闭Excel VBA

    我希望 Excel 在文件关闭时自动备份工作簿 而不提示用户 我在网上找到了下面的优秀代码 忘记源代码 但备份文件类型正在更改为我无法打开的 BAK 文件 我该如何解决这个问题 两个文件将位于同一文件夹中 备份应具有相同的文件名和 bak
  • 函数模板特化编译错误

    A hh template
  • 检索 ODBC 表并插入 SQL Server CE 数据库

    我有一个到数据库的 ODBC 连接 我需要其中的一个数据表 该表大约有 20 行和几千行数据 我打算将此表插入到我的本地 SQL Server CE 数据库中 以便进一步使用它 两种连接都经过测试并且可以工作 我的尝试是只插入一列以使事情变
  • 创建与 .accdb 访问文件的连接

    我已经上这门课几天了 现在正在网上搜索试图找到解决方案 我在这里尝试做的是使用扩展名连接到 Access 2010 数据库 accdb我已经成功连接到旧数据库的扩展 mdb但不是 accdb 我尝试卸载 Office 并重新安装 x64 版
  • Zend 反向匹配路由返回当前 URL

    我正在使用 Zend Framework 并尝试设置一些自定义路由 这些在调度期间似乎工作正常 但反向匹配根本不起作用 这些是我设置的路线 router gt addRoute category new Zend Controller Ro
  • 用于获取 netstat -s 统计信息的 Windows API [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在搜索一个 Windows API 它返回与 netstat s 相同的统计信息 您可以使用Get
  • 如何将以 HTML 编写的 SVG 保存为 SVG 文件? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 以下 SVG 代码写入 HTML 文
  • 只读可见目录的文件名

    我试图读取文件夹的文件名并将它们保存在数组列表中 但我在数组中得到了我不想要的不可见文件名 实际上我只想保存 txt 文件名 有谁知道在创建列表之前如何在代码中更改它 String pathLevel Users MaxRuizTagle
  • 如何在 Oracle PLSQL 中将数字的小数位数扩展到最少?

    我不知道如何选择以下内容 123 gt 123 00000 123 12 gt 123 12000 123 123456 gt 123 123456 我想将小数位数扩展到例如 5 位小数 最少 如果根本没有小数位 则应该有 5 个零 小数点
  • 此更新、选择组合查询线程安全吗?

    我有一张名为席位的桌子 其架构如下 id taken 对于每个用户 我随机选取一个未采取的 id 并分配给该用户 这里为简单起见 我将采取 1 我正在使用的查询 update seats u inner join SELECT id fro
  • Prolog 变量查询中的“\+”问题

    我正在读 七周七种语言 atm 我对一些 Prolog 查询感到困惑 我不明白对 否 的回答 The friends pl文件看起来像这样 likes wallace cheese likes grommit cheese likes we