如何在Prolog中实现特定的除法运算符?

时间:2013-03-26 18:49:13

标签: prolog

以下列方式实施除法运算符: A为12 div 6 div 2 结果为: A = 4

所以我认为我必须创建属于 yfx 类型的中缀运算符,因为此运算符首先计算6 div 2然后计算12 div结果(6 div 2)

我希望在我的解释中明确一点......我知道我已经以程序的方式解释了这个概念,但我不知道如何表达对参数执行的操作的优先级...... / p>

好的,所以我认为(我希望) yfx 形式的运算符是正确的......

问题是现在我不知道如何描述这个算子。

在上一个练习中,我以这种方式定义了运算符:

op(600,xfx,has).

/* perter has information */
has(peter, information).

我可以阅读Ivan Bratko的书:

  

运算符定义不指定任何操作或操作。 原则上,没有操作或数据与操作员相关联。

所以我认为我无法定义执行计算的运算符。

所以我认为我的练习的解决方案可能是这样的:

op(600,yfx,div).

div(X div Y, Division) :- Division is X/Y.

但是效果不好而且我认为这不是他们要求我实施的。

1 个答案:

答案 0 :(得分:2)

div似乎是一个预先声明的运算符,已经进行了整数除法,那么它就足以改变它的相关性。

这是默认值:

?- current_op(P,A,div).
P = 400,
A = yfx.

运行得

?-  A is 12 div 6 div 2.
A = 1.

随意改变:

?- [user].
|: :-op(400,xfy,div).
|: % user://1 compiled 0,04 sec, 1 clauses
true.

你会得到

?- A is 12 div 6 div 2.
A = 4.

请注意更改预定义的操作符 错误 练习。但我必须说,我不知道是否有任何标准方法可以将运算符添加到is / 2评估....

编辑 SWI-Prolog has a way添加算术:你得到

?- X is 12 mydiv 6 mydiv 2.
X = 4.

:- op(400,xfy,mydiv).
:- arithmetic_function(mydiv/2).
mydiv(A,B,C) :- C is A div B.