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.