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

如何在Prolog中实现特定的除法运算符?,prolog,Prolog,以如下方式实现除法运算符:a为12除法6除法2结果为:a=4 因此,我认为我必须创建一个中缀操作符,属于类型:yfx,因为该操作符必须首先计算6 div 2,然后计算12 div结果(6 div 2) 我希望在我的解释中澄清…我知道我已经用程序的方式解释了这个概念,但我不知道如何表达对参数执行的操作的优先级 好的,所以我认为(我希望)yfx的形式是正确的 问题是现在我不知道如何描述这个操作符 在上一个练习中,我以这种方式定义了运算符: op(600,xfx,has). /* perter ha

以如下方式实现除法运算符:a为12除法6除法2结果为:a=4

因此,我认为我必须创建一个中缀操作符,属于类型:yfx,因为该操作符必须首先计算6 div 2,然后计算12 div结果(6 div 2)

我希望在我的解释中澄清…我知道我已经用程序的方式解释了这个概念,但我不知道如何表达对参数执行的操作的优先级

好的,所以我认为(我希望)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.

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

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以添加算术:您可以

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


嗯,不,我必须实现一个新的除法运算符…我把它称为div(我不知道它是一个预先声明的运算符),例如,我可以称它为:mydiv。我尝试过这个除法运算符,但不起作用:op(400,yfx,mydiv)。mydiv(X,Y,Z):-Z是X/Y。有什么想法吗?好的,现在我更清楚了,但我对操作符声明还有一些其他的小疑问。我已经尝试了您的示例,并且看到您在Prolog shell中声明了操作符,在这里启动了两个命令:--op(400,xfy,mydiv)。和:-算术函数(mydiv/2)。算术函数(mydiv/2)。我可以以某种方式将这些命令放入prolog源代码文件中吗?(因此,我不必每次打开Prolog shell时都声明它们。)最后一个问题是关于:-算术函数(mydiv/2)。这到底是什么意思?TnxYes,您可以使用
?-[user]。
输入源代码、自动加载或从控制台加载。关于算术函数,你不觉得这些文档很出色吗?关于意义,我想说还可以,它是有效的:)@capelical关于文档,它确实说
算术函数
不受欢迎。将欣赏具有
算术表达式\u值的工作示例。还是说不推荐使用的是
算术表达式\u值
?我不知道。
:- op(400,xfy,mydiv).
:- arithmetic_function(mydiv/2).
mydiv(A,B,C) :- C is A div B.