了解 Prolog 列表

2023-12-31

我试图理解 Prolog 列表,以及如何在递归函数末尾“返回”/实例化值。

我正在看这个简单的例子:

val_and_remainder(X,[X|Xs],Xs).
val_and_remainder(X,[Y|Ys],[Y|R]) :-
   val_and_remainder(X,Ys,R).

如果我打电话val_and_remainder(X, [1,2,3], R).然后我会得到以下输出:

X = 1, R = [2,3]; 
X = 2, R = [1,3];
X = 3, R = [1,2];
false.

但我很困惑为什么在基本情况下(val_and_remainder(X,[X|Xs],Xs).) Xs必须按其实际情况出现。

如果我打电话val_and_remainder(2, [1,2,3], R).那么在我看来,它会像这样运行该程序:

% Initial call
val_and_remainder(2, [1,2,3], R).

val_and_remainder(2, [1|[2,3]], [1|R]) :- val_and_remainder(2, [2,3], R).

% Hits base case
val_and_remainder(2, [2|[3]], [3]).

如果上面的运行是正确的,那么它如何获得正确的值R?如上例所示,R 的值应为R = [1,3].


在Prolog中,你需要考虑谓词 not as 功能就像您通常在其他语言中所做的那样。谓词描述关系,其中可能包括有助于定义该关系的参数。

例如,让我们看这个简单的例子:

same_term(X, X).

这是一个谓词定义两个参数之间的关系。通过统一也就是说,如果第一个和第二个参数是统一的,那么它们是相同的(这个定义取决于我们,谓词的作者)。因此,same_term(a, a)将会成功,same_term(a, b)将会失败,并且same_term(a, X)将会成功X = a.

您还可以以更明确的形式编写:

same_term(X, Y) :-
    X = Y.  % X and Y are the same if they are unified

现在让我们看看你的例子,val_and_remainder/3。首先,它是什么意思?

val_and_remainder(X, List, Rest)

这意味着X是一个元素List and Rest是一个由所有其余元素组成的列表(没有X)。 (注意:您没有立即解释这个含义,但我从您的示例的实现中确定了这个含义。)

现在我们可以写出描述规则了。首先,一个简单的基本情况:

val_and_remainder(X,[X|Xs],Xs).

这说的是:

Xs是列表的剩余部分[X|Xs]没有X.

根据 的定义,这个陈述应该是非常明显的[X|Xs]Prolog 中列表的语法。您需要所有这些参数,因为第三个参数Xs必须与列表的尾部(其余部分)统一[X|Xs],那么这也是Xs(根据定义,同名的变量是统一的)。和以前一样,您可以更详细地写出:

val_and_remainder(X, [H|T], R) :-
    X = H,
    R = T.

但其实简写形式更清晰。

现在递归子句说:

val_and_remainder(X, [Y|Ys], [Y|R]) :- 
    val_and_remainder(X, Ys, R).

所以这意味着:

[Y|R]是列表的剩余部分[Y|Ys]没有X if R是列表的剩余部分Ys没有元素X.

您需要考虑该规则以说服自己它在逻辑上是正确的。这Y第二个和第三个参数是相同的,因为它们引用相同的元素,所以它们必须统一。

因此,这两个谓词子句形成了涵盖这两种情况的两条规则。第一种情况是简单的情况,其中X是列表的第一个元素。第二种情况是递归定义whenX不是第一个元素。

当您进行查询时,例如val_and_remainder(2, [1,2,3], R).Prolog看看是否可以unify期限val_and_remainder(2, [1,2,3], R)与一个事实或一个谓词子句的头部。它试图与val_and_remainder(X,[X|Xs],Xs)因为它需要统一X with 2,这意味着需要统一[1,2,3] with [2|Xs]从第一个元素开始就失败了[1,2,3]是 1,但是第一个元素[2|Xs] is 2.

所以 Prolog 继续前进并成功统一val_and_remainder(2, [1,2,3], R) with val_and_remainder(X,[Y|Ys],[Y|R])通过统一X与 2,Y与 1,Ys with [2,3], and R with [Y|R](注意,这很重要,R您的调用中的变量与R谓词定义中的变量,所以我们应该命名它R1以避免这种混乱)。我们将为您命名R as R1并说R1统一于[Y|R].

当执行第二个子句的主体时,它调用val_and_remainder(X,Ys,R).或者,换句话说,val_and_remainder(2, [2,3], R)。现在这将与第一个子句统一并为您提供R = [3]。当你解开所有这些,你会发现,R1 = [Y|[3]],并回忆起Y绑定到 1,结果是R1 = [1,3].

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

了解 Prolog 列表 的相关文章

  • Python 中的密码子生成

    我有这段代码 用于将 DNA 字符串转换为密码子列表 然后将此列表转换为具有各自氨基酸的字符串 然而 当我运行代码并且 DNA 字符串以一对核苷酸 例如 CT 而不是三联体结尾时 代码不会生成氨基酸序列 正如您在输出中看到的 from co
  • 将非常大的Python列表输出保存到mysql表中

    我想将 python 生成的列表的输出保存在 mysql 数据库的表中 该表如下所示 mysql 中的 myapc8 表 https i stack imgur com 4B4Hz png这是Python代码 在此输入图像描述 https
  • Prolog 中的隔离列表

    我很难理解如何让我的代码显示由偶数和奇数组成的隔离列表 我什至不确定我的理解缺乏什么 显然我对这门语言很陌生 必须在学校使用它 我的命令式和功能性思维不会让我知道这到底是怎么回事 哈哈 现在 不 我不是要求你做我的作业 我只是请你帮我看看我
  • 识别 2D 列表是否包含 Dart/Flutter 中的列表

    如何在不使用嵌套 for 循环的情况下识别 2D 列表是否包含另一个列表 我正在寻找类似的方法in在Python中 我尝试使用list contains x 但它似乎没有识别列表 List a 1 2 1 1 2 2 List b 1 2
  • 将元组列表转换为字符串 Python

    例如 我用 python 编写了一个返回列表的函数 1 1 2 2 3 3 但我希望输出为字符串 这样我就可以用另一个字符替换逗号 这样输出就是 1 1 2 2 3 3 有什么简单的方法可以解决这个问题吗 感谢您提前提供任何提示 这看起来像
  • JasperReports:传入列表列表作为数据源

    我需要用不同对象的列表填充一些子报表 基本上可以说我有以下内容 二手车子报告新车子报告 我创建一个车辆 bean 类 其中变量作为字符串 并为其创建 getter 和 setter 方法 然后在我的数据源中我传入一个List
  • 错误列表索引必须是整数,而不是列表。获取一个数组的值,使用它们作为索引来删除另一个数组中的值

    seen dups collections defaultdict list for i item in enumerate prules for j orig in enumerate seen if item orig dups j a
  • 如何在Python中将字符串转换为包含一个元素的列表[重复]

    这个问题在这里已经有答案了 我有一个字符串 我想将其转换为其中只有一个元素的列表 a abc print list a output a b c Expected o p abc 正确的做法是什么 只需使用 a abc b a print
  • 采用迭代器而不是可迭代的方法[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 关于迭代器和可迭代对象 仅是我的观察 如果我错了 请纠正我 大多数构造函数 数组类型 将迭代器作为质量构造函数 迭代器是显式创建的 或
  • 将多列列表拆分为单独的行

    我有一个像这样的数据框 df pd DataFrame key 1 2 3 4 col1 apple orange pineapple guava orange apple col2 087 799 681 078 816 018 key
  • SwiftUI 从一个列表拖动到另一个列表

    我正在尝试在列表之间拖放 我尝试过的 我找到了一个在 UIKIt 中执行此操作并使用 UIViewControllerRepresentable 的解决方案 但这不是我想要的 另一个解决方案是在列表上使用 onDrag 但这在 iPad 上
  • 如何将整个列表分配给 pandas 数据帧的每一行

    我有一个数据框和一个列表 df pd DataFrame A 1 2 3 B 4 5 6 mylist 10 20 30 40 50 我希望有一个列表作为数据帧的每一行中的元素 如果我喜欢的话here https stackoverflow
  • 存储整数列表的最有效方法

    我最近一直在做一个项目 其中一个目标是使用尽可能少的内存来使用 Python 3 存储一系列文件 除了一个整数列表之外 几乎所有文件都占用很少的空间 大致333 000整数长且整数可达约8000在尺寸方面 我目前正在使用pickle存储列表
  • 将数字转换为英文字母列表

    我有下面的函数 它将数字输入转换为这些数字的部分翻译的单词输出 使用乘积和商 它将数字的单词表示相加 同时将数字分组 例如 number name 87969087 gt 87 million 969 thousand 87 number
  • 发布到列表 MVC3

    我试图让我的视图将列表发布回操作 但它始终为空 所以我的模型有一个 WeightEntry 对象列表 运动模型 public class Exercise public List
  • Python 中列表的线性合并

    我正在努力通过Google 的 Python 课堂练习 http code google com edu languages google python class index html 其中一个练习是这样的 给定两个按升序排序的列表 创建
  • 对 Python 列表元素进行分组

    我有一个 python 列表 如下所示 my list 25 1 0 65 25 3 0 63 25 2 0 62 50 3 0 65 50 2 0 63 50 1 0 62 我想根据以下规则对它们进行排序 1 gt 0 65 0 62 l
  • 为什么对本地列表求和比用“GHC -O2”对教会编码列表求和慢?

    为了测试教会编码的列表如何针对用户定义的列表和本机列表执行 我准备了 3 个基准测试 用户定义的列表 data List a Cons a List a Nil deriving Show lenumTil n go n Nil where
  • python 中分割字符串以获得一个值?

    需要帮助 假设我在名为 input 的变量中有一个字符串 Sam Person name kind input split 通过执行上述操作 我得到两个具有不同字符串 Sam 和 Person 的变量 有没有办法只获取第一个值 name S
  • 将一个列表的元素除以另一个列表的元素

    我有两个清单 比如说 a 10 20 30 40 50 60 b 30 70 110 正如你所看到的 列表 b 由一个列表的元素总和组成 其中 window 2 b 0 a 0 a 1 10 20 30 etc 如何获得另一个列表 该列表由

随机推荐

  • 如何在 Fortran 中即时增加数组大小?

    我的程序通过 3D 数组运行 标记它找到的 簇 然后进行一些检查以查看是否有任何相邻簇的标签高于当前簇 还有第二个数组保存 正确的 簇标签 如果它发现第 n 个相邻簇被正确标记 则将该元素分配给 0 否则将其分配给正确的标签 例如 如果第
  • 如何在 Retrofit 请求正文中 POST 原始整个 JSON?

    这个问题之前可能已经被问过 但没有得到明确的答案 到底如何在 Retrofit 请求的正文中发布原始的整个 JSON 查看类似问题here https stackoverflow com questions 19099536 post bo
  • 使用 SSH 远程运行 Shell 脚本块

    我尝试使用 shell 脚本在不同的服务器上执行命令块 谁能帮我解决这个问题吗 while RecordCount gt 0 do expXXXXX sed n RecordCount p GUID DLT EXPR FILE cut d
  • 如何在 PHP 中检查我是否处于静态上下文中?

    有什么方法可以检查方法是静态调用还是在实例化对象上调用 请尝试以下操作 class Foo function bar static isset this this instanceof self
  • 为什么127*2换成byte结果是-2?

    这是我的代码 public class test public static void main String args byte a byte 127 b 2 byte c byte a b System out println c 为什
  • 如何让div出现在另一个div的前面?

    请参考下面的代码 ul li style height 100px div style height 500px background color black div li ul 从上面的代码我们知道我们只能看到100px高度的黑色背景 我
  • 如何使用 URL 传递 PHP 变量

    我想使用 URL 传递一些 PHP 变量 我尝试了以下代码 链接 php pass php pre code code pre
  • 神经网络发散而不是收敛

    我已经实现了一个 2 层的神经网络 使用 CUDA 每层 2 个神经元 我试图让它使用反向传播学习 2 个简单的二次多项式函数 但它没有收敛 而是发散 输出变得无穷大 以下是有关我尝试过的更多详细信息 我已将初始权重设置为 0 但由于它是发
  • 嵌套Python列表推导式来构造列表列表

    我是一个Python新手 在摸索嵌套列表理解时遇到了麻烦 我正在尝试编写一些代码来读取文件并为每行的每个字符构建一个列表 所以如果文件包含 xxxcd cdcdjkhjasld asdasdxasda 结果列表将是 x x x c d c
  • Nhibernate 中多对多集合的更新导致连接表中的多个删除

    我有一个类 其中包含一个使用 Fluent Nhibernate 映射到多对多数据库关系的集合 映射如下 Table Book Id x gt x Id Map x gt x Title Map x gt x NumberOfPages H
  • JQuery 星级评定 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 任何人都可以建议一个易于设置的简单 JQuery 五星级评级脚本 我只需要单个页面上的单个实例 我不在乎它是否写入文件或 mysql 数据库来计算评分
  • 带 Angular 的鹅毛笔表,无法在编辑模式下工作

    我有一个 Angular 应用程序 我有一个表单并使用了 quill better table https www npmjs com package quill better table https www npmjs com packa
  • WinForms:在设计器中将自定义 ToolStripMenuItem 添加到 MenuStrip

    在 Windows 窗体中如果我创建一个继承自的自定义控件ToolStripMenuItem有没有办法添加这个CustomToolStripMenuItem to MenuStrip来自设计师还是我必须通过代码来完成 自从ToolStrip
  • Scipy 中使用 NaN 值进行 T 检验

    我在 scipy 中进行 t 检验时遇到问题 这让我慢慢发疯 它应该很容易解决 但我所做的一切都不起作用 并且通过广泛的搜索也找不到解决方案 我在最新的 Anaconda 发行版上使用 Spyder 具体来说 我想比较从 csv 文件导入的
  • 在 C 中的循环/IF 结构之外声明变量

    我是 C 语言新手 总体来说是编程新手 我想知道为什么当我在结构外部的 if 语句中声明要使用的变量时 我收到的输出不正确 无论如何对于这段代码 这是我的代码 include
  • 从 URL 下载图像并将其保存到内部存储器的最佳方法

    我正在开发一个应用程序 我想从 URL 下载图像 我需要立即下载这些图像并将其存储到内部存储器中 有超过200张图片可供下载 请告诉我在尽可能短的时间内下载这些图像的最佳方法 如果有任何第三方库可用 请告知 考虑使用毕加索来达到您的目的 我
  • C# 线程对象生命周期

    假设我有一段代码如下 int Main if true new Thread gt doSomeLengthyOperation Start while true do nothing 有 2 个线程 我将把正在执行 Main 函数的线程称
  • Docker 在构建镜像时无法删除文件

    我的 DockerFile 包含以下指令 rm f plugins 7z 此命令在早期版本的 docker 中按预期工作 但在版本 1 13 中失败 我看到错误 cannot access plugins 7z No such file o
  • ASP.NET MVC 区域内样式表中的相对路径

    我有一个当前结构的项目 My Project Content Controller View Model Areas Area1 View Controller Model Area2 View Controller Model 所有区域视
  • 了解 Prolog 列表

    我试图理解 Prolog 列表 以及如何在递归函数末尾 返回 实例化值 我正在看这个简单的例子 val and remainder X X Xs Xs val and remainder X Y Ys Y R val and remaind