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

问题描述:

嗨,我试图插入一个列表中的元素,但它是非常重要的从我的程序,结果存储在原始列表中,而不是在一个新的。
如果您创建了一个保存最终结果的新列表,那么我在互联网上编写或发现的任何代码都会成功。
所以我的问题是谁能告诉我如何定义一个函数:insert(X,L)其中X是一个元素,L是一个列表?插入列表中的元素并返回相同的列表更新

+0

如果您需要更新该列表,那么您试图想的太过于迫切。你能更详细地描述你想解决的问题吗? – Juliet 2011-01-10 00:23:37

不,Prolog只是不这样工作。没有“修改”一个值的东西。一个变量可以与一个特定值统一,但是如果它已经是[1,3],那么以后它将永远不会是[1,2,3]

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

但是有一个部分列表的概念,可以在最后将“附加”元素添加到其中。这通常被称为差异列表,尽管该术语可能无法立即被理解。

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

我们可以用下面的元素添加到差异列表:

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

这里M为我们要添加新的元素,XY是“旧”的区别列表,XZ是“新”通过将先前*变量Y与部分列表[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

某些prologs提供了setarg/3谓词以修改地方。

为了使用它在列表中,你只需要考虑它们与仿'.'/2

复合项链在任何情况下的一个不错的表现,当你需要在序言使用setarg/3,它可能意味着你做错了什么。