Prolog:反向列表(包括子列表)

时间:2014-03-20 02:23:22

标签: list prolog reverse

我编写了简单的代码来反转典型的整数列表:

reverse([], []).
reverse([X], [X]).
reverse([X|Y], A) :- reverse(Y, Z), append(Z, [X], A).

? reverse([1, 2, 3], X)
X = [3, 2, 1].

然而,我很遗憾,因为我是prolog的新手,如何撤销其中包含其他子列表的列表,例如:

? reverse([1, [2, 3], [1, [3, [2, 4, 5], 1], 2], 5], X).
X = [5, [2, [1, [5, 4, 2], 3], 1], [3, 2], 1].

等。 感谢任何帮助,谢谢!

3 个答案:

答案 0 :(得分:1)

您对代码的修改有效,但它很笨拙:

reverse([], []).
reverse([X|Y], A) :- reverse(Y, Z), reverse(X, Xrev), append(Z, [Xrev], A), !.
reverse(X, X). % not a list

BTW,不需要原始代码中的reverse([X], [X]).子句。

更新感谢@mbratch评论:

reverse([X|Y], A) :- reverse(Y, Z), reverse(X, Xrev), append(Z, [Xrev], A).
reverse(X, X) :- X \= [_|_]. % X is not a list, or X is an empty list

答案 1 :(得分:1)

定义可以非常紧凑:

deep_reverse(A, B) :- maplist(deep_reverse, A, R), !, reverse(R, B).
deep_reverse(A, A).

我已将其重命名为能够使用库谓词。一般来说,我认为最好避免重新定义库谓词。

答案 2 :(得分:1)

不使用任何内置插件,您可以执行以下操作:

reverse_nested_list( Xs, Rs ) :-
  reverse_nested_list( Xs, [], Rs )
  .

reverse_nested_list( []     , Rs , Rs ) .
reverse_nested_list( [X|Xs] , Ts , Rs ) :-
  is_list(X) ,
  !          ,
  reverse_nested_list(X,[],T) ,
  reverse_nested_list(Xs,[T|Ts],Rs)
  .
reverse_nested_list( [X|Xs] , Ts , Rs ) :-
  reverse_nested_list(Xs,[X|Ts],Rs)
  .

%
% cursory check for list-ness.
% 
is_list(X) :- var(X), !, fail.
is_list([]).
is_list([_|_]).

容易!