在prolog中使用累加器反转 - 错误

时间:2016-05-14 19:05:50

标签: list prolog

你能帮我解决一些错误吗?我不明白这个错误。

reverse(L, R) :- reverse(L, [], R).
reverse([], R, R).
reverse([Head|Tail], Acc, R) :- NewAcc is [Head|Acc], reverse(Tail, NewAcc, R).  

? - 反向[1,2,3],X)。

Type error: `[]' expected, found `[2|1]' (a compound) ("x" must hold one character)

1 个答案:

答案 0 :(得分:4)

您的谓词原则上有效,但您可能希望在递归目标中使用统一(=)/ 2而不是算术评估为/ 2:

reverse(L, R) :-
   reverse(L, [], R).

reverse([], R, R).
reverse([Head|Tail], Acc, R) :-
   NewAcc = [Head|Acc],             % <- here
   reverse(Tail, NewAcc, R).

通过这个小修改你的谓词起作用:

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

正如@lurker在评论中指出的那样,通过将[Head|Acc]合并到其递归目标中,您可以更紧凑地表达递归规则:

reverse([Head|Tail], Acc, R) :-
   reverse(Tail, [Head|Acc], R).

但是,您可能会考虑将DCG用于此任务,因为它们会产生更易读的代码:

reverse(L,R) :-
   phrase(invlist(L),R).

invlist([]) -->
   [].
invlist([H|T]) -->
   invlist(T),
   [H].

使用相应的查询:

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