Custom Prolog arithmetic function

2019-04-30 00:44发布

问题:

I'm looking for something like built-in arithmetic operators that has a return value in Prolog (specifically in SWI-Prolog). E.g. if you run A is (1+2) + (3+2)., it returns A = 8..

How can I define func operator to do something like + operator?
E.g. A is (2 func 3) func (4 func (2+1))..

回答1:

In order to situate your function func inline just as the + operator (along with many others), you'll need to define a precedence order for func and it's arguments. You can achieve this in SWI-PROLOG with op/3.

For example, the directive (preceding code where func/2 is used):

:- op(500,yfx,func).

To implement func/2, you can either write a meta-interpreter for your language (i.e., you write a PROLOG program which parses term expressions including func and interprets them as you wish), or if func/2 is strictly arithmetic, you can use arithmetic_function/1 also as a directive, as follows:

:- arithmetic_function(func/2).

Testing this with the following definition for func/2:

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

Gives, with your example:

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


回答2:

It is in the manual, arithmetic_function/1 will raise your relation into something which is can understand, see

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