Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 在prolog中使用累加器反转-错误_List_Prolog - Fatal编程技术网

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]
)@潜伏者:我完全忽略了那个细节。谢谢你的提示,我把它加入了我的答案中:-)