Tema 0 - Departamento de Lenguajes y Ciencias de la Computación

Anuncio
UNIVERSIDAD DE MALAGA
DEPARTAMENTO DE LENGUAJES Y
CIENCIAS DE LA COMPUTACION
PROGRAMACIÓN DECLARATIVA
CURSO 2000-2001
I. PROGRAMACIÓN LÓGICA
II. PROGRAMACIÓN FUNCIONAL
BIBLIOGRAFÍA
Programación Lógica:
Clocksin, W.F. y Mellish, C.S.
“Programación en Prolog”. Ed. Gustavo Gili S.A.Barcelona 1987.
Sterling, L. y Shapiro E.
“The Art of Prolog”. Ed. MIT Press. Cambridge, MA.1986.
Sterling, L. y Shapiro E.
“The Art of Prolog”. Ed. MIT Press. Cambridge, MA. 2ª ED 1994.
Programación Funcional:
Ruiz Jiménez, B.C.; Gallardo Ruiz, J.E.;Gutiérrez López, F. y
Guerrero García, P.
"Programación Funcional con Haskell". Universidad de Málaga. 1995
Richard Bird. Introducción a la Programación Funcional con Haskell.
Prentice hall. 2000
Ruiz Jiménez, B.C.; Gallardo Ruiz, J.E.;Gutiérrez López, F. y
Guerrero García, P.
"Razonando con Haskell. Una Introducción a la Programación
Funcionall". José E. Gallardo ED. 2000
EJEMPLO 1
Procedimiento, en MODULA2, para construir la lista con los elementos
comunes a dos listas:
PROCEDURE ElemComunes(A:ARRAY OF INTEGER;
B:ARRAY OF INTEGER;
VAR C:ARRAY[0..100] OF INTEGER;
VAR L:INTEGER);
VAR i,j,k:CARDINAL;
PROCEDURE Elem(X:INTEGER; B: ARRAY OF INTEGER):BOOLEAN;
VAR f:BOOLEAN;
i:CARDINAL;
BEGIN
f:=FALSE;
i := 0;
WHILE NOT(f) AND (i =< HIGH(B)) DO
f := X=B[i];
INC(i);
END;
RETURN f;
END Elem;
BEGIN
k:=0; (* posición inicial en lista de coincidencias *)
FOR i:=0 TO HIGH(A) DO
(* comprobar si A[i] está en la lista B *)
IF (Elem(A[i],B) THEN
(* si hay una coincidencia se copia en C*)
C[k]:=A[i];
k:=k+1 (* y avanza el índice k
*)
END;
END;
L:=k-1
(* número de elementos comunes *)
END ElemComunes;
LIMITACIONES:
• Necesidad de elegir una representación para las listas
(ARRAYs).
• Necesidad de un tipo fijo para los elementos componentes
de la lista.
• Necesidad de un tamaño fijo para la lista resultado y de una
variable auxiliar L para indicar el tamaño exacto.
CARACTERÍSTICAS DEL CÁLCULO:
• Uso de variables como "contenedores" que albergan un
valor (estado) que se puede modificar mediante instrucciones de asignación (cambio de estado).
• Indicación explícita de la secuencia de operaciones
(cambios de estado de las variables) que se deben realizar
para obtener el resultado.
• El cálculo se realiza mediante ciclos de cambios de estado
sobre grupos de variables.
EJEMPLO 2
Procedimiento, en HASKELL, para construir la lista con los elementos
comunes a dos listas:
-- función principal
elem :: (Eq t) => t -> [t] -> Bool
elem _ [] = False
elem x (y:ys) = x==y || elem x ys
elemComunes::(Eq t) => [t]->[t]->[t]
elemComunes [] ys = []
elemComunes (x:xs) ys
| elem x ys = x: elemComunes xs ys
| otherwise = elemComunes xs ys
CARACTERÍSTICAS DEL CÁLCULO:
• Se dispone de una representación genérica para listas de
elementos de cualquier tipo t: [] , x:xs.
• El elemento de cálculo es la función.
• En las definiciones de las funciones se indica que sólo
serán aplicables a elementos de un tipo t para el que está
definida la relación (test) de igualdad ==
• No se utilizan variables que cambian de estado; sino
argumentos defunciones que toman sus valores en el
momento en el que se producen las llamadas a dichas
funciones y los mantienen invariantes durante todo el
cálculo.
• El cálculo se realiza por paso de valores de unas llamadas
de funciones a otras siguiendo una pauta basada en el
anidamiento de las llamadas.
EJEMPLO 3
Procedimiento, en PROLOG, para construir la lista con los elementos
comunes a dos listas:
% relación auxiliar para establecer cuándo el primer
% argumento es miembro de la lista segundo argumento
elemento(X,[X|Ys]).
elemento(X,[Y|Ys]):-elemento(X,Ys).
% relación principal
elemComunes([],Xs,[]).
elemComunes([X|Xs],Ys,[X|Zs]):elemento(X,Ys),
% comprueba si X es elemento de Ys
elemComunes(Xs,Ys,Zs).
elemComunes([X|Xs],Ys,Zs):not elemento(X,Ys),
% comprueba que X no es elemento de Ys
elemComunes(Xs,Ys,Zs).
CARACTERÍSTICAS DEL CÁLCULO:
• Se dispone de una representación genérica para listas de
elementos de cualquier tipo:[] , [X|Xs].
• El elemento de cálculo es la relación.
• No se utilizan variables que cambien de estado; sino
argumentos que toman un único valor (y lo mantienen invariante durante todo el cálculo) cuando se produce una
llamada a la satisfacción de una relación e incógnitas que
se instancian durante el proceso de satisfacción.
• No se indican secuencias de cambios de estado sino
secuencias de llamadas a relaciones cuya validación puede
producir la asignación de un valor (instanciación) a una
variable. Las llamadas a relaciones no se anidan.
• El cálculo se realiza por paso de argumentos e
instanciación de incógnitas durante la satisfacción de
relaciones y paso de valores de unas llamadas a otras con
ayuda de la unificación de términos.
Descargar