自定义Prolog算术功能

far*_*zad 5 operators prolog user-defined-functions

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

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

sha*_*rky 6

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

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

:- op(500,yfx,func).
Run Code Online (Sandbox Code Playgroud)

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

:- arithmetic_function(func/2).
Run Code Online (Sandbox Code Playgroud)

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

func(X, Y, Z) :- 
    Z is X + Y.
Run Code Online (Sandbox Code Playgroud)

给你的例子:

?- A is (2 func 3) func (4 func (2+1)).
A = 12.
Run Code Online (Sandbox Code Playgroud)