List 在prolog中使用累加器反转-错误
你能帮我解决一些错误吗?我不理解这个错误List 在prolog中使用累加器反转-错误,list,prolog,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) 您的谓词原则上是有效的,但您可能希望在递归目标中使用统一(=)/2而不是算术求值is/2: reverse(L, R) :- reverse(L,
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)
您的谓词原则上是有效的,但您可能希望在递归目标中使用统一(=)/2而不是算术求值is/2:
reverse(L, R) :-
reverse(L, [], R).
reverse([], R, R).
reverse([Head|Tail], Acc, R) :-
NewAcc = [Head|Acc], % <- here
reverse(Tail, NewAcc, R).
正如@Lougler在评论中指出的,通过将[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]
您的谓词原则上是有效的,但您可能希望在递归目标中使用统一(=)/2而不是算术求值is/2:
reverse(L, R) :-
reverse(L, [], R).
reverse([], R, R).
reverse([Head|Tail], Acc, R) :-
NewAcc = [Head|Acc], % <- here
reverse(Tail, NewAcc, R).
正如@Lougler在评论中指出的,通过将[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]
is/2
用于计算算术表达式[Head | Acc]
不是算术表达式。您还可以在对reverse
的递归调用中对NewAcc=[Head | Acc]
进行统一:reverse([Head | Tail],Acc,R):-reverse(Tail,[Head | Acc],R)。
is/2
用于计算算术表达式。这到底是什么意思?这意味着当你有X是时,
必须是一个可以计算的算术表达式,这也意味着
中的所有变量都必须绑定(有一个值)。例如,您可以使用它,比如X是(Y+7)/(2*log(Z))
,在这种情况下Y
和Z
必须有一个值,Prolog将计算表达式。如果X
也已经有一个值,则表达式如果为真将成功,如果为假将失败。许多初级Prolog程序员错误地将is/2
用作一般赋值运算符。Prolog本身没有“赋值”操作符。相反,如果我说X=(Y+7)/(2*log(Z))
,Prolog不会计算=/2
右侧的表达式。它只是将其保留为一个复合术语,内部看起来像,“/”(“+”(Y,7),“*”(2,log(Z))
。参见上一个问题,关于is/2
用于计算算术表达式[Head | Acc]
不是算术表达式。您还可以在对reverse
的递归调用中对NewAcc=[Head | Acc]
进行统一:reverse([Head | Tail],Acc,R):-reverse(Tail,[Head | Acc],R)。
is/2
用于计算算术表达式。这到底是什么意思?这意味着当你有X是时,
必须是一个可以计算的算术表达式,这也意味着
中的所有变量都必须绑定(有一个值)。例如,您可以使用它,比如X是(Y+7)/(2*log(Z))
,在这种情况下Y
和Z
必须有一个值,Prolog将计算表达式。如果X
也已经有一个值,则表达式如果为真将成功,如果为假将失败。许多初级Prolog程序员错误地将is/2
用作一般赋值运算符。Prolog本身没有“赋值”操作符。相反,如果我说X=(Y+7)/(2*log(Z))
,Prolog不会计算=/2
右侧的表达式。它只是将其保留为一个复合术语,内部看起来像,“/”(“+”(Y,7),“*”(2,log(Z))
。查看前面关于的问题,您可以使用反向(tail,[Head | Acc],R)
将NewAcc=[Head | Acc]
全部删除@潜伏者:我完全忽略了那个细节。谢谢你的提示,我把它包含在我的答案中:-),你可以用反向(tail,[Head | Acc],R)
来摆脱NewAcc=[Head | Acc]
)@潜伏者:我完全忽略了那个细节。谢谢你的提示,我把它加入了我的答案中:-)