如果整数bar/3
和false
没有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
答案 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).