我编写了简单的代码来反转典型的整数列表:
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].
等。 感谢任何帮助,谢谢!
答案 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([_|_]).
容易!