Question

Je suis récemment appris sur Prolog et je trouve les trois types utilisés pour définir les opérateurs infixes confusion.

Quelles sont les différences entre XFX, xfy et yfx La définition du type d'un opérateur? J'ai googlé sur le problème et n'ai pas trouvé quelque chose d'utile.

J'ai essayé de taper les codes suivants 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]).

et la sortie:

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

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

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

yes

Les résultats ont montré aucune différence pour moi.

Était-ce utile?

La solution

Le « type » de l'associativité commandes de l'opérateur, par exemple, si l'expression "5 - 4 - 3" doit être interprétée comme "(5 - 4) - 3", qui est connu comme l'associativité gauche ou "5 - (4 - 3).", ce qui est à droite associativité

Si l'opérateur moins devrait fonctionner comme d'habitude prévu, est nécessaire de définir comme « yfx » qui le rend laissé associatif. D'autres types comme « XFX et « xfy » sont des variations sur ce sujet. Voir plus http: //www.cse.unsw .edu.au / ~ billw / cs9414 / notes / Prolog / op.html .

Autres conseils

Si votre Prolog est conforme ISO, vous pouvez utiliser write_canonical d'analyser l'effet des opérateurs priorité et l'associativité. Par exemple

?- write_canonical(1+2*3).
+(1,*(2,3))
true.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top