Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
CLASE 3 MODELO DE DESARROLLO DE PROGRAMAS Y PROGRAMACION CONCURRENTE - 2019 FAC.DE INGENIERIA - UNJu Paradigma Funcional PROGRAMACION FUNCIONAL Tiene gran flexibilidad, es conciso en su notación y su semántica es sencilla Inconveniente: ineficiencia en la ejecución Poderosos mecanismos p/controlar la complejidad y estructurar el código: son más abstractos y matemáticos y no pueden manejarse tan fácilmente PARADIGMA FUNCIONAL PARADIGMA FUNCIONAL PROGRAMAS COMO FUNCIONES • 1 PROGR.es 1 descripción de 1 cálculo específico, es equivalente a 1 fción matemát. y= f(x) o f:X -> Y. El conj. X se llama dominio de f y el conj. Y se conoce como el rango de f. • Los progr.,proced.y fciones. se representan x FUNCIONES. La progr. fcional.pura es completa en Turing xq cualquier cálculo puede ser descripto usando sólo fciones. • En1programa: x representa la entr.e y la salida. En1proced./fción,x repres.los parám.e y los valores devueltos NO se distingue entre programa, procedimientos y fciones Importante: en los lenguajes de programación se debe distinguir entre: 1) Definición de fción: es1declaración q describe como calcular 1fción usando parámetro 2) Aplicación de función: es1llamada a 1fción usando parámetros o argumentos PARADIGMA FUNCIONAL PROGRAMAS COMO FUNCIONES (cont) • Se elimina la asignación como operación disponible, en consecuencia tampoco pueden existir ciclos. Un lazo debe tener una variable de control que es reasignada conforme se ejecuta el lazo o ciclo, y esto no es posible sin la asignación. • P/q las operaciones se repitan en forma secuencial se usa la RECURSION, por ej. void gcd (int u, int v, int* x) { int y, t, z ; z=u ; y=v; While (y !=0) t=y; Y= z / y; Z= t; }*x=z; Versión imperativa utilizando un ciclo int gcd ( int u, int v) { if (v==0)return u else return gcd (v, u / v); } Versión funcional con recursión PARADIGMA FUNCIONAL PROGRAMAS COMO FUNCIONES (cont) • Transparencia Referencial: prop.de 1fción.de q su valor depende sólo de los valores de sus argumentos y de sus constantes no locales (gcd es transparente referencialmente ya q sólo del valor de sus argumentos). 1fción transparente referencialmente sin parámetros debe siempre devolver el mismo valor y no tiene ninguna diferencia con una constante • La carencia de asignación y la transparencia referencial hacen que la semántica sea simple: no existe una noción explicita de estado, ya q no localizaciones en la memoria con valores cambiantes (una localización de memoria implicaría la existencia de una variable) • El ambiente de ejecución asocia nombres sólo a valores (y no a localizaciones de memoria) y una vez introducido un nombre en el ambiente, su valor no puede cambiar. Esta idea de semántica se conoce como semántica de valor, a fin de distinguirla de la semántica de almacenamiento más usual. PARADIGMA FUNCIONAL PROGRAMAS COMO FUNCIONES (cont) • Las fciones.deben considerarse como valores q pueden ser calculados x otras fciones. y q también pueden ser parámetros de fciones Las funciones son valores de primera clase • Composición: es 1de las operac.esenciales de las fciones.. Matemáticamente se define el operador de composición “o” como: si f:X -> Y y g:Y-> Z, entonces g o f::X -> Z está dado por (g o f)(x) = g(f(x)) La composición es en sí misma es 1fción.que toma 2fciones.como parámetros y produce otra como su valor devuelto. Fciones.de este tipo (con parámetros q a su vez son fciones.o q producen un resultado q es una fción o ambos) se llaman FUNCIONES DE ORDEN SUPERIOR PARADIGMA FUNCIONAL Cualidades de los lenguajes de Programación Funcionales 1) Los proced.son fciones.y distinguen valores de entrada (parám.) de los de salida (result) 2) No existen variables ni asignaciones. Las variables se reemplazan x Parámetros 3) No existen ciclos, se reemplazan x llamadas recursivas 4) El valor de 1fción depende sólo del valor de sus parámetros y no del orden de Evaluación. 5) Las funciones son valores de primera clase PARADIGMA FUNCIONAL Programación funcional en un lenguaje imperativo 1) El estilo y técn.de la progr.fcional pueden usarse en 1leng.Imperativo como C o Pascal, logrando 1 mejor simplicidad de su semántica y claridad. El requisito es la disponibilidad de la recursión y un mecanismo gral.de fciones.adecuado 2) El problema típico en la progr. fcional es el costo de llevar a cabo todos los ciclos mediante la recursión. Existe 1 forma de p/convertir a 1estruct.estándar de ciclo llamada RECURSION TOTAL, donde la última operación en 1proced.es llamarse a sí mismo con diferentes argumentos 3) Muchos usos simples de recursión no cumplen con la recursiv.total, x lo q se inventaron técn. p/convertir fciones a fciones recursivas totales mediante parám.de acumulac.q se usan p/pre- calcular las operac.q se efectuarán después de la llamada recursiva y pasar los result.a la llamada recurs PARADIGMA FUNCIONAL Programación funcional en un lenguaje imperativo (cont) 4) P/evitar que leng.como C o Ada se usen p/escribir progr.fcionales perfectamente puros, los leng.imperat.contienen restricciones q dificultan o imposibilitan la interpretación en este estilo: o Valores estructurados como arreglos y registros no pueden ser valores devueltos de las fciones o No existe forma de construir un valor de un tipo estructurado de manera directa o Las fciones.no son valores de 1ra.clase (no es posible escribir fciones de orden superior) Esto afecta la capacidad de programar en estilo fcional y la forma en la que los métodos funcionales pueden ser simulados utilizando constructores imperativos ocasionales PARADIGMA FUNCIONAL Programación funcional en un lenguaje imperativo (cont) En estilo funcional, 1proced.de ordenamiento necesita devolver un arreglo en base a1arreglo de entrada. En Ada los arreglos pueden ser devueltos como valores de fciones, x ej.: function intsort(A: in IntArray) return Int Array is -- escriba IntArray es arreglo (parámetro de eentero <>) de inicio de entero …………. End intSort; En C 1arreglo no puede ser el valor devuelto de 1fción. Además el tamaño de un parámetro de arreglo no puede determinarse en C, x lo q debe ser pasado por separado. La fción Int Sort debe declararse: void IntSort (int a [¨], int b [¨], int size ) { . . . . . . } PARADIGMA FUNCIONAL LISP A fines de los 50 se desarrolla el 1er.leng.q contenía características de los leng. fcionales modernos: LISP (LISt Procesor) en vista de que su estruct.de datos básica es1lista Representación uniforme de progr.y datos usando 1 sola estructura gral.de datos LISTA La definic.del leng.usa1intérpre te escrito en el leng.mismo, llamado intérprete meta- circular Dialectos de Lisp: Common Lisp, desarrollado en la década del 80 y Scheme realizado a principios de los 70. Administración automática de toda la memoria x parte del sist.en tiempo de ejecución PARADIGMA FUNCIONAL Elementos de Scheme En Scheme todos los progr.y los datos son expresiones y estas son de 2tipos: átomos y listas Los átomos son como las constantes y los identificadores de un leng. imperat: incluyen nros, cadenas, lnombres, las fciones y otros constructores Una lista es 1 secuencia de expresiones separadas por espacios y rodeadas por paréntesis Sintaxis de scheme: expresión -> átomo | lista átomo -> número | cadena | identif.| carácter | booleano lista -> ‘(expresión –secuencia’)’ PARADIGMA FUNCIONAL Elementos de Scheme (cont) Ejemplos de átomos en Scheme: 42 -un número “hola” -una cadena #T - el valor booleano verdadero # \ a - el carácter ‘a’ Ejemplos de listas en Scheme: (2.1.2.2.3.1) - una lista de números (+ 2 3) - una lista formada por el identificador “+” y dos números (* (+ 2 3) (/ 6 2)) -una lista formada por un identificador seguido por dos listasEjemplos de identificadores en Scheme: a -otro identificador hola -otro identificador PARADIGMA FUNCIONAL Características de Scheme FORMA PREFIJA: Es la regla de evaluación de Scheme para todas las expresiones REGLA DE EVALUACION: los progr.son expresiones y deben ser evaluados, la semántica se da x: 1. Los átomos constantes, como números y cadenas se evalúan a sí mismos 2. Los identificad. se buscan en el ambiente actual y se reemplazan x el valor encontrado, en Scheme es 1 tabla de símbolos dinámicamente mantenida q asocia identificad.con valores 3. C/elemento de la lista se evalúa recursivamente como1expresión, la fción evalúa a 1ra.expresión de la lista, y luego se aplica a los valores del resto de la lista Ej.:42, “hello”, # T y #\ \a se evalúan a sí mismas; a y hello se buscan en el amb. y devuelven sus valores ( + 2 3) se evalúa buscando el valor de “+” en el ambiente-devuelve un valor de fción. La fción de adición está predefinida y después aplicando esta función de Adición a los valores de 2 y 3. Devuelve el valor 5 De manera similar (* ( + 2 3) (/ 6 2)) se evalúa y devuelve 15 La Lista (2. 1.2.2.3.1) NO puede evaluarse ya que su 1ra.expresión 2. es una constante que no es función PARADIGMA FUNCIONAL Comparación de expresiones “C” SCHEME 3 + 4 *5 ( + 3 ( * 4 5 )) (a == b) && (a! = 0) (and(= a b ) (not (= a 0))) gcd(10,35) (gcd 10 35) Gcd gcd Getchar() (read-char) La regla de eval.de Scheme es de ORDEN APLICATIVO: todas las sub-expresiones se evalúan 1ro.de modo q el árbol de la expresión resulta evaluado desde las hojas hasta la raíz. En la expresión (* (+ 2 3) (+ 4 5 ) ) se evalúa 1ro.las2adiciones y después las expresión resultantes, es decir el producto (* 5 9) . PARADIGMA FUNCIONAL Control de la ejecución Los ciclos se pueden realizar x llamadas recursivas La función if es similar al constructor if-then-else (if (= a 0) 0 If a = 0 entonces devuelve 0 (/ 1 a)) else devuelve a 1/a La función cond (conditional) es similar al constructor if –elsif (cond(( = a 0) 0) If a=0 entonces devuelve 0 (( = a 1 ) 1) elsif a=1 entonces devuelve 1 (else (/1 a))) else devuelve 1/a PARADIGMA FUNCIONAL La estructura de datos básica en Scheme es la lista, las demás estructuras deben presentarse en forma de listas. 1 lista puede representar 1 arreglo, 1 registro o cualquier otro dato. X ej. se muestra una representación de lista de un árbol de búsqueda binario formado por: (“caballo”(“vaca”() (“perro” () () )) (“cebra” (“bisonte” () () ) () )) Un nodo de este árbol es 1 lista de 3 elementos (name left right) donde name es una cadena, y left y right son lo árboles hijos que también son listas. Por lo tanto la lista dada representa el árbol: Estructuras de Datos en Scheme PARADIGMA FUNCIONAL Scheme tiene muchas fciones de lista predefinidas, pero las funciones básicas comunes a todos los sistemas LISP son las de selector car (contenido del registro de direcciones) y cdr (contenido del registro de decremento) q calculan el principio y el final de 1lista y las funciones de constructor cons, que añade un nuevo elemento al principio de una lista existente. Por ej. Si L es la lista (1 2 3) entonces: (car L) 1 (cdr L) (2 3 ) (cons 4 L) (4 1 2 3 ) Una lista L es un puntero a una caja de dos punteros: uno dirigido a su car y el otro a su cdr. Funciones para el manejo de listas en Scheme
Compartir