List 如何在Prolog中附加列表?

List 如何在Prolog中附加列表?,list,prolog,append,concatenation,List,Prolog,Append,Concatenation,如何在Prolog中附加列表?我在网上搜索了一下,发现了这个(从) 因此,它通过删除[X | W]中[X | Y]的元素来获得Z。但是如何将两个列表附加在一起呢 例如 appendlist([1,2],[3,4,5],X). 结果将是X=[1,2,3,4,5] 我也不知道递归中发生了什么。(我查了一下,但不明白) EDIT:我想知道的是,它应该如何编码,使其像Prolog中预定义的append()那样工作 但如何将两个列表附加在一起? 您回答了自己的问题:您使用append/3 如果要附加X和

如何在Prolog中附加列表?我在网上搜索了一下,发现了这个(从)

因此,它通过删除
[X | W]
[X | Y]
的元素来获得
Z
。但是如何将两个列表附加在一起呢

例如

appendlist([1,2],[3,4,5],X).
结果将是
X=[1,2,3,4,5]

我也不知道递归中发生了什么。(我查了一下,但不明白)

EDIT:我想知道的是,它应该如何编码,使其像Prolog中预定义的
append()
那样工作

但如何将两个列表附加在一起?

您回答了自己的问题:您使用
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
| ?- 

您发布的代码(几乎)正常。子句的顺序只需要交换(为了使这个谓词定义在以生成方式使用时产生效果):

append([],X,X)。%(*您的第二行*)
附加([X | Y],Z[X | W]):-附加(Y,Z,W)。%(*你的第一行*)
这定义了三个参数之间的关系,比如
a
B
C

你的第一行说,“
C
是附加
A
B
的结果,如果
A
C
是非空列表,它们都有相同的头(即第一个元素),
C
的尾是附加
A
的尾和相同的第二个参数
B
”的结果

a
----------
b b
丙
.    d
e e
.   .
或从左到右:

a | b c。
|d.e。
a | b c d e。
追加([],
Z
Z)。
追加([X | Y],
Z
[X | W]):-附加(
Y、 Z,W)。
想想看,这很有道理。它所做的是,我们想要定义
append/3
关系,我们知道我们想要它是什么,所以我们只需要写下一些明显的事实,我们想要它实现,它必须遵循的法律,如果你愿意的话

那么假设我们已经为我们定义了这个代码,它必须遵循什么法律呢?显然,将某个列表的尾部附加到另一个列表中,可以得到将完整列表附加到第二个列表的结果的尾部

这定义了我们如何“滑动”第一个列表。但是如果没有地方可以滑倒呢?如果我们已经到了列表的末尾呢?然后我们得到了一个空列表,并将一个空列表与另一个列表相加,得到该列表作为结果。明显地这就是你代码中的第二行告诉我们的,它说,“用另一个列表附加一个空列表会产生这个列表作为结果”

令人惊讶的是,写下
append/3
必须遵循的这两条定律,与写下定义本身是一样的


另外:这从声明的角度解释了它;请从操作的角度查看哪个更能显示它。

哦,我的意思是,我该如何编写类似于序言的append()的代码呢?您可以用同样的方式编写它。
append
的代码!?您已经发现了实现(这是问题中的前两行代码)。
| ?- append([1,2],[3,4,5], X).

X = [1,2,3,4,5]

yes
| ?-