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

时间:2011-01-10 00:12:06

标签: prolog

您好我正在尝试在列表中插入一个元素,但是从我的程序中将结果存储在原始列表而不是新列表中非常重要。
如果您创建一个保留最终结果的新列表,我在互联网上编写或找到的任何代码都会成功 所以我的问题是谁能告诉我如何定义一个函数:insert(X,L)其中X是一个元素而L是一个列表?

3 个答案:

答案 0 :(得分:3)

不,Prolog就是那样不行。没有“修改”值这样的东西。变量可以与特定值统一,但如果它已经是[1,3],则以后不会[1,2,3]

答案 1 :(得分:2)

aschepler说,你不能对正确的列表添加或进行任何更改,即每个元素已经绑定的列表。我们唯一可以做的“修改”是将一个表达式与另一个表达式统一起来。

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

假设我们开始,不是使用空列表,而是使用自由变量X.但是,人们可能会想到从X中减去X并获得“无”。也就是说,空差异列表由X-X表示。这里的减号“ - ”是纯正式的运算符;没有评估差异的意图。这是一个方便的语法,你可以看到差异列表如何用于完成你(可能)想要做的事情。

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

insertDL(M,X-Y,X-Z) :- Y = [M|Z].  

这里M是我们想要添加的新元素,XY是“旧”差异列表,XZ是“新”差异(通过将先前的自由变量Y与部分列表统一起来添加了M [M | Z],使Z成为部分列表X的“开放”尾部。

当我们最终将事物插入到差异列表中时,我们可以通过将此处的“自由尾部”设置为空列表[]来将X转换为正确的列表。从这个意义上讲,X是与我们刚开始时的“相同”变量,只是通过从自由变量到正确列表的增量步骤统一。

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

[从Prolog列表到差异列表]
http://www.irisa.fr/prive/ridoux/ICLP91/node8.html

[在Prolog中实施差异列表]
http://www.cl.cam.ac.uk/~jpw48/difflists.pdf

[讲义:差异列表]
http://www.cs.cmu.edu/~fp/courses/lp/lectures/11-diff.pdf

答案 2 :(得分:1)

有些prolog提供了setarg/3谓词,以便修改相应的术语。

为了在列表上使用它,你只需要考虑它们只是一个很好的代表复合词的链与仿函数'.'/2

无论如何,当你需要在Prolog中使用setarg/3时,这可能意味着你做错了什么。