930 likes | 1.13k Views
Programación en LISP. M.C. Juan Carlos Olivares Rojas. Agenda. Introducción Estructuras Operaciones Básicas Estructuras de Control Operaciones Matemáticas. Agenda. Funciones de Predicados Conjuntos y Relaciones Entradas y Salidas Implementación Respaldo y Recuperación. Introducción.
E N D
Programación en LISP M.C. Juan Carlos Olivares Rojas
Agenda Introducción Estructuras Operaciones Básicas Estructuras de Control Operaciones Matemáticas
Agenda Funciones de Predicados Conjuntos y Relaciones Entradas y Salidas Implementación Respaldo y Recuperación
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 funcional. • 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. • Tarea: Historia de los Lenguajes Funcionales.
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.