在prolog中反转一个不完整的列表

时间:2015-11-24 18:57:17

标签: prolog

我在搜索,但我没有发现如何在prolog中反转不完整的列表。 这是我做的:

incomplete_reverse([L|T],Res):-nonvar(L),!,incomplete_reverse(T,Res1),
                           append(Res1,[L],Res).
incomplete_reverse(L,L):-var(L).

这只是反转列表,但我需要它是确定性的,反向列表也必须是一个不完整的列表。我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

我的第一个建议是,您熟悉差异列表及其应用程序(如果尚未熟悉的话)。简而言之,差异列表是一个打开的列表,您可以在其中跟踪开放端。例如,空列表可以由Tail-Tail表示。具有三个元素的列表(例如,原子abc可以表示为[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].

由于还会返回打开的尾部,您可以轻松地从反向列表转到差异列表。