-
19-09-2019 - |
题
为什么这工作:
power(_,0,1) :- !.
power(X,Y,Z) :-
Y1 is Y - 1,
power(X,Y1,Z1),
Z is X * Z1.
和这给堆栈溢出异常?
power(_,0,1) :- !.
power(X,Y,Z) :-
power(X,Y - 1,Z1),
Z is X * Z1.
解决方案
由于算术运算是在条款通过is
操作者只执行。在第一示例中,Y1被绑定到计算Y的结果 - 1.在以后,系统会尝试证明子句功率(X,Y1,Z1),其与动力结合(X“ Y”, Z ')结合X'= X,Y '= Y - 1,Z'= Z.这然后再次递归,所以Y ''= Y - 1 - 1等为无穷大,实际上从未执行计算
Prolog是主要的术语只是统一 - 计算,在“普通”的意义,必须要求明确。
其他提示
两种定义都不能正常工作。
考虑
?- pow(1, 1, 2).
,其循环用于两个定义,因为第二子句可以不管第二参数的应用。第一条中的切不能撤消。第二条需要递归目标之前一个目标Y > 0
。使用(is)/2
仍然是一个好主意,让实际的解决方案。
最好的(初学者)是开始<类=“标签后的” href =“/问题/标记/后继-算术”标题=“节目问题标记的后继-算术'”的rel =“标签“>接班人算术或 clpfd 并避免共序言切
参见例如: Prolog的谓词 - 无限循环
不隶属于 StackOverflow