2010-11-14 26 views
5

Estoy buscando algo así como operadores aritméticos incorporados que tiene un valor de retorno en Prolog (específicamente en SWI-Prolog). P.ej. si ejecuta A is (1+2) + (3+2)., devuelve A = 8..Función aritmética Prolog personalizada

¿Cómo puedo definir el operador func para hacer algo como + operador?
P. ej. A is (2 func 3) func (4 func (2+1))..

Respuesta

6

Para situar su función en línea func al igual que el operador + (junto con muchos otros), que necesita para definir un orden de precedencia para func y sus argumentos. Puede lograr esto en SWI-PROLOG con op/3.

Por ejemplo, la Directiva (código donde se utiliza func/2 anterior):

:- op(500,yfx,func). 

Implementar func/2, puede escribir un meta-intérprete de su idioma (es decir, se escribe un programa PROLOG que analiza expresiones plazo, incluyendo func y los interpreta como desee), o si func/2 es estrictamente aritmética, se puede utilizar también como arithmetic_function/1 directiva, de la siguiente manera:

:- arithmetic_function(func/2). 

Prueba esto con la siguiente definición para func/2:

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

da, con su ejemplo:

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

Ahora que en el manual de SWI Prolog dice que esta directiva está en desuso, ¿cómo sería una solución actualizada? Tx –

+0

Sin estar seguro de por qué estaba obsoleto, es mejor que pregunte [Jan Wielemaker] (https://github.com/JanWielemaker) si realmente necesita saberlo. Según tengo entendido, todavía funciona, aunque haya quedado obsoleto ... ¿me equivoco? – sharky

2

Es en el manual, arithmetic_function/1 va a aumentar su relación en algo, que is puede entender, ver

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