Domanda

Di recente sto imparando a conoscere Prolog e trovo i tre tipi usati per definire gli operatori di infix confusi.

Quali sono le differenze tra XFX, XFY e YFX quando si specificano il tipo di operatore? Ho cercato su Google il problema e non ho trovato nulla di utile.

Ho provato a digitare i seguenti codici in Prolog:

:- op(500,yfx,is_alive).
is_alive(A,B) :- display([A,B]).
:- op(500,xfy,is_alive2).
is_alive2(A,B) :- display([A,B]).
:- op(500,xfx,is_alive3).
is_alive3(A,B) :- display([A,B]).

e l'output:

| ?- 1 is_alive 2.
'.'(1,'.'(2,[]))

yes
| ?- 1 is_alive2 2.
'.'(1,'.'(2,[]))

yes
| ?- 1 is_alive3 2.
'.'(1,'.'(2,[]))

yes

I risultati non hanno mostrato alcuna differenza per me.

È stato utile?

Soluzione

Il "tipo" dell'operatore controlla l'associazione, ad esempio se l'espressione "5 - 4 - 3" dovrebbe essere interpretata come "(5 - 4) - 3", che è noto come associazione sinistra o come "5 - (4 - 3) ", Che è la giusta associazione.

Se l'operatore meno dovrebbe funzionare come di solito previsto, è necessario definire come "YFX", il che lo rende l'associazione sinistra. Altri tipi come "xfx e" xfy "sono variazioni su questo. Vedi di più a http://www.cse.unsw.edu.au/~billw/cs9414/notes/prolog/op.html.

Altri suggerimenti

Se il tuo prolog è conforme all'ISO, puoi usare write_canonical per analizzare l'effetto della precedenza e della associazione degli operatori. Per esempio

?- write_canonical(1+2*3).
+(1,*(2,3))
true.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top