为什么这工作:

   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 =“标签“>接班人算术或并避免

参见例如: Prolog的谓词 - 无限循环

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top