Operadores

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



emorales 2012-05-03