最高整数公因子测试错误

时间:2014-05-22 13:44:22

标签: prolog greatest-common-divisor

如果整数bar/3false没有A作为最高公因子,我希望以下B谓词打印C打印true,但截至目前,如果C不是HCF,则会发出错误。 我不知道如何解决这个问题。

foo(P,Q,R):-L is P/Q,R is P-Q*floor(L).
bar(A,0,A).
bar(A,B,C):-foo(A,B,X),bar(B,X,C).

例如,如果出现错误,我正在

?- bar(27,30,1).
ERROR: //2: Arithmetic: evaluation error: `zero_divisor'

而不是

?- bar(27,30,1).
false

成功后我得到了我想要的正确结果

?- bar(27,30,3).
true

1 个答案:

答案 0 :(得分:1)

首先缺少一个切口。你想要第一个条款 对于= 0执行bar / 3,对bar / 3执行第二个子句 执行<> 0。这可以通过剪切来完成:

foo(P,Q,R):-L is P/Q,R is P-Q*floor(L).
bar(A,0,A) :- !.
bar(A,B,C):-foo(A,B,X),bar(B,X,C).

但是,如果第三个参数,切割不能正常工作 受约束。因为第一个子句可能因为失败而失败 第一个参数和第三个参数的统一失败, 而不是因为<> 0。

所以你需要第二次重写才能使谓词坚定不移 在最后一个论点中:

foo(P,Q,R):-L is P/Q,R is P-Q*floor(L).
bar(A,0,B) :- !, B=A.
bar(A,B,C):-foo(A,B,X),bar(B,X,C).

现在一切正常,如下例所示 所示:

 Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 7.1.22)
 Copyright (c) 1990-2014 University of Amsterdam, VU Amsterdam
 ?- bar(27,30,1).
 false.

 ?- bar(27,30,3).
 true.

再见

BTW:您可以扩展谓词的工作范围 非常,不是使用花车,而是普通的 整数,适用于大多数现代Prolog系统 一个固定的界限。

然后使用更合适的代码如下所示 谓词名称:

gcd(X, 0, Y) :- !, Y = X.
gcd(X, Y, Z) :-
   H is X rem Y,
   gcd(Y, H, Z).