Professional Documents
Culture Documents
OPERADORES
Son predicados predefinidos en Prolog para las operaciones matemticas bsicas.
Su sintaxis depende de la posicin que ocupen, pudiendo ser infijos o prefijos. Por
ejemplo el operador suma ("+"), podemos encontrarlo en forma prefija + (2,5) o
bien infija, '2 + 5'.
Tambin dispone de predicados de igualdad y desigualdad:
X = Y igual; X \= Y distinto; X < Y menor; X > Y mayor; X =< Y menor o igual;
X >= Y mayor o igual.
Al igual que en otros lenguajes de programacin es necesario tener en cuenta la
asociatividad de los operadores antes de trabajar con ellos, Por ejemplo, 3+2*6 =
3 + (2*6).
is.
Es un operador infijo, que en su parte derecha lleva un trmino que se interpreta
como una expresin aritmtica, contrastndose con el trmino de su izquierda.
Por ejemplo, la expresin 6 is 4+3 es falsa. Por otra parte, si la expresin es '6 is
4+2, ser verdadera. Y si la expresin se define de la siguiente manera X is 4+3.'
el resultado ser la instanciacin de X: X = 7
consult.
El predicado consult est pensado para leer y compilar un programa Prolog o bien
para las situaciones en las que se precise aadir las clusulas existentes en un
determinado fichero a las que ya estn almacenadas y compiladas en la base de
datos. Su sintaxis puede ser una de las siguientes:
p(X,Z) :- q(X,Y),r(Y,Z),s(Z).
' :- '(p(X,Z),(','(q(X,Y),','(r(Y,Z),s(Z))))).
Los Operadores son usados con trminos binarios y unarios solamente. Ellos
permiten colocar la localizacin de la funcin (prefijo, infijo, posfijo), la
caracterstica asociativa y, finalmente, la prioridad entre operadores.
op(Prioridad, Apariencia, Nombre)
|
precedencia.
x obliga a que sea estrictamente menor.
Ejemplo: + declarado como yfx
a + b + c: a+(b + c) (a + b)+ c
La primera opcin queda eliminada porque el segundo argumento no puede
contener un operador de precedencia igual.
Esto se conoce como asociatividad por la izquierda (yfx), por la derecha (xfy) o
indistintamente (xfx); segn esto, no tendr sentido (yfy).
Operadores definidos
Se puede saber si un operador est definido y cmo?
current_op(?Precedencia, ?Tipo, ?Nombre)
Es verdadero si el operador Nombre est definido como operador de tipo Tipo con
precedencia Precedencia
Ejemplo:
?- current_op(Precedencia, Tipo, \+).
Precedencia = 900
Tipo = fy
True
Ver todos los operadores definidos:
?- current_op(Precedencia, Tipo, Operador).
Operadores predefinidos
Puede tener efectos laterales al satisfacer, adems de instanciar variables. Puede
forzar a que los argumentos sean de un cierto tipo. Los predicados que deberan
formar el ncleo del interprete Prolog, aunque habr revisarlo para cada versin.
X = Y.
Unificacin: intenta hacer X e Y iguales mediante unificacin.
X \= Y.
Su opuesto: no unifican
X == Y. Identidad
Ms restrictivo que X = Y. Se satisface si X = Y, pero no necesariamente a la
inversa.
?-X = Y.
?-X == X.
?-X = Y, X == Y.
?-append([A|B], C) == append(X, Y).
?-append([A|B], C) == append([A|B], C).
X \== Y.
Su opuesto.
Entrada y salida bsico
Lectura
read(X),
get0(X),
get(X)
Escritura
write(X),
display(X)
put(X)
Formato:
nl
tab(X)
skip(+Code)
skip(a).
Manejo de ficheros
Lectura:
see(X),
seeing(X),
seen
Escritura:
tell(X),
telling(X),
told
Comparacin de nmeros
X = Y.
X > Y.
X \= Y.
X >= Y.
X < Y.
X =< Y.
Tipo
Operadore
500
500
400
200
yfx
fx
yfx
xfy
s
+, *, /
[a|[b|[c|[d|[]]]]],
[a, b, c, d| [ ] ] .
componentes, el ltimo de los cuales es a su vez una lista, mientras que [a, b | [ c,
d, e] ] sera una lista con cinco componentes todos constantes.
Ordenacin de lista
Teniendo en cuenta la posibilidad que ofrece la representacin de listas en Prolog
de acceder directamente a varios elementos del comienzo de una lista y
compararlos, podemos definir un predicado ordenada/1 que determine si una lista
(de nmeros o de trminos) est ordenada o no.
Respecto a la ordenacin de listas, la mayora de los algoritmos se basan en la
combinacin de una particin de las listas en dos trozos, la ordenacin de los
trozos y la combinacin de los trozos ordenados. Este esquema lo siguen los
algoritmos de ordenacin por insercin, ordenacin por mezcla y ordenacin con
pivote (quicksort) que lo aplican del siguiente modo:
El algoritmo de ordenacin por insercin parte la lista en cabeza y cola, ordena la
cola e inserta la cabeza en el lugar adecuado de la cola ordenada, por lo que
nicamente necesita un procedimiento auxiliar para insertar elementos en listas
ordenadas.
El algoritmo de ordenacin por mezcla parte la lista en dos trozos
aproximadamente de igual longitud, ordena cada trozo y despus los mezcla. Este
algoritmo necesita dos procedimientos auxiliares: un procedimiento para separar
una lista en dos aproximadamente de igual longitud y otro para mezclar listas
ordenadas de forma que se obtenga una lista igualmente ordenada.
El algoritmo de ordenacin por pivote usa un elemento como pivote para partir la
lista en una lista con los elementos menores o iguales que el pivote y otra con los
elementos estrictamente mayores, ordena ambas listas y despus las encadena
los menores delante de los mayores.
Este algoritmo necesita dos procedimientos: uno para separar una lista con ayuda
de un pivote en dos listas una con los elementos menores o iguales que el pivote y
otra con los elementos mayores, y otro procedimiento para encadenar dos listas
que ya conocemos.
longitud([],0).
longitud([_X|L],N) :longitud(L,M),
N is M + 1.
Sesin
?- longitud([a,b,c],N).
N=3
Yes
Predicado predefinido: length(L,N)
Mximo de una lista
max_list([X],X).
max_list([X,Y|L],Z) :max_list([Y|L],U),
maximo(X,U,Z).
maximo(X,Y,X) : X >= Y.
maximo(X,Y,Y) : X < Y.
IIC-Practica
Tema 6 operadores
Tema-15-1x2
Apunte05-03-6x
RBOLES
En Ciencias de la Computacin, hablamos de un rbol como una estructura, que
contiene un nodo padre y dos nodos hijos, un izquierdo y un derecho, los cuales a
su vez hacen referencia a "null", o ms dicho en prolog seria "nil", que significa
vaci.
En prolog un rbol binario se definir de la siguiente manera
arbol(Hi,X,Hd), donde Hi es hijo izquierdo , Hd hijo derecho, y X el padre.
rbol binario
Definicin: el conjunto de rboles binarios B de D se define
1. nil B (rbol vaco) [base]
2. si I, D B R D, entonces I::R::D B [recursivo]
:: :: es un constructor ternario: B D B B
hijo izquierdo :: raz :: hijo derecho
Ejemplo:
(nil :: a :: nil ) :: b :: (nil :: c :: nil)
Representacin
Necesitamos trminos recursivos para representar rboles
Seguimos la definicin inductiva de B:
1. nil B (rbol vaco) [base]
2. si I, D B R D, entonces I::R::D B [recursivo]
Caso base constante vacioB
Caso recursivo estructura funtor nodoB/3 nodoB(I,R,D)
Un rbol binario bien formado es un trmino de la gramtica:
AB ::= vacioB
| nodoB(AB,T,AB)
donde T es un trmino Prolog
Referencias bibliogrficas