2012-04-08 37 views
0

好吧,我知道这确实是一个愚蠢的问题,但我无法得到它。 有一个任务,我应该找到一个递归算法 Euclid(gcd)。我已经做了一个案例,在这里:欧几里德递归算法

nondeterm nod (integer,integer,integer) 
CLAUSES 
nod (X,0,X):- !. 
nod (0,X,X):- !. 
nod (X,0,X):-X>0. 
nod (X,Y,G):-Y>0, Z = X mod Y, nod (Y,Z,G). 

我需要做的另一种情况下,如果递归从х0,beginnig时习则函数计数曦+ 1调用。 它应该是这样的:

PREDICATES 
nondeterm nod (integer,integer,integer) 
nondeterm nod1 (integer,integer,integer,integer,integer)  
CLAUSES 
nod(X,Y,Z):- nod1(X,Y,Z,0,0). 
nod1 (X,Y,Z,X,Y):- Otvet = Z, write("Otvet=", Otvet, "\n"), !. 
nod1 (X,Y,X,Y):- nod1 (X,Y,X,Y). 
nod1 (X,Y,Z,X1,Y1):- 
       X1>Y1, X>0, Y>0, 
       Y2 = X1 mod Y1, 
       X2 = Y1, 
       nod1(X,Y,Z,X2,Y2). 

但它不起作用。请帮助我。

+0

为什么不和?似乎对我来说是确定性的 – CapelliC 2012-04-08 08:13:45

+0

对不起,我不明白你的问题。 'Xi + 1'在哪里? 在你的第一个代码框中,'nod(X,0,X): - !。'与'nod(X,0,X)冲突: - X> 0。第二个将永远不会被调用。这个规则是无用的'nod1(X,Y,X,Y): - nod1(X,Y,X,Y).'并且如果调用则会循环。 – CapelliC 2012-04-08 08:26:55

+0

好吧......我想因为我需要找到点头的结果。我错了吗? – eeeee 2012-04-08 08:44:54

回答

0

以下代码适用于我。请注意,使用 REM的,但我猜你也可以使用MOD:

% sys_gcd(+Integer, +Integer, -Integer) 
sys_gcd(X, 0, X) :- !. 
sys_gcd(X, Y, Z) :- 
    H is X rem Y, 
    sys_gcd(Y, H, Z). 

这里有一些例子与SWI-Prolog的运行:

?- sys_gcd(20,30,X). 
X = 10. 
?- sys_gcd(-20,30,X). 
X = 10. 
?- sys_gcd(20,-30,X). 
X = -10. 
?- sys_gcd(-20,-30,X). 
X = -10. 

如果你想要的结果的一个特殊标志,你需要围绕它的附加代码 。

再见