我正在阅读关于两个列表连接的序言代码。 它运作良好,但我无法理解它是如何工作的:
concatenation([ ], Lista, Lista).
concatenation([ Elem | Lista1], Lista2, [Elem | Lista3]):-
concatenation(Lista1, Lista2, Lista3).
?-concatenation([one, two], [three, four],L).
**Result : [one,two,three,four]**
首先,我无法理解我们的目标部分
**concatena([ Elem | Lista1], Lista2, [Elem | Lista3])**
我真的无法理解为什么不是放一个普通变量然后处理"右边的其他计算: - ",它开始在目标部分得到头部和尾部!
第二个问题是这个递归如何在每次迭代中给出每个列表的下一个元素?
所以我的问题是这个算法如何逐步运作。 感谢
答案 0 :(得分:1)
我发现从右到左阅读Prolog很有帮助(无论如何,我想我的母语都是自然而然的,我猜)。
所以第一部分说:
concatenation([ ], Lista, Lista).
或:无论什么(右侧是空的),您始终可以将空列表连接到某个列表以获取相同的列表。
现在第二部分说,从右边开始,
concatenation(Lista1, Lista2, Lista3)
意味着您可以将Lista1
连接到Lista2
,获取Lista3
。
然后整个第二部分说
concatenation([ Elem | Lista1], Lista2, [Elem | Lista3]):-
concatenation(Lista1, Lista2, Lista3).
含义:如果您可以将Lista1
连接到Lista2
,获取Lista3
,那么您可以将Lista1
前面的Elem
连接到Lista2
,获得Lista3
前面的Elem
。