自定义 Prolog 算术函数

Posted

技术标签:

【中文标题】自定义 Prolog 算术函数【英文标题】:Custom Prolog arithmetic function 【发布时间】:2010-11-14 21:49:25 【问题描述】:

我正在寻找类似内置算术运算符的东西,它在 Prolog(特别是在 SWI-Prolog)中具有返回值。例如。如果你运行A is (1+2) + (3+2).,它会返回A = 8.

如何定义func 运算符来执行+ 运算符之类的操作? 例如。 A is (2 func 3) func (4 func (2+1))..

【问题讨论】:

【参考方案1】:

为了将您的函数func+ 运算符(以及许多其他运算符一起)内联,您需要为func 及其参数定义优先顺序。您可以在 SWI-PROLOG 中使用op/3 实现此目的。

例如指令(前面的代码使用func/2):

:- op(500,yfx,func).

要实现func/2,您可以为您的语言编写一个元解释器(即,您编写一个PROLOG程序来解析包括func在内的术语表达式并按照您的意愿解释它们),或者如果func/2是严格算术,你也可以使用arithmetic_function/1 作为指令,如下:

:- arithmetic_function(func/2).

使用func/2 的以下定义对此进行测试:

func(X, Y, Z) :- 
    Z is X + Y.

举个例子:

?- A is (2 func 3) func (4 func (2+1)).
A = 12.

【讨论】:

现在 SWI Prolog 的手册中说该指令已被弃用,如何更新解决方案?发送 不确定它为什么被弃用,如果你真的需要知道,最好询问Jan Wielemaker。我的理解是它仍然有效,即使它已被弃用......我错了吗?【参考方案2】:

在手册中,arithmetic_function/1 会将您的关系提升为is 可以理解的内容,请参阅

http://www.swi-prolog.org/pldoc/doc_forobject=section(2,'4.26',swi('/doc/Manual/extendarith.html'))

【讨论】:

以上是关于自定义 Prolog 算术函数的主要内容,如果未能解决你的问题,请参考以下文章

在 Prolog 中更快地实现口头算术

Prolog =:= 运算符

算术运算符是不是比算术函数更可取?

为什么要使用指针,指针定义, 指针的初始化访问,空指针和坏指针,指针的算术运算

算术和关系运算符

NumPy 算术函数