prolog 如何使用 succ 运行递归查询?

2024-03-03

有人可以向我解释一下为什么这个序言查询会这样工作吗?定义是:

add(0,Y,Y). 
add(succ(X),Y,succ(Z)):- add(X,Y,Z).

鉴于这种:

?-  add(succ(succ(succ(0))),  succ(succ(0)),  R).

这是查询的轨迹:

Call:  (6)  add(succ(succ(succ(0))),  succ(succ(0)),  R) 

Call:  (7)  add(succ(succ(0)),  succ(succ(0)),  _G648) 

Call:  (8)  add(succ(0),  succ(succ(0)),  _G650) 

Call:  (9)  add(0,  succ(succ(0)),  _G652) 

Exit:  (9)  add(0,  succ(succ(0)),  succ(succ(0))) 

Exit:  (8)  add(succ(0),  succ(succ(0)),  succ(succ(succ(0)))) 

Exit:  (7)  add(succ(succ(0)),  succ(succ(0)), 
                                              succ(succ(succ(succ(0))))) 

Exit:  (6)  add(succ(succ(succ(0))),  succ(succ(0)), 
                                                succ(succ(succ(succ(succ(0))))))

该教程中最让我困惑的部分是,在第一个参数中,succ 被剥离,并且它会递归。不过,在递归时,R 获得了成功...如何实现?!另外,第一个出口(9)处的零从何而来?我是序言新手,我正在尝试理解作业中的语言。非常感谢任何帮助。

注意:对于任何感兴趣的人,本教程的链接是


你看,call and exit are verbs,解释器尝试解决您提出的查询而采取的操作。然后,跟踪会公开已完成的实际工作的详细信息,并让您以历史的角度查看它。

当 Prolog 必须选择一条规则(acall),它使用name你给它(所谓的functor),并尝试unify规则头部的每个参数。那么我们通常说 Prolog 也考虑arity,即用于选择的参数数量。

Unification尝试使两项“相等”,值得注意的结果被称为bindings变量。您已经知道变量是那些开头的名称Uppercase。这些名称标识规则中未指定的值,即placeholders为了争论。为了避免混淆,当 Prolog 显示跟踪时,变量被重命名,以便我们可以识别它们,因为相关细节是identities或在证明过程中建立的约束力。

然后你看到这样的_G648跟踪中的符号。他们留下来是为了尚未实例化被调用目标的参数,即R and Z。 R 是唯一的(仅出现在顶层调用中),因此此 Prolog 善意地保留用户友好的名称,但 Z 来自程序,可能会出现多次,然后被重命名。

回答这个问题

?-  add(succ(succ(succ(0))),  succ(succ(0)),  R).

Prolog首先尝试匹配

add(0,Y,Y). 

并失败,因为 succ(succ(succ(0)) 不能等于 0。 然后尝试

add(succ(X),Y,succ(Z)) :- add(X,Y,Z).

因此必须解决这些绑定(调用者术语的左侧):

succ(succ(succ(0))) = succ(X)
succ(succ(0)) = Y
R = Z

你可以明白为什么 X 变成succ(succ(0)),我们有一个新的目标要证明,即规则体add(X,Y,Z)刚刚建立的绑定:

添加(succ(succ(0)),succ(succ(0)),_G648)

依此类推...直到 X 变为0和进球比赛

add(0,Y,Y).

那么Y就变成了succ(succ(0)),值得注意的是还给赋值给Z在调用规则中。

HTH

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

prolog 如何使用 succ 运行递归查询? 的相关文章

  • SWI-Prolog 中的可逆谓词和字符串

    append 3是一个非常强大的谓词 假设我想要一个以相同方式工作但针对 SWI Prolog 字符串的谓词 我看到的最简单的方法是将这些字符串转换为列表string codes 2 然后应用append 3 然后使用string code
  • 在 prolog 中将浮点数转换为整数

    如何在prolog中将浮点数转换为整数 I tried integer truncate sqrt 9 false integer round sqrt 9 false 谓词integer 1你使用的是真的iff它的参数是一个整数 自任期以
  • 这是如何计算的?我试图了解 H 的值如何在列表中分配

    该谓词应该打印尺寸列表N包含可能的排列0 and 1 我的问题是 H每次递归都会结转 或者使用以下值创建列表bit H 发生在回溯阶段吗 bit 0 bit 1 gen 0 gen N H T N gt 0 bit H N1 is N 1
  • Prolog 中的否定作为失败是一种程序行为吗?

    我有一个关于否定即失败在 Prolog 语言中 这是一个理论性多于实践性的问题 因为我清楚这个例子是如何工作的 所以我有以下 Prolog 程序 Fatti che specificano quali esseri sono degli a
  • 使用失败、回溯 Prolog 查找列表的最小值

    我想使用导致回溯的失败来计算列表的最小值 我如何改变分钟 分钟 X 分钟 以使其工作 min X A B X is the min of A B min X X Y X lt Y min Y X Y Y lt X member X X me
  • 在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 中不带双精度的列表的所有组合

    有没有一种简单的方法可以获取列表的所有组合而无需双精度 没有双打我的意思是也没有彼此的排列 所以不行 a b c and c a b or c b a 因此对于输入 a b c 输出将是 a b c a b a c b c a b c 我只
  • Prolog 中的失败谓词有什么用?

    我想不出我需要它的情况 优雅的系统提供false 0作为命令式的声明式同义词fail 0 它有用的一个例子是当您想要手动强制回溯副作用时 例如 between 1 3 N format line w n N false line 1 lin
  • 在 dll 中嵌入 prolog 引擎

    我最近一直在开发一个嵌入 prolog 推理引擎的 C 应用程序 正如标题中所述 我现在尝试生成一个 DLL 而不是可执行文件 以便我可以在另一个项目中使用它 由于我是 DLL 开发的新手 我想我可以从一个小例子开始 我有3个文件 like
  • current_prolog_flag double_quotes DCG(代码或字符)?

    在使用 SWI Prolog DCG 时 我注意到有些人注意到 set prolog flag double quotes codes Jan http www swi prolog org pldoc man section string
  • 如何在 swi-prolog 的 prolog 文件中运行 prolog 查询?

    如果我有一个定义规则的 prolog 文件 并在 Windows 中的 prolog 终端中打开它 它会加载事实 然而 然后它显示 提示我手动输入一些内容 如何将代码添加到文件中 以便它实际上会评估这些特定的语句 就像我输入它们一样 像这样
  • YAP Prolog 中的正向链接?

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

    我有根据我之前的问题制作的跟踪元解释器here https stackoverflow com questions 27235148 implementing cut in tracing meta interpreter prolog 我
  • 如何实现 not_all_equal/1 谓词

    如何实施not all equal 1谓词 如果给定列表包含至少 2 个不同的元素 则该谓词成功 否则失败 这是我的尝试 不是很纯粹的尝试 not all equal L member H1 L member H2 L H1 H2 gt t
  • 如何在Prolog中编写cmp_list/3函数?

    Write a predicate cmp list 3 the first 2 arguments are 2 lists and the last one is Comparison which means ge lt le or gt
  • 为什么在具体化中将 clpfd 变量分配给实际值?

    我正在开发一个 SWI Prolog 程序 该程序使用 CLP FD 约束来找到特定问题的解决方案 为此 我碰巧需要两个列表的 未定位 重叠 那是 List La长度为A List Lb长度为 B A gt B 未定位的重叠列表是La Lb
  • 在 Prolog、尾递归中计算斐波那契数列

    我想在 Prolog 中以递归尾部模式计算斐波那契数列 fibonacci 0 0 fibonacci 1 1 fibonacci N Result fibonacci N 1 0 fibonacci N Result Count Coun
  • 实现用户定义的算术函数

    如何添加函数 例如汉明权重 并在右侧出现的表达式中使用它是一些 is 2 goal 像 goal expansion 或 term expansion 这样的东西可以帮助这里吗 我承认这不是一个大功能 但它可以提高我的一些 Prolog 程
  • 如何在 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

随机推荐

  • 自动递增宏扩展

    使用普通C预处理器宏 是否可以创建类似以下内容 INIT BASE 0x100 init starting number define BASE A GET NEXT BASE equivalent to define BASE A 0x1
  • jQuery 查找浮动 li 中每行的项目数

    有没有办法找到项目的数量 li标签 内ul其中有它的float set to left 假设我有大量文件夹 这些文件夹在视觉上表示为li标签 由于浮动行为 一旦li不适合单行 它们将被向下推 给出行和列的外观 我的问题是 使用 jQuery
  • JAVAFX:可以通过代码设置css吗?

    我有以下代码 progress bar gt bar fx background color linear gradient from 0em 0 75em to 0 75em 0px repeat fx accent 0 fx accen
  • 我如何向 Activemq 发送消息

    我从来不工作JMS 最近我下载了Activemq并更改端口号61616 to 61617 in all conf activemq xml文件 我从命令提示符运行以下命令并在浏览器上打开控制台页面 C Users Infratab Bang
  • 如何自动缩放一组控件的字体大小?

    我在 WPF 网格中有一些 TextBlock 我想根据它们的可用宽度 高度进行缩放 当我搜索自动缩放字体大小时 典型的建议是将 TextBlock 放入 ViewBox 中 所以我这样做了
  • Android MediaRecorder API 不断裁剪视频比特率

    我使用 MediaRecorder API 一段时间了 我以为所有问题都已经过去了 但我想我错了 我正在使用 MediaRecorder API 将视频录制到文件中 当我使用高质量的 setProfile 时 我得到了良好的质量 但是当我尝
  • 如何在 React Native 中拉伸静态图像作为背景?

    我想在我的 React Native 应用程序中使用背景图像 图像比屏幕小 所以我必须拉伸它 但如果图像是这样 它就不起作用从资源包加载 var styles StyleSheet create bgImage flex 1 flexDir
  • 使用 MediaWiki 从 Wikia 页面提取文本,但返回结果一片混乱,是否有更好的方法可以从每个部分提取文本?

    我正在开发一个 Android 应用程序 它从 Wikia 页面提取信息并将其显示在应用程序中 我目前正在拉动所有类别进行导航 并将我的应用程序设置为在 WebView 中显示页面 但我只想拉动信息并自行格式化 而不是通过传递到 WebVi
  • android:如何在字符串中添加下划线

  • 按组计算值之间的差异并匹配时间

    对于每只鸟 我想计算不同日期的平均每小时体温 Tb 测量值 Tb Periods 之间的差异 我的目标是能够比较 BirdX 从 0900 PreI 到 09 00 DayI 10 00 PreI 到 10 00 PostI 等的 Tb 变
  • 如何在 POST 期间获取不同资源的 JAX-RS @Path?

    我有两个用于涉及用户资源的简单 Web 服务 Jersey 和 GlassFish 的 REST 类 一个对所有用户进行操作 例如 POSTing 的工厂 另一个对单个用户进行操作 例如 GET PUT 删除 他们位于 Stateless
  • 在sql server中使用case语句更新多列

    我想使用 case 语句更新表 查询是这样的 select case columnname when name1 then begin update table set pay1 pay1 100 pay2 pay2 20 pay3 pa
  • .Net Core 无法使用位图

    我正在使用 Net Core 2 1 开发 Web 服务 我有一个字节数组 其中包含所有像素值 灰度 宽度 高度 我想从这些参数创建一个位图 这是我的代码 来自一个正在运行的 Net Framework 4 项目 public FileRe
  • CollapsingToolbarLayout 未正确调用 requestLayout()

    我有一个折叠的工具栏布局 其中包含图像 折叠时显示工具栏标题 我需要更改工具栏标题字体 因此我在工具栏布局中添加了一个文本视图 现在 每当我折叠工具栏时 都会重复生成以下错误 08 12 13 14 19 604 2263 2263 com
  • 什么时候应该从类方法返回对对象的引用

    从类方法返回引用的最佳实践是什么 是否希望在没有引用的情况下返回基本类型 而希望通过引用返回类对象 您推荐的任何文章 最佳实践文章 我假设你所说的类方法是指成员函数 通过引用返回 的意思是 返回对成员数据的引用 这主要与返回对 local
  • Coq 中的“错误:宇宙不一致”是什么意思?

    我正在努力通过软件基础 http www cis upenn edu bcpierce sf current 目前正在做教堂数字的练习 这是自然数的类型签名 Definition nat forall X Type X gt X gt X
  • Google Finance,如何获取 JSON 数据流?

    我之前试图解释这一点 但显然失败了 因此 如果您打开了谷歌金融图表 例如 http www google com finance q INDEXNASDAQ IXIC http www google com finance q INDEXN
  • 将 HTTP 响应正文解析为 XML

    我使用此代码执行 HTTP 请求并解析 XML 响应 using HttpWebResponse resp req GetResponse as HttpWebResponse if resp StatusCode HttpStatusCo
  • R中基于移动时间窗口连接数据

    我有每小时记录一次的天气数据 以及每 4 小时记录一次的位置数据 X Y 我想知道 X Y 位置的温度是多少 天气数据并不完全相同 因此 我为每个位置编写了这个循环 以扫描天气数据 查找日期 时间中的 最接近 并提取该时间的数据 问题是我编
  • prolog 如何使用 succ 运行递归查询?

    有人可以向我解释一下为什么这个序言查询会这样工作吗 定义是 add 0 Y Y add succ X Y succ Z add X Y Z 鉴于这种 add succ succ succ 0 succ succ 0 R 这是查询的轨迹 Ca