List 如何在Prolog中附加列表?
如何在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和
[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
| ?-