prolog - 如何在 Prolog 中定义新运算符?

标签 prolog operators

我正在尝试定义一个运算符 =>>检查它的一个操作数是否是另一个操作数的两倍。

我到目前为止尝试过:

:- 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/

相关文章:

c# - 好奇心 : why the shift operators have less priority than the additive?

python 3 : apply an operator over an iterable

c - 在 C99 中将运算符作为参数传递

c++ - PL_new_term_refs() : No foreign environment

prolog - 试图在序言中理解解析器 DCG

sorting - 如何修复这个排列排序?

c++ - 类模板继承 C++

c++ - 运算符方法是否占用 C++ 对象中的内存?

Prolog 初学者 - 这是一个坏主意吗?

prolog - 如何构建主列表中某个元素的位置列表?