:- 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]