LISP I.

Slides:



Advertisements
Presentaciones similares
Base de Datos II.
Advertisements

Rogelio Dávila Pérez Profesor - Investigador
Estructuras de control
Números reales/El valor absoluto.
INTELIGENCIA ARTIFICIAL
INTELIGENCIA ARTIFICIAL
INTELIGENCIA ARTIFICIAL
INTELIGENCIA ARTIFICIAL
Universidad San Martín de Porres
Estrella 0 - Fundamentos de la Programación
9. Collecciones en C++ .NET
Pippy (Python para niños)‏ 1.
ÁRBOLES EN C UNIVERSIDAD “ALONSO DE OJEDA” Facultad de Ingeniería
Complejidad de Algoritmos
Preguntas tipo test (Tema I)
Algoritmos Aleatorizados
Informática II 1 Diego Fernando Serna RestrepoSemestre 2011/2.
Tema 3. Optimización de Código
Números fraccionarios
Unidad III Programación Funcional
TRAMPAS EN EL DISEÑO DE LENGUAJES CON RELACIÓN A LOS NOMBRES - REGLAS DE ALCANCE - COMPILACIÓN POR SEPARADO CONTROL DE FLUJO - EVALUACIÓN DE EXPRESIONES.
Fundamentos de Programación
Arboles Binarios de expresiones
Tema 9 Estructuras.
M.C. Juan Carlos Olivares Rojas
14/04/ Implementación de un lenguaje basado en reglas. José Angel Bañares. V LenguajeReglas.ppt ImplementaciónReglas Implementación de motores.
function [y,n] = sigadd(x1,n1,x2,n2)
Programación en Matlab
CARACTERÍSTICAS DE LOS PROGRAMAS
Computadoras analógicas Miden magnitudes físicas que se distribuyen en escala continua como pueden ser la temperatura y la presión. Este tipo de computadoras.
Inteligencia artificial
Introducción a LISP Sergio Jiménez Celorrio Departamento Ingeniería Informática – UC3M.
Extensiones sintácticas Revisaremos formas especiales que son sintácticamente equivalentes a patrones que son expresables en términos de formas básicas.
1 Estructuras de Datos Elementales:stacks (pilas), queues (colas), linked lists (listas enlazadas), y rooted trees (árboles con raíz) Agustín J. González.
Operaciones combinadas
Agenda Clase 16 Motivación e Historia de la Programación Funcional y la Programación Lógica. Concepto y Características de la Programación Funcional. Ventajas.
Representación en LISP
1 Asignación Dinámica de Memoria Agustín J. González Versión original de Kip Irvine ELO 329.
Recurrencia Programación II de enero de 2009.
NUMEROS NATURALES Y NÚMEROS ENTEROS
Clasificación de los TDA
(1+5*5)+(3*2); El análisis semántico en ANTLR se hace de forma descendente, por ello se va desarrollando el árbol completo desde el inicio para su explicación.
2008 Escuela de Informática y Telecomunicaciones, DuocUC Escuela de Informática y Telecomunicaciones Clase 7: Control del flujo en BASH Nombre unidad de.
1 LISP II l Contenido de la sesión  Organización de memoria y Operaciones destructivas  Funciones anónimas. Variables. Alcances.  A-listas. Pattern.
1 TEMA IMPLEMENTACION DE LENGUAJES FUNCIONALES. Lecciónes.
Recursividad (2 clases) 1. Nivelación Funciones Menú Vectores String
1 Samba: Un lenguaje funcional perezoso Presentación del lenguaje: qué es un programa Samba definiciones locales abstracciones lambda Tipos inductivos:
Apuntes de Matemáticas 3º ESO
El lenguaje LISP.
Agenda Clase 6 Iteradores. Enumeración sin iteradores. Loops lógicos. Recursión vs. Iteración. Recursión de Cola. Orden de Evaluación Normal y Aplicativo.
IERL 2.1 José Ignacio Aguillo Mendi ISBC Curso
1 El lenguaje LISP “LISP is an easy language to learn” (Henry et.al., 1984)
1 Módulo 4 Sentencias SQL. 2 Objetivos Generales Implementar una base de datos Definir los campos, registros, tablas que se encuentran relacionadas en.
Números fraccionarios
Objetivo Mostrar los fundamentos de la programación a través de ejemplos y prácticas utilizadas cotidianamente en el desarrollo de aplicaciones.
1 Asignación Dinámica de Memoria Agustín J. González ELO 329.
1.1 CONCEPTOS BÁSICOS DE PROGRAMACIÓN Y ALGORITMOS.
Optimización automática de programas (OAP) Germán Vidal 1 Optimización automática de programas Tema 2: Funciones, tipos y expresiones 2.1. Funciones 2.2.
MSSQL SERVER CURSO BÁSICO 1. CONCEPTOS BASICOS DE SQL. DESCRIPCIÓN DEL CURSO. Sesión 3: Índices Uso, Creación, Tipos, Eliminación LENGUAJE DE CONSULTAS.
CICLOS EN C – PARTE 3.
Lenguaje de Programación LISP
MENU MÉTODO MAP ATRIBUTO CLEAR ATRIBUTO ERASE ATRIBUTO FINAL ATRIBUTO SIZE SINTAXIS DE MAP ATRIBUTO FIRST Y SECOND ATRIBUTO EMPTY PRINCIPAL.
Bases de Datos SQL.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Arreglo.
Tratamientos Secuenciales Generalizados II Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Unidad Didáctica 19 Versión
Estructuras de control selectivas Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Versión Práctica 3.
Tema 8: Programación estructurada Introducción La importancia del conocimiento de programación es mucho mayor de lo que se piensa. Aprender a programar.
Clase II Estructuras dinámicas (TAD) Listas Enlazadas. ¿A que llamamos estructuras dinámicas? ¿Por qué son necesarias? Ventajas y Desventajas que tendremos.
Tratamientos secuenciales I Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Unidad Didáctica 8 Versión
Departamento de Informática Universidad Técnica Federico Santa María Lenguajes Funcionales Francisco Bórquez Departamento de Informática Universidad Técnica.
Transcripción de la presentación:

LISP I

Programación recursiva frente a iterativa Características de la programación recursiva: Implementación intuitiva y elegante. La traducción de la solución recursiva de un problema (caso base y caso recursivo) a código Lisp es prácticamente inmediata. Útil para optimizar cálculos. Las estructuras de datos en Lisp hacen un uso implíctito de los punteros, como en las listas: NIL ó Un cons cuyo cdr es, a su vez, una lista Útil cuando hay varios niveles de anidamiento. La solución para un nivel es válida para el resto. Formas de hacer versión iterativa: Con mapcar Con bucles (dolist, dotimes, etc. Desaconsejado).

Ejemplos de recursividad, (1) Ejemplo del cálculo de la potencia de un número optimizada > (defun potencia (x n) ;; “Optimizacion calculo potencia" (cond ((= n 0) 1) ((evenp n) (expt (potencia x (/ n 2)) 2) ) (t (* x (potencia x (- n 1)))))) > (potencia 2 3) 8 La interpretación y comprensión del código es compleja. Por ello es importante llegar a un compromiso entre la claridad de la programación y la eficiencia en la misma.

Ejemplos de recursividad, (2) Contar los átomos de cualquier expresión LISP: > (cuenta-atomos '(a (b c) ((d e) f))) 6 > (defun cuenta-atomos (expr) (cond ((null expr) 0) ((atom expr) 1) (t (+ (cuenta-atomos (first expr)) (cuenta-atomos (rest expr))))))

Ejemplos de recursividad, (3) Aplanar una lista: (aplana ‘(a (b c) ((d e) f))) >>> (A B C D E F) > (defun aplana (lista) (cond ((null lista) NIL) ((atom (first lista)) (cons (first lista) (aplana (rest lista)))) (t (append (aplana (first lista)) (aplana (rest lista))))))

Ejemplos de recursividad, (4) Número de sublistas de una lista (número de veces que se abre paréntesis, menos 1): (sublistas ‘(a (b c) ((d e) f))) >>> 3 > (defun sublistas (expresion) (cond ((or (null expresion) (atom expresion)) 0) (t (+ (if (atom (first expresion)) 0 1) (sublistas (first expresion)) (sublistas (rest expresion))))))

Ejemplos de recursividad, (5) Producto escalar: (producto '(2 3) '(4 5)) >>> 23 2 x 4 + 3 x 5 = 23 Versiones válidas: Versión recursiva: > (defun producto (vector1 vector2) (if (or (null vector1) (null vector2)) (+ (* (first vector1) (first vector2)) (producto (rest vector1) (rest vector2))))) Versión con mapcar >(defun producto (vector1 vector2) (apply #'+ (mapcar #'* vector1 vector2)))

Ejemplos de recursividad, (6) Versión no válida del producto escalar: Versión iterativa (no recomendable): > (defun producto (vector1 vector2) (let ((suma 0)) (dotimes (i (length vector1)) (setf suma (+ suma (* (nth i vector1) (nth i vector2))))) suma))

Ejemplos de recursividad, (7) > (defun profundidad-maxima (expresion) (cond ((null expresion) 0) ((atom expresion) 1) (t (+ 1 (apply #'max (mapcar #'profundidad-maxima expresion)))))) >>> PROFUNDIDAD-MAXIMA > (profundidad-maxima '(1)) >>>> 2 > (profundidad-maxima '((1 (2 (3))) 4)) >>>> 5

Repaso de operadores, (1) Recordemos los siguientes operadores: COUNT-IF, FIND-IF, REMOVE-IF, REMOVE-IF-NOT, DELETE-IF, DELETE-IF-NOT COUNT / COUNT-IF Contar apariciones: (count <elemento> <lista> [:test <fun-igualdad>]) (count 2 ‘(1 2 3 4 2 4 5 2)) 3 Contar los elementos que cumplen /no cumplen una condición de una lista (count-if[-not] <predicado><lista> (count-if ‘oddp ‘(1 2 3 4 5 6))

Repaso de operadores, (2) FIND / FIND-IF Devuelve la primera aparición: (find <elemento> <lista> [:test <fun-igualdad>]) (find 2 ‘(1 2 3 4 2 4 5 2)) 2 Devuelve el primer elemento que cumple/o no cumple el predicado (find-if[-not] <predicado><lista> (find-if ‘oddp '(1 2 3 4 2 4 5 2)) 1 REMOVE / REMOVE-IF Borrar las apariciones de un elemento indicado (remove <elemento> <lista> (remove 2 ‘(1 2 3 4 2 4 5 2)) (1 3 4 4 5) Elimina los que cumple/o no cumple el predicado (remove-if[-not] <predicado><lista> (remove-if ‘oddp '(1 2 3 4 2 4 5 2)) (2 4 2 4 2)

Ejemplos de recursividad, (8) Objetivo: sin utilizar remove-if, conseguir la misma funcionalidad del operador: (quitar-si ‘evenp '(1 2 3 4)) (1 3) Versiones válidas: Versión recursiva: (defun quitar-si (predicado lista) (cond ((null lista) nil) ((funcall predicado (car lista)) (quitar-si predicado (cdr lista))) (t (cons (car lista) (quitar-si predicado (cdr lista)))))) Versión con mapcar (delete NIL (mapcar #'(lambda (elemento) (when (not (funcall predicado elemento)) elemento)) lista)))

Ejemplos de recursividad, (9) Recorriendo la lista con dolist: (defun QUITAR-SI (predicado lista) (let (listaaux) (dolist (i lista listaaux) (if (not (eval (list predicado i))) (setf listaaux (append listaaux (list i))) )

Ejemplos de recursividad, (10) Versión errónea: Mal uso de mapcar. El hecho de que hagamos uso de mapcar no garantiza la corrección del código programado. (defun QUITAR-SI2 (predicado lista) (mapcar #’(lambda (elemento) (if (apply predicado (list elemento)) (remove elemento lista)) ) lista)) > (QUITAR-SI2 'evenp '(1 2 3 4)) (NIL (1 3 4) NIL (1 2 3))