Пользовательская арифметическая функция Пролога - PullRequest
5 голосов
/ 15 ноября 2010

Я ищу что-то вроде встроенных арифметических операторов, которые имеют возвращаемое значение в Прологе (особенно в SWI-Прологе). Например. если вы запустите A is (1+2) + (3+2)., он вернет A = 8..

Как я могу определить оператор func, чтобы сделать что-то вроде оператора +?
Например. A is (2 func 3) func (4 func (2+1))..

Ответы [ 2 ]

6 голосов
/ 15 ноября 2010

Чтобы расположить вашу функцию 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.
2 голосов
/ 15 ноября 2010

Это в руководстве, arithmetic_function/1 поднимет ваше отношение к чему-то, что is может понять, см.

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