序言统一解决方案

时间:2009-10-03 20:37:36

标签: prolog resolution exponentiation unification

为什么这样做:

   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.

2 个答案:

答案 0 :(得分:7)

因为算术运算仅通过is运算符对子句执行。在你的第一个例子中,Y1绑定到计算Y - 1的结果。在后面,系统试图证明子句幂(X,Y - 1,Z1),它与幂(X',Y', Z')绑定X'= X,Y'= Y - 1,Z'= Z.然后再次递归,因此对于无穷大,Y''= Y - 1 - 1等,从未实际执行计算。

Prolog主要只是术语的统一 - 计算,在“常见”意义上,必须明确要求。

答案 1 :(得分:1)

这两个定义都无法正常运作。

考虑

?- pow(1, 1, 2).

为两个定义循环,因为无论第二个参数如何,都可以应用第二个子句。第一个子句中的剪切无法撤消此操作。第二个子句在递归目标之前需要一个目标Y > 0。使用(is)/2仍然是获得实际解决方案的好主意。

最好的(对于初学者)是从开始,并完全避免

参见例如:Prolog predicate - infinite loop