所以我想尝试将方法改为我的上一个问题(因为我真的不知道如何用它来表达)。假设我想在反向列表之前添加一个元素
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中找不到这样做的方法。
答案 0 :(得分:1)
在倒转列表之前添加元素:
:- NewList = [NewElement|OldList], rev(NewList,NewReversedList).
您的add_tail
功能可以将项目添加到最后。那就是这样的:
:- reverse(ListIn,ReversedList),reverse([NewElement|ReversedList],Result).
这是两倍的成本,但在O符号中并不重要。
除了不使用列表(如果你有固定长度实际上是可行的 - 使用仿函数)或者使用更智能的数据结构(堆),你不能在PROLOG中放弃有O(N)操作的列表,哈希表等)。我不会流汗。这是PROLOG。列表是它如何做的事情。