prolog统一解析

prolog统一解析,prolog,resolution,exponentiation,unification,successor-arithmetics,clpfd,prolog-cut,Prolog,Resolution,Exponentiation,Unification,Successor Arithmetics,Clpfd,Prolog Cut,为什么这样做有效: 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的结果绑定。在后面的例子中,系统试图

为什么这样做有效:

   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的结果绑定。在后面的例子中,系统试图证明power(X,Y-1,Z1)子句,它与power(X',Y',Z')绑定X'=X,Y'=Y-1,Z'=Z相结合。然后再次递归,因此Y'=Y-1-1,以此类推,直到无穷远,才真正执行计算


Prolog主要是术语的统一——在“普通”意义上,必须明确要求计算

这两种定义都不能正常工作

考虑

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

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


参见示例:

Y-Y'-Y'-Y'-Y'-Y'-1最终等于零,落入基本情况并终止递归?不,在Prolog
Y-1
中,当
Y=1
仍然是
Y-1
时,它没有被绑定:)实际上-它只是一种语法形式。中缀符号就是那个-符号。它相当于-(Y,-(Y',-(Y',,Y'))。它将永远扩展,直到你把一些语义和-。这就是“-”的作用。愚蠢的软件。我添加了一个丢失的更正——“这就是‘是’的作用”