Pregunta

Recientemente estoy aprendiendo sobre Prolog y encuentro los tres tipos utilizados para definir a los operadores Infix que confunden.

¿Cuáles son las diferencias entre XFX, XFY y YFX al especificar el tipo de operador? He buscado en Google el problema y no he encontrado nada útil.

Intenté escribir los siguientes códigos en 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]).

y la salida:

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

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

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

yes

Los resultados no me mostraron diferencia.

¿Fue útil?

Solución

El "tipo" del operador controla la asociatividad, por ejemplo, si la expresión "5 - 4 - 3" debe interpretarse como "(5 - 4) - 3", que se conoce como asociatividad de izquierda o como "5 - (4 - 3) ", que es la correcta asociatividad.

Si el operador menos debe funcionar como se espera, es necesario definirse como 'YFX', lo que lo hace a la izquierda. Otros tipos como 'XFX y' XFY 'son variaciones en esto. Ver más en http://www.cse.unsw.edu.au/~billw/cs9414/notes/prolog/op.html.

Otros consejos

Si su prólogo cumple con ISO, puede usar Write_Canonical para analizar el efecto de la precedencia y la asociatividad de los operadores. Por ejemplo

?- write_canonical(1+2*3).
+(1,*(2,3))
true.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top