我在搜索,但我没有发现如何在prolog中反转不完整的列表。 这是我做的:
incomplete_reverse([L|T],Res):-nonvar(L),!,incomplete_reverse(T,Res1),
append(Res1,[L],Res).
incomplete_reverse(L,L):-var(L).
这只是反转列表,但我需要它是确定性的,反向列表也必须是一个不完整的列表。我怎么能这样做?
答案 0 :(得分:1)
我的第一个建议是,您熟悉差异列表及其应用程序(如果尚未熟悉的话)。简而言之,差异列表是一个打开的列表,您可以在其中跟踪开放端。例如,空列表可以由Tail-Tail
表示。具有三个元素的列表(例如,原子a
,b
和c
可以表示为[a,b,c| Tail]-Tail
。这允许例如O(1)附加两个列表并在列表末尾添加一个元素。
但回到你的问题,这里有一些代码供你玩:
reverse_open_list([Element| Rest], Stack, [Element| Stack]) :-
var(Rest),
!.
reverse_open_list([Element| Rest], Stack, Reverse) :-
reverse_open_list(Rest, [Element| Stack], Reverse).
示例查询:
?- reverse_open_list([a,b,c|_], Tail, Reverse).
Reverse = [c, b, a| Tail].
由于还会返回打开的尾部,您可以轻松地从反向列表转到差异列表。