The*_*One 4 resolution prolog unification exponentiation
为什么这样做:
power(_,0,1) :- !.
power(X,Y,Z) :-
Y1 is Y - 1,
power(X,Y1,Z1),
Z is X * Z1.
Run Code Online (Sandbox Code Playgroud)
这给出了堆栈溢出异常?
power(_,0,1) :- !.
power(X,Y,Z) :-
power(X,Y - 1,Z1),
Z is X * Z1.
Run Code Online (Sandbox Code Playgroud)
因为算术运算仅通过is运算符对子句执行.在你的第一个例子中,Y1绑定到计算Y - 1的结果.在后面,系统试图证明子句幂(X,Y - 1,Z1),它与幂(X',Y', Z')绑定X'= X,Y'= Y - 1,Z'= Z.然后再次递归,因此对于无穷大,Y''= Y - 1 - 1等,从未实际执行计算.
Prolog主要只是术语的统一 - 在"常见"意义上,必须明确要求计算.