:- op(Numero, Forma, Nombre).
Si tenemos:
a * b + c * d => + (* (a,b), *(c,d)) *, + son operadores ``infix''La definición (representación real) se puede ver con
display
H :- T => :- (H, T). f :- g, h, i => :- (f, ','(g, ','(h,i))) a :- b,c,d is 3 + 4 => :-(a,','(b,','(c,is(d,+(3,4)))) [1,2,3,4] => .(1,.(2,.(3,.(4,[]))))Todo la sintáxis en Prolog está definida por medio de operadores. La ventaja que tiene es que uno puede definir sus propios operadores!!
Por ejemplo, si quiero escribir: bloqueA sobre bloqueB
en lugar de sobre(bloqueA,bloqueB), puedo definir un operador
sobre
La forma de hacerlo es por medio de (a veces llamados ``directivos''):
:- op(Numero,Forma,Nombre). :- op(150,xfx,sobre). :- op(200,xfx,es_un). bloqueA sobre bloqueB. juan es_un hombre.El
numero o la precedencia dependen de la
implementación, aunque normalmente está dada como:
:- op(1200,xfx,':-'). :- op(1200,fx,[:-,?-]). :- op(1100,xfy,';'). :- op(1000,xfy,','). :- op(500,yfx,[+,-]). :- op(400,yfx,[*,/]).
Tipos de operadores:
| infix | xfx, xfy, yfx |
| prefix | fx, fy |
| postfix | xf, yf |
f = operador, X y Y = argumentos
Precedencia de argumentos encerrados en paréntesis = 0
X = precedencia
que el operador
Y = precedencia
que el operador
:- op(500,yfx,+). a + b + c => (a + b) + c :- op(500,xfy,+). a + b + c => a + (b + c) not not p => fy not (not p) => fx ':-' tambien puede servir para consultar un programa: :- [archivo1, archivo2].Otro ejemplo:
a sobre b y b sobre c y c sobre d.
:- op(200,xfx,sobre).
:- op(300,xfy,y).
y(sobre(a,b),y(sobre(b,c),sobre(c,d)))
la temperatura de la caldera es 200
:- op(100,fx,la).
:- op(299,xfx,de).
:- op(300,xfx,es).
es(de(la(caldera),la(temperatura)),200)
Un par de mejores ejemplos:
:- op(100,xfx,en).
:- op(100,xfx,y).
:- op(200,xfx,da).
:- op(300,fx,junta).
Elem en [Elem|_].
Elem en [_|T] :-
Elem en T.
junta [] y L da L.
junta [H|L1] y L2 da [H|L3] :-
junta L1 y L2 da L3.
?- a en [1,s,a,d].
yes
?- junta [1,2] y [3,4] da L.
L=[1,2,3,4]