Prolog 在列表中插入元素并返回更新后的相同列表

Prolog 在列表中插入元素并返回更新后的相同列表,prolog,Prolog,您好,我正在尝试在列表中插入一个元素,但从我的程序来看,结果存储在原始列表中而不是新列表中是非常重要的。 我在internet上编写或找到的任何代码只有在创建一个保留最终结果的新列表时才会成功。 所以我的问题是,有人能告诉我如何定义一个函数:插入(X,L),其中X是一个元素,L是一个列表吗?不,Prolog就是不能这样工作。没有“修改”值这样的事情。一个变量可以用一个特定的值来统一,但是如果它已经是[1,3],以后就不会是[1,2,3]。正如aschepler所说,您不能添加或更改一个适当的列表

您好,我正在尝试在列表中插入一个元素,但从我的程序来看,结果存储在原始列表中而不是新列表中是非常重要的。
我在internet上编写或找到的任何代码只有在创建一个保留最终结果的新列表时才会成功。

所以我的问题是,有人能告诉我如何定义一个函数:插入(X,L),其中X是一个元素,L是一个列表吗?

不,Prolog就是不能这样工作。没有“修改”值这样的事情。一个变量可以用一个特定的值来统一,但是如果它已经是
[1,3]
,以后就不会是
[1,2,3]

正如aschepler所说,您不能添加或更改一个适当的列表,即每个元素都已绑定在其中的列表。我们唯一能做的“修改”就是将一个表达式与另一个表达式统一起来

然而,有一个部分列表的概念,可以在末尾“添加”其他元素。这通常被称为差异列表,尽管这种命名法可能无法立即理解

假设我们不是从一个空列表开始,而是从一个自由变量X开始。然而,人们可能会想到从X中减去X得到“零”。也就是说,一个空的差分列表由X-X表示。这里的负“-”是一个纯粹的形式运算符;不打算对差异进行评估。这只是一个方便的语法,正如您从如何使用差异列表来完成您(可能)想要做的事情中所看到的

我们可以向差异列表添加一个元素,如下所示:

insertDL(M,X-Y,X-Z) :- Y = [M|Z].  
这里,M是我们要添加的新元素,X-Y是“旧”差异列表,X-Z是“新”差异(通过将先前的自由变量Y与部分列表[M | Z]统一,M已添加到其中,因此Z成为部分列表X的“开放”尾部)

当我们最终完成向差异列表中插入内容时,我们可以通过将该点的“自由尾”设置为空列表[],将X转换为适当的列表。从这个意义上讲,X与我们第一次开始时是“相同”的变量,只是通过从自由变量到适当列表的增量步骤来统一

在Prolog编程中,这是一种非常强大的技术,使用它需要一些练习。网上进一步讨论的一些链接:

[从序言列表到差异列表]

[在Prolog中实现差异列表]

[课堂讲稿:差异列表]

有些序言提供谓词,以便在适当的位置修改术语

为了在列表中使用它,您只需要考虑它们是一个很好的表示复合函数链的函数:<代码> > .' / 2


在任何情况下,当您需要在Prolog中使用时,这可能意味着您做错了什么。

如果您需要更新列表,那么您的想法太过迫切。你能更详细地描述一下你要解决的问题吗?