如何在Prolog中添加列表?我在互联网上搜索过,我发现了这个(来自http://www.csupomona.edu/~jrfisher/www/prolog_tutorial/2_7.html)
append([X|Y],Z,[X|W]) :- append(Y,Z,W).
append([],X,X).
通过移除Z
中[X|Y]
的元素,它获得了[X|W]
。但是我如何将两个列表附加在一起?
实施例,
appendlist([1,2],[3,4,5],X).
结果为X = [1,2,3,4,5]
。
此外,我不知道递归中发生了什么。 (我跟踪但不明白)
编辑:我想知道的是如何将其编码为与Prolog中预定义的append()
一样的功能。
答案 0 :(得分:27)
您发布的代码(几乎)正常。只需要交换子句的顺序(为了使这个谓词定义有效,当以生成方式使用时):
append( [], X, X). % your 2nd line
append( [X | Y], Z, [X | W]) :- append( Y, Z, W). % your first line
这定义了三个参数之间的关系,比如A
,B
和C
。
您的第一行说,如果C
和A
是非空列表,“B
是附加A
和C
的结果,它们都有相同的头(即第一个元素),而C
的尾是附加A
的尾部的结果相同的第二个参数B
“。
a a
----------
b b
c c
. d d
e e
. .
或者从左到右:
a | b c .
| d e .
a | b c d e .
append( [],
Z,
Z ).
append( [X | Y ],
Z,
[X | W ] ) :- append(
Y, Z, W).
想一想,这很有道理。它的作用是,我们想要定义append/3
关系,我们知道我们想要它是什么,所以我们只写下我们希望它实现的一些明显的事实,它必须遵循的法律如果你愿意的话。
假设我们已经为我们定义了这个代码,那么它必须遵循哪些法律?显然,将一些列表的尾部附加到另一个列表会给我们一个结果,即在第二个列表中附加完整列表。
这定义了我们如何“滑动”第一个列表。但是,如果没有更多的东西可以滑动呢?如果我们到达该列表的末尾怎么办?然后我们到达了空列表,并添加一个带有另一个列表的空列表,将结果列表作为结果。明显。这就是代码中的第二行告诉我们的内容,它说,“附加空列表与另一个列表生成该列表作为结果”。
令人惊讶的是,写下append/3
必须遵循的这两条法则与写下定义本身是一样的。
补充:这从声明的角度解释了它;查看an answer by m09,从操作的角度来看更多。
答案 1 :(得分:10)
但如何将两个列表附加在一起?
您回答了自己的问题:您使用append/3
。
如果您要追加X
和Y
并将结果存储在Z
,则可以
append(X, Y, Z)
如果例如X = [1, 2]
和Y = [3, 4, 5]
,那么Z
将绑定到[1, 2, 3, 4, 5]
:
| ?- append([1,2],[3,4,5], X).
X = [1,2,3,4,5]
yes
| ?-