你能帮我解决一些错误吗?我不明白这个错误。
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)
答案 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]