是否可以仅使用两个参数来反转列表?

Cam*_*mel 3 list prolog

是否有可能只用两个参数来反转Prolog中的列表?如:

reverse_list(List, Reversed).
Run Code Online (Sandbox Code Playgroud)

这不是家庭作业,我在七周阅读七种编程语言,我很好奇.

使用三个参数可以使用累加器(很像函数式编程):

reverseList([], Accumulator, Accumulator).
reverseList([Head|Tail], Accumulator, Solution) :-
  reverseList(Tail, [Head|Accumulator], Solution).
reverseList(List, Solution) :-
  reverseList(List, [], Solution).
Run Code Online (Sandbox Code Playgroud)

澄清:我看到了一个附加的解决方案,我想知道你是否可以在没有其他prolog功能的情况下做到这一点

Tha*_*dis 5

当然:

reverseList([[], Accumulator, Accumulator]).
reverseList([[Head|Tail], Accumulator, Solution]) :-
  reverseList([Tail, [Head|Accumulator], Solution]).
reverseList([List, Solution]) :-
  reverseList([List, [], Solution]).
Run Code Online (Sandbox Code Playgroud)

编辑:实际上只有一个:b

非作弊方法:

reverse([],[]).
reverse([H|T],L):-
    reverse(T,R),
    append(R,[H],L).
Run Code Online (Sandbox Code Playgroud)

问题是性能会非常糟糕:你将在列表中进行递归,对于每个元素,你将做一个追加/ 3.使用时间/ 1和1,000,000个元素的随机列表:

accumulator:    % 2,000,003 inferences, 0.652 CPU in 0.652 seconds (100% CPU, 3066292 Lips)
arity-2         % 1,000,003 inferences, 0.178 CPU in 0.178 seconds (100% CPU, 5602426 Lips)
Run Code Online (Sandbox Code Playgroud)