950 likes | 1.26k Views
Unidad III Programación Funcional. M.C. Juan Carlos Olivares Rojas. Agenda. 3.1 Recursividad como base de control de flujo 3.2 Listas como esencia en el manejo de datos 3.3 Lenguajes representativos: LISP y Scheme . Introducción.
E N D
Unidad III Programación Funcional M.C. Juan Carlos Olivares Rojas
Agenda 3.1 Recursividad como base de control de flujo 3.2 Listas como esencia en el manejo de datos 3.3 Lenguajes representativos: LISP y Scheme
Introducción • Creado por John McCartney en 1958. Viene del acrónimo LISt Processing. • Su paradigma de programación es la programación funcional por que todo se basa en el concepto de función. • Su utilización en Inteligencia Artificial fue su gran éxito.
Introducción • Los Componentes Básicos de LISP son: átomos y listas. • Los átomos pueden ser cualquier combinación de letras como CASA, ITM, PIEDRA, etc. • Las listas son cualquier combinación de átomos encerrados entre paréntesis. Se pueden tener listas anidadas.
Introducción • Ejemplos de listas: • (Esta es una lista) • (EstaEsOtraLista) • (Lista (anidada)) • El vocablo “término” se utilizará para identificar un elemento de una lista ya sea átomo o sublista.
Programación Funcional. • Está caracterizada por el principio funcional. • El valor de una expresión depende sólo de los valores de sus subexpresiones, si las tiene. • A+B es simplemente la suma de A y B. • Se excluye las asignaciones
Programación Funcional. • La mayoría de los lenguajes que lo implementan son impuros. • Permiten asignaciones. • Estilo de programación procedimental. • Los usuarios no deben preocuparse por el manejo de memoria. • Ciertas operaciones asignan espacios de almacenamiento en el momento necesario.
Programación Funcional • El almacenamiento que se vuelve inaccesible se libera. • Recolección de basura. • Las funciones son valores de primera clase. • Tienen la misma jerarquía que cualquier otro valor.
Programación Funcional • Puede ser el valor de una expresión. • Puede pasarse como argumento. • Puede colocarse en una estructura de datos.
Programación Funcional. • Lenguajes de Paradigma Funcional. • LISP • SCHEME • COMMON LISP • ML • Haskell
Programación Funcional. • Una función matemática es un mapeo de miembros de un conjunto llamado dominio, hacia otro conjunto llamado contra-dominio. • Toda definición de una función debe incluir de manera explicita o implícita: • Dominio (Puede ser el resultado de un producto cruz) • Contra-dominio • Mapeo
Programación Funcional. • Una función regresa solo un valor del contra-dominio para cada valor del dominio. • Es función?
Programación Funcional. • El orden de evaluación de sus expresiones de mapeo, es controlada por expresiones recursivas y condicionales. • Factorial.
Programación Funcional. • Siempre definen los mismos valores, para un mismo conjunto de valores. • Una función define un valor. • No una serie de operaciones sobre valores de una memoria, para producir dicho valor. • Esto implica que no hay variables en el sentido estricto de los lenguajes imperativos.
Programación Funcional • Variables que representan una localidad de memoria. • Definición de funciones • Nombre. • Lista de parámetros entre paréntesis. • Expresión de mapeo. • cubo(x)=x*x*x • Donde x es un número real.
Programación Funcional. • Los lenguajes funcionales, no tienen una construcción explícita para ciclos tal como FOR, WHILE, etc., • Utilizan una técnica de programación conocida como recursividad. • Aplicar una función como parte de la definición de esa misma función.
Programación Funcional • Debe existir una condición terminal, con el objeto de que la función se bifurque hacia una resolución no recursiva en algún punto. • De lo contrario, la función entra en un bucle infinito y nunca finaliza. • Los lenguajes suelen ser tradicionalmente interpretados. Existen solo algunas opciones para compilar programas.
Programación Funcional. • ¿Por qué no todo mundo usa LISP? • Sintaxis única. • LISP Lots of SillyParenthesis (Montón de paréntesis tontos) • Los paréntesis permiten uniformar la sintaxis.
Programación Funcional • Facilita la manipulación de los programas como datos. • No existen los tipos de datos. • Parte de los errores semánticos permanecen ocultos hasta la ejecución. • Implantaciones iniciales ineficientes.
Estructuras • Átomos. • Símbolos de Lisp • Hacen la función de un identificador. • Las constantes numéricas también son átomos. • Listas. • Estructura de datos. • Su procesamiento rara vez requiere inserciones o eliminaciones.
Programación Funcional. • Listas. • Se especifican delimitando sus elementos entre paréntesis. • Listas simples. • Todos sus elementos son átomos. • (A B C D) • Listas anidadas. • Sus elementos pueden ser átomos o sublistas. • (A (B C) D (E (F G)))
Programación Funcional. • Listas. • Internamente se implementan como listas simples enlazadas. • Cada nodo contiene dos punteros y representa un elemento. • Un nodo para un átomo contiene su primer puntero apuntando hacia alguna representación del átomo.
Programación Funcional • Un nodo para una sublista contiene su primer puntero apuntando hacia el primer nodo de la sublista. • En cualquier caso, el segundo puntero de un nodo, apunta hacia el nodo siguiente. • A continuación se describen las listas y sus elementos de forma gráfica.
Programación Funcional. • (A B C D) • (A (B C) D (E (F G))) A B C D A D C C E C B C F G
Programación Funcional • ¿Cómo se usa LISP en IA? • Se pueden codificar listas que pueden representarnos hechos, se pueden codificar reglas de inferencias en base a lista por lo que se puede hacer Programación Lógica. • El motor de inferencia es implementado por el usuario pudiendo considerar más tipos de lógicas.
Programación Funcional • El compilador/intérprete de LISP que se utilizará en este curso es el newLisp. • newLISP es un proyecto de software libre que cuya característica principal es que puede correr en ambientes gráficos y a su vez generar representaciones visuales.
Operaciones Básicas • A continuación se describen las operaciones básicas sobre LISP. • La Evaluación de expresiones se realiza a través del Top Level que es muy semejante al shell visto en Prolog. • Se escriben expresiones Lisp en el Top-Level, y el sistema despliega sus valores.
Operaciones Básicas • El prompt > indica que Lisp está esperando a que una expresión sea escrita. • La expresión es evaluada al pulsar enter. > 1 1 >
Operaciones Matemáticas • Las operaciones matemáticas son básicas para poder implementar el paradigma funcional, a continuación se describen la forma de realizar operaciones matemáticas. • Se desea evaluar la siguiente expresión aritmética: (+ 2 3) > (+ 2 3) 5 >
Operaciones Matemáticas • + es el operador / función. • Los números 2 y 3 son sus argumentos. • Notación prefija. • Sumar tres parámetros en notación infija implica Utilizar dos veces el operador suma: 2+3+5
Operaciones Matemáticas • Sumar tres parámetros en notación prefija • Una sola llamada a la función, con tres parámetros: (+ 2 3 5) • + es una función • (+ 2 3) es una llamada a la función. > (+ 2 3 5) 10 >
Operaciones Matemáticas • Cuando LISP evalúa una llamada a alguna función, lo hace en dos pasos: • Los argumentos de la llamada son evaluados de izquierda a derecha. En este caso los valores de los parámetros serán, 2 y 3 respectivamente. • Los valores de los argumentos son pasados a la función nombrada por el operador. En este caso la función + que regresa 5.
Operaciones Matemáticas • Uso del operador suma > (+) 0 > (+ 2) 2 > (+ 2 3) 5 > (+ 2 3 5) 10 >
Operaciones Matemáticas • Como los operadores pueden tomar un número variable de argumentos, es necesario utilizar los paréntesis para indicar donde inicia y donde termina una expresión. • Las expresiones pueden anidarse. Por ejemplo: (7-1)/(4-2) > (/ (- 7 1)(- 4 2)) 3
Operaciones Matemáticas • Si alguno de los argumentos es una llamada de función, ésta será evaluada acorde a las reglas. • Los argumentos de la llamada son evaluados de izquierda a derecha. • Los valores de los argumentos son pasados a la función nombrada por el operador. • Evaluar (/ (- 7 1) (- 4 2))
Operaciones Matemáticas • Lisp evalúa el primer argumento de izquierda a derecha (-7 1). • 7 es evaluado como 7 y 1 como 1. • Estos valores son pasados a la función - que regresa 6. • El siguiente argumento (- 4 2) es evaluado.
Operaciones Matemáticas • 4 es evaluado como 4 y 2 como 2. • Estos valores son pasados a la función - que regresa 2. • Los valores 6 y 2 son pasados a la función / que regresa 3.
Operaciones Matemáticas • Un operador que no sigue la regla de evaluación es: quote ( ’ ) • La regla de evaluación de quote es: • No hacer nada, solo desplegar lo que el usuario tecleó. • El operador quote es una forma de evitar que una expresión sea evaluada.
Operaciones Matemáticas > (quote (+ 2 3)) (+ 2 3) > ’(+ 2 3) (+ 2 3) • Tipos de átomos • Entero: Se escribe como una secuencia de dígitos. Ejemplo: 256. • Cadena : Secuencia de caracteres que se delimita por comillas. Ejemplo: “Carpe Diem”.
Operaciones Matemáticas • Enteros y cadenas se evalúan a ellos mismos. • Los símbolos son palabras. Normalmente se evalúan como si estuvieran escritos en mayúsculas, independientemente de como fueron tecleados. • Los símbolos por lo general no evalúan a si mismos. Es necesario referirse a ellos. > ’Amarone AMARONE
Operaciones Matemáticas • Las listas se representan como cero o más elementos entre paréntesis. • Los elementos pueden ser de cualquier tipo, incluidas las listas. • Se debe usar quote con las listas, pues de otra forma Lisp las tomaría como una llamada a función.
Operaciones Matemáticas • Un sólo quote protege a toda la expresión, incluidas las expresiones en ella. • Se puede construir listas usando el operador list que es una función, y por lo tanto, sus argumentos son evaluados. > ’(Mis 2 "ciudades") (MIS 2 "CIUDADES") > ’(La lista (a b c) tiene 3 elementos) (LA LISTA (A B C) TIENE 3 ELEMENTOS)
Operaciones Matemáticas • Estética minimalista y pragmática • Los programas Lisp se representan como listas. • Un programa Lisp puede generar código Lisp. Por eso es necesario quote. > (list ’mis (+ 4 2) "colegas") (MIS 6 COLEGAS)
Operaciones Matemáticas • Si una lista es precedida por el operador quote, la evaluación regresa la misma lista. • En otro caso, la lista es evaluada como si fuese código. > (list ’(+ 2 3) (+ 2 3)) ((+ 2 3) 5)
Operaciones Matemáticas • En Lisp hay dos formas de representar la lista vacía • Con un par de paréntesis • Con el símbolo NIL. > () NIL > NIL NIL
Operaciones Matemáticas • La función cons construye listas. • Si su segundo argumento es una lista, regresa una nueva lista con el primer argumento agregado en el frente. > (cons ’a ’(b c d)) (A B C D) > (cons ’a (cons ’b nil)) (A B)
Operaciones Matemáticas • El segundo ejemplo es equivalente a: • Las funciones primitivas para accesar los elementos de una lista son car y cdr. • El car de una lista es su primer elemento (el más a la izquierda) . > (list ’a ’b) (A B)
Operaciones Matemáticas • El cdr es el resto de la lista (menos el primer elemento). • En realidad en newLisp car se hace a través de first y cdr a través de rest. > (first '(a b c)) a > (rest '(a b c)) (b c)
Estructuras de Control • Ya se mencionó que no existen en LISP estructuras de control semejantes a los lenguajes procedimentales u orientado a objetos. • Un Predicado es una función cuyo valor de regreso se interpreta como un valor de verdad (verdadero o falso). • Es común que el símbolo de un predicado termine en p.
Estructuras de Control • Como nil juega dos roles en Lisp, las funciones: null (lista vacía) y not (negación) hacen exactamente lo mismo: • La condicional (if) Normalmente toma tres argumentos: • una expresión a probar (test) > (null nil) T > (not nil) T