Zik*_*Zik 21 list concatenation append prolog
如何在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).
Run Code Online (Sandbox Code Playgroud)
所以它Z通过删除[X|Y]in 的元素得到[X|W].但是我如何将两个列表附加在一起?
例,
appendlist([1,2],[3,4,5],X).
Run Code Online (Sandbox Code Playgroud)
结果将是X = [1,2,3,4,5].
我也不知道递归中发生了什么.(我跟踪但不明白)
编辑:我想知道的是它应该如何编码以像append()Prolog中的预定义一样运行.
Wil*_*ess 27
您发布的代码(几乎)可以.只需要交换子句的顺序(为了使这个谓词定义有效,当以生成方式使用时):
append( [], X, X). % your 2nd line
append( [X | Y], Z, [X | W]) :- append( Y, Z, W). % your first line
Run Code Online (Sandbox Code Playgroud)
这定义了三个参数之间的关系,比方说A,B和C.
你的第一行说," C是附加的结果A和B是否A和C非空列表,它们都具有相同的头部(即第一个元素),和尾的C是附加的尾巴的结果A与同第二个参数,B".
a a
----------
b b
c c
. d d
e e
. .
Run Code Online (Sandbox Code Playgroud)
或者从左到右:
a | b c .
| d e .
a | b c d e .
append( [],
Z,
Z ).
append( [X | Y ],
Z,
[X | W ] ) :- append(
Y, Z, W).
Run Code Online (Sandbox Code Playgroud)
想一想,这很有道理.它的作用是,我们想要定义append/3关系,我们知道我们想要它是什么,所以我们只写下我们希望它实现的一些明显的事实,如果你愿意,它必须遵循的法律.
因此,假设我们已经为我们定义了此代码,那么必须遵循哪些法律?显然,将一些列表的尾部附加到另一个列表会给我们一个结果,即在第二个列表中附加完整列表.
这定义了我们如何"滑动"第一个列表.但是,如果没有更多的东西可以滑动呢?如果我们到达该列表的末尾怎么办?然后我们到达了空列表,并添加一个带有另一个列表的空列表,将结果列表作为结果.明显.这就是你的代码中的第二行告诉我们的内容,它说"将另一个列表附加一个空列表会产生该列表作为结果".
令人惊讶的是,写下append/3必须遵循的这两条法则与写下定义本身是一样的.
另外:这从声明的角度解释了它; 请查看m09的答案,从操作的角度来看更多.
aio*_*obe 10
但是我如何将两个列表附加在一起?
你回答了自己的问题:你使用append/3.
如果你想追加X并Y存储结果Z,你可以
append(X, Y, Z)
Run Code Online (Sandbox Code Playgroud)
例如,如果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
| ?-
Run Code Online (Sandbox Code Playgroud)