我正在尝试学习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).