2010-11-14 15 views
5

Sto cercando qualcosa come operatori aritmetici incorporati con valore di ritorno in Prolog (in particolare in SWI-Prolog). Per esempio. se si esegue A is (1+2) + (3+2)., restituisce A = 8..Funzione aritmetica personalizzata Prolog

Come è possibile definire l'operatore func come un operatore +?
E.g. A is (2 func 3) func (4 func (2+1))..

risposta

6

Al fine di inquadrare la funzione func linea proprio come l'operatore + (insieme a molti altri), sarà necessario definire un ordine di precedenza per func ed è argomenti. È possibile ottenere questo in SWI-PROLOG con op/3.

Ad esempio, la direttiva (precedente codice in cui viene usato func/2):

:- op(500,yfx,func). 

Per implementare func/2, è possibile scrivere un meta-interprete per la lingua (ad esempio, si scrive un programma PROLOG che analizza espressioni scadenza, in particolare func e li interpreta come lo si desidera), o se func/2 è strettamente aritmetico, è possibile utilizzare arithmetic_function/1 anche come una direttiva, come segue:

:- arithmetic_function(func/2). 

Test questo con la seguente definizione per func/2:

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

dà, con il tuo esempio:

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

Ora che nel manuale di SWI Prolog si dice che questa direttiva è deprecata, come sarebbe una soluzione aggiornata? Tx –

+0

Non so perché fosse deprecato, meglio chiedere a [Jan Wielemaker] (https://github.com/JanWielemaker) se è davvero necessario saperlo. La mia comprensione è che funziona ancora, anche se è stato deprecato ... mi sbaglio? – sharky

2

E 'nel manuale, arithmetic_function/1 sarà alzare la relazione in qualcosa che is può capire, vedere

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