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