如何首先将一个元素插入列表,然后递归插入所有元素

时间:2016-04-11 14:30:15

标签: prolog

所以我想尝试将方法改为我的上一个问题(因为我真的不知道如何用它来表达)。假设我想在反向列表之前添加一个元素

rev(L, R) :- rev(L, [], R).
rev([], R, R).
rev([H|T], C, R) :- rev(T, [H|C], R).

所以在我调用rev / 3之前,我想手动添加一个元素(我从另一个操作中获取,例如,规则/ 4。所以我希望新列表首先从规则中获取新元素,然后列表的其余部分,我用第二个元素作为累加器。这在其他语言中非常简单,但是,它是如何在Prolog中完成的?

除此之外,如果可能的话。我如何获得最后一个元素,然后在最后添加它?因为到目前为止,我得到的最接近的是逐个元素到列表的末尾,获取元素,然后执行以下操作:

add_tail([],X,[X]).
add_tail([H|T],X,[H|L]):-add_tail(T,X,L).

在任何其他语言中,我知道这将是有益的,有点愚蠢。你去最后一个元素,得到它,最后添加它。如果没有多次遍历整个列表,我在prolog中找不到这样做的方法。

1 个答案:

答案 0 :(得分:1)

在倒转列表之前添加元素:

:- NewList = [NewElement|OldList], rev(NewList,NewReversedList).

您的add_tail功能可以将项目添加到最后。那就是这样的:

:- reverse(ListIn,ReversedList),reverse([NewElement|ReversedList],Result).

这是两倍的成本,但在O符号中并不重要。

除了不使用列表(如果你有固定长度实际上是可行的 - 使用仿函数)或者使用更智能的数据结构(堆),你不能在PROLOG中放弃有O(N)操作的列表,哈希表等)。我不会流汗。这是PROLOG。列表是它如何做的事情。