在Prolog中使用Euclid的算法计算GCD

时间:2019-05-31 16:09:37

标签: prolog greatest-common-divisor

我正在尝试学习Prolog,我想制作一个使用Euclid算法进行评估的GCD函数。这是我到目前为止的内容:

gcd(X, 0, X) :- !.
gcd(0, Y, Y) :- !.
gcd(X, Y, Z) :- X > Y, !, X1 is X mod Y, gcd(X1, Y, Z).
gcd(X, Y, Z) :- X =< Y, X1 is Y mod X, gcd(X1, X, Z).

它可用于识别以下内容:

gcd(8,2,2). --> true
gcd(2,8,2). --> true

但是这些应该输出false而是抛出错误:

gcd(8,3,2).
gcd(3,8,2).

错误:

ERROR: Arithmetic: evaluation error: `zero_divisor'
ERROR: In:
ERROR:   [10] _5542 is 4 mod 0
ERROR:    [9] gcd(0,4,2) at /home/kopio/Desktop/Aral/Prolog/prologme.pl:5
ERROR:    [7] <user>
ERROR:
ERROR: Note: some frames are missing due to last-call optimization.
ERROR: Re-run your program in debug mode (:- debug.) to get more detail.

此外,我不能使用变量运行它:

gcd(8,X,2). 

我收到此错误:

ERROR: Arguments are not sufficiently instantiated
ERROR: In:
ERROR:    [9] 8>_5726
ERROR:    [8] gcd(8,_5752,2) at /home/zula/prologme.pl:5
ERROR:    [7] <user>

解决方案:

:- use_module(library(clpfd)).
gcd(X, 0, X) :- !.
gcd(0, Y, Y) :- !.
gcd(X, Y, Z) :- X > Y, !, X1 #= X mod Y, gcd(X1, Y, Z).
gcd(X, Y, Z) :- X =< Y, X1 #= Y mod X, gcd(X1, X, Z).

0 个答案:

没有答案