【问题标题】:power function in prologprolog中的幂函数
【发布时间】:2010-11-29 17:53:57
【问题描述】:

我的幂函数出了什么问题?

pow(_,0,1).   
pow(X,Y,Z) :-
    pow(X,Y-1,X*Z).

?- pow(2,3,Z).
ERROR: Out of global stack

【问题讨论】:

    标签: math prolog logic exponentiation


    【解决方案1】:

    你的 Y 没有递减,你不能使用像函数这样的谓词。您还必须将 Z 与乘法的结果统一。

    pow(_,0,1).
    
    pow(X,Y,Z) :- Y1 is Y - 1,
                  pow(X,Y1,Z1), Z is Z1*X.
    

    还有一个内置的幂函数会更快:

    pow2(X,Y,Z) :- Z is X**Y.
    

    还要注意 pow 不是最后一次调用,不能优化为只使用一个堆栈帧。您应该将其重新表述为:

    pow3(X,Y,Z) :- powend(X,Y,1,Z),!.
    
    powend(_,0,A,Z) :- Z is A.
    powend(X,Y,A,Z) :- Y1 is Y - 1, A1 is A*X, powend(X,Y1,A1,Z).
    

    【讨论】:

    • @ebo:您的定义 pow/3 和 pow3/3 不会终止!试试pow(1,0,0)。这应该会失败。
    • Z 参数不应绑定。这也是一个学术例子。并非所有边缘情况都被认为可以降低实现的复杂性。
    • 有点奇怪,但已修复。
    • 所有三个示例都在 SWI-Prolog 5.10.4 中终止。
    • @ebo:他们不适合pow3(1,0,0)
    【解决方案2】:
    Predicates
    fac(Integer,Integer,Integer).
    Clauses
    fac(X,N,X):- N=1,!.
    fac(X,N,M):- N1=N-1,fac(X,N1,M1), M= X*M1.
    Goal
    fac(5,3,X).
    

    【讨论】:

    • fac(5,3,1) 应该会失败,但它会循环。
    • 在我的情况下 fac(5,3,1) 返回 no,没有循环,我使用 Visual_Prolog_v52_pe。
    • 不可能。你必须有一个不同的程序。
    【解决方案3】:
    DOMAINS
    num=INTEGER
    
    PREDICATES
    nondeterm power(num,num,num)
    
    CLAUSES
    power(X,0,1).
    power(X,P,F):-X>0,P1=P-1,power(X,P1,F1),F=X*F1.
    
    GOAL
    power(2,5,X).
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-26
      • 2013-04-22
      • 2012-01-04
      • 1970-01-01
      • 1970-01-01
      • 2015-06-13
      相关资源
      最近更新 更多