【问题标题】:Highest integers common factor testing error最大整数公因数检验误差
【发布时间】:2014-05-22 13:44:21
【问题描述】:

如果整数AB 没有C 作为最高公因数,我希望使用以下bar/3 谓词打印false,否则它应该打印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

【问题讨论】:

  • 如果您正在使用整数及其因数,为什么要使用浮点数?
  • 你的L is P/Q, R is P - Q*floor(L)可以写成R is P - (P // Q)
  • 执行 trace 以查看您在调用 foo/3 时允许在哪里使用零 (0) 参数 Q
  • @lurker: 对于P = -2, Q = 3`,你产生-2而不是1。使用div。或者更简单:mod.
  • 啊,是的,非常感谢@false。很好的收获。

标签: prolog greatest-common-divisor


【解决方案1】:

首先缺少一个剪辑。你想要第一个子句 bar/3 的执行为 =0,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).

但是如果第三个参数,cut 不能正常工作 是绑定的。由于第一个子句可能会失败,因为 第一个参数和第三个参数的统一失败, 而不是因为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.

再见

顺便说一句:您可以扩展谓词的工作范围 极大地,不使用浮点数,而是使用普通的 整数,适用于大多数现代 Prolog 系统,没有 一个固定的界限。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 2010-12-14
    相关资源
    最近更新 更多