我正在尝试定义一个运算符 =>>
检查它的一个操作数是否是另一个操作数的两倍。
我到目前为止尝试过:
:- op(200, xfy, =>>).
=>>(L, R) :- double(L, R); double(R, L).
double(L, R) :- L is R * 2.
但是当在 RPEL 中使用时,我得到了:
?- (-8) =>> (-4).
true ;
false.
%^^^^ note here
?- 7 =>> 3.
false.
?- 40 =>> 20.
true ;
false.
%^^^^ note here
?- 20 =>> 40.
true.
问题是什么?我该如何解决?
最佳答案
这是一个确定性问题:可能有进一步的解决方案((;)/2
可以读作“或”),因此 Prolog 回溯(并且找不到替代方案)。
有一个简单的方法可以解决这个问题:使用 once/1
promise 第一个解决方案,如果有的话:
L =>> R :- once((double(L, R) ; double(R, L))).
另请注意,您可能想使用 =:=/2
,不是 is/2
, 在这种情况下。更好的是,如果您正在处理整数,只需使用 CLP(FD) 约束,您的谓词将是确定性的,并且更加通用::- use_module(library(clpfd)).
L =>> R :- L #= R*2 #\/ R #= L*2.
例子:?- 40 =>> 20.
true.
?- 40 =>> X, X #< 80.
X = 20.
?- X =>> Y, X #= 2, Y #= 3.
false.
关于prolog - 如何在 Prolog 中定义新运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31870437/