Пользовательская арифметическая функция Prolog

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

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


person farzad    schedule 14.11.2010    source источник


Ответы (2)


Чтобы расположить вашу функцию 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.
person Community    schedule 14.11.2010
comment
Теперь, когда в руководстве по SWI Prolog сказано, что эта директива устарела, каким может быть обновленное решение? Тх - person DrBeco; 06.05.2016
comment
Не знаете, почему это устарело, лучше всего спросить Яна Вилмейкера, если вам действительно нужно это знать. Насколько я понимаю, он все еще работает, хотя и устарел... я ошибаюсь? - person ; 07.05.2016

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

http://www.swi-prolog.org/pldoc/doc_forobject=section(2,'4.26',swi('/doc/Manual/extendarith.html'))
person I GIVE CRAP ANSWERS    schedule 14.11.2010