Tema 3: Características de la programación funcional

Tamaño: px
Comenzar la demostración a partir de la página:

Download "Tema 3: Características de la programación funcional"

Transcripción

1 Tema 3: Características de la programación funcional Sesión 5: El paradigma funcional (1) martes 22 de febrero de 2011 Referencias Capítulo SICP: [[ H-10.html#%_sec_1.1.5][The Substitution Model for Procedure Application]] Capítulo 10 PLP: Functional Languages martes 22 de febrero de 2011

2 Hoy veremos Historia del paradigma funcional Características del paradigma funcional puro Modelo de computación basado en sustitución martes 22 de febrero de 2011 Orígenes históricos Raíces teóricas, antes de aparecer los ordenadores 1930s: Alan Turing, Alonzo Church, Stephen Kleene, Emil Post, etc. Turing: Máquina de Turing, programación imperativa Kleene y Post: métodos abstractos, sustituciones algebraicas Church: Cálculo lambda, programación funcional Modelo de cálculo lambda basado en la definición de funciones y la aplicación de estas funciones a argumentos martes 22 de febrero de 2011

3 Conceptos de la programación funcional En un sentido estricto, la programación funcional define un programa como una función matemática que convierte unas entradas en unas salidas, sin estado interno ni efectos laterales Lenguajes funcionales puros: Miranda, Haskell, ph, Sisal, ML... (1958, John MacCarthy). LISP es el primer lenguaje de alto nivel basado en el paradigma funcional LISP no es programación funcional pura, tienen algunas instrucciones imperativas que permiten estado local y efectos laterales LISP lenguaje revolucionario, introduce nuevos conceptos: funciones como objetos primitivos, funciones orden superior, polimorfismo, listas, recursión, símbolos, homogeneidad de datos y programas, bucle read-eval-print martes 22 de febrero de 2011 Características de la programación funcional Programación declarativa: no hay asignación ni cambio de estado no hay referencias: identificadores asociados a valores no hay efectos laterales Recursión Funciones como tipos de datos primitivos martes 22 de febrero de 2011

4 Programación declarativa vs imperativa Programación imperativa: pasos de ejecución y estado de variables int x = x + 1; int y = y + 3; (define (cuadrado x) (* x x)) Ejemplo de estado local (no existe en programación declarativa): int function contador () { static int c = 0; } c++; return c; contador(): 1 contador(): 2 contador(): 3 martes 22 de febrero de 2011 Programación declarativa vs imperativa Programación declarativa: Dentro del ámbito de declaración de las variables x1 xn todas las ocurrencias de una expresión e que contiene únicamente las variables x1 xn tienen el mismo valor. Consecuencia: optimización. Si una expresión e aparece en varios lugares dentro de un mismo ámbito, sólo es necesario evaluarla una vez. (define (f x)...) (+ (f 2) (f 2)) (define (f x)...) (define y (f 2)) (+ y y) Una función llamada con los mismos argumentos siempre devuelve el mismo resultado martes 22 de febrero de 2011

5 Modelo de computación de sustitución Un modelo computacional es un formalismo (conjunto de reglas) que definen el funcionamiento de un programa. En los lenguajes funcionales basados en la evaluación de expresiones, el modelo computacional define cuál va a ser el resultado de evaluar una determinada expresión. El modelo de sustitución se basa en una versión simplificada de la regla de reducción del cálculo lambda. martes 22 de febrero de 2011 Modelo de computación de sustitución Reglas para evaluar una expresión e de Scheme: Si e es un valor primitivo, devolver ese mismo valor. Si e es una variable, devolver su valor asociado. Si e es una expresión del tipo (f arg1 argn), donde f el nombre de un procedimiento primitivo (+, -, ), evaluar arg1 argn y aplicar el procedimiento al resultado. Si e es una expresión del tipo (f arg1 argn), donde f es el nombre de un procedimiento compuesto (definido con un define), sustituir f por su cuerpo, reemplazando cada parámetro formal del procedimiento por el correspondiente argumento evaluado. Evaluar la expresión resultante. martes 22 de febrero de 2011

6 Ejemplo modelo de sustitución (define (double x) (+ x x)) (define (square y) (* y y)) (define (f z) (+ square (double z)) 1)) Evaluamos (f (+ 2 1)) con orden aplicativo martes 22 de febrero de 2011 Orden normal vs orden aplicativo Orden aplicativo (Scheme): se evalúan primero los argumentos, luego se sustituye Orden normal: se realizan todas las sustituciones hasta que se tiene una larga expresión formada por expresiones primitivas; se evalúa entonces Evaluamos (f (+ 2 1)) con orden normal En programación funcional el orden normal y el orden aplicativo siempre devolverán el mismo resultado martes 22 de febrero de 2011

7 Orden normal vs orden aplicativo El orden importa si no tenemos programación funcional pura: (define (zero x) (- x x)) (zero (random 10)) martes 22 de febrero de 2011 Simulación en Scheme (load "simply.scm") (load "order.scm") (def (doble x) (+ x x)) (def (cuadrado x) (* x x)) (def (f z) (+ (cuadrado (doble z)) 1)) (applic (f (+ 2 1))) (normal (f (+ 2 1))) martes 22 de febrero de 2011

8 Ejercicios Dada la función: (define (double x) (+ x x)) Evaluar la expresión (double (* 3 4)) en orden aplicativo y en orden normal. Cuál es más eficiente? Dada la función: (define (switch x a b c) (cond ((< x 0) a) ((= x 0) b) ((> x 0) c)))) Evaluar la expresión (switch -1 (+ 1 2) (+ 2 3) (+ 3 4)) en orden aplicativo y en orden normal. Cuál es más eficiente? martes 22 de febrero de 2011

9 Tema 3: Características de la programación funcional Sesión 6: El paradigma funcional (2) miércoles 23 de febrero de 2011 Referencias Capítulo SICP: [[ H-10.html#%_sec_1.1.5][The Substitution Model for Procedure Application]] Capítulo 10 PLP: Functional Languages miércoles 23 de febrero de 2011

10 Hoy veremos Programación funcional en LISP (y Scheme) miércoles 23 de febrero de 2011 Programación funcional en LISP (y Scheme) LISP (y Scheme) no es funcional puro: tiene características que van más allá de la programación declarativa/funcional Algunas características: Funciones como tipos de dato primitivos y funciones de orden superior Polimorfismo Símbolos y dualidad entre datos y programa miércoles 23 de febrero de 2011

11 Funciones como tipos de datos primitivos Las funciones son tipos primitivos en los lenguajes funcionales Un tipo primitivo es aquel que: Puede ser asignado a una variable Puede ser pasado como argumento a una función Puede ser devuelto como resultado de una invocación a una función Puede ser parte de un tipo de dato mayor miércoles 23 de febrero de 2011 Forma especial lambda La forma especial lambda es la forma de Scheme de construir funciones anónimas (sin nombre) en tiempo de ejecución Sintaxis: (lambda <arg1>... <argn>) <cuerpo>) (lambda (x) (* x x)) (lambda (x y) (+ x y)) proc proc Al evaluar lambda, se crea una función sin nombre miércoles 23 de febrero de 2011

12 Función anónima (creada con lambda) Puede ser invocada directamente: ((lambda (x) (* x x)) 3) Es un tipo de dato primitivo, como cualquier otra función miércoles 23 de febrero de 2011 Funciones como tipos de dato primitivos: función asignada a variable Función creada con define: cuadrado (define (cuadrado x)(* x x))) proc Función creada con lambda: (define cubo (lambda (x) (* x x x))) cubo proc miércoles 23 de febrero de 2011

13 Funciones como tipos de datos primitivos: función como argumento de otra función. Ejemplo 1 (define (aplica f x y) (f x y)) (aplica + 2 3) (aplica * 4 5) (aplica string-append "hola" "adios") (aplica (lambda (x y) (sqrt (+ (* x x) (* y y)))) 3 4) miércoles 23 de febrero de 2011 Funciones como tipos de datos primitivos: función como argumento de otra función. Ejemplo 2 (define (aplica-2 f g x) (f (g x))) (define (suma-5 x) (+ x 5)) (define (doble x) (+ x x)) (aplica-2 suma-5 doble 3) (aplica-2 (lambda (x) (* x 2)) (lambda (x) (+ x 10)) 5) miércoles 23 de febrero de 2011

14 Funciones como tipos de datos primitivos: función como valor devuelto por otra función (define (hacer-sumador-k k) (lambda (x) (+ x k))) hacer-sumador-k proc (define g (hacer-sumador-k 5)) (g 10) g proc miércoles 23 de febrero de 2011 Funciones de orden superior Funciones de orden superior: Son funciones que reciben otras funciones como argumento o devuelven una función como resultado Ejemplo, función map: (map cuadrado ( )) (map * (1 2 3) (4 5 6)) Otro ejemplo: map recibe como argumentos una función y tantas listas (de igual longitud) como argumentos tenga la función (define (operar f base lista) (if (null? lista) base (f (car lista) (operar f base (cdr lista))))) miércoles 23 de febrero de 2011

15 Las funciones pueden formar parte de estructuras de datos mayor Ejemplo: lista de funciones (define lista-funcs (list doble suma-5 cuadrado)) Ejemplo de utilización: (define (aplica-funcs lista-funcs x) (if (null? (cdr lista-funcs)) ((car lista-funcs) x) ((car lista-funcs) (aplica-funcs (cdr lista-funcs) x)))) (aplica-funcs lista-funcs 10) miércoles 23 de febrero de 2011 Dualidad entre datos y código Los programas en Scheme son expresiones entre paréntesis Una expresión entre paréntesis es una lista de símbolos Por tanto, los programas (sin evaluar) se pueden considerar como datos (listas) y viceversa y, por tanto, podemos construirlos, desconstruirlos, y manipularlos como las listas Ejemplo: utilizando quote y eval, vamos a sumar una lista de números (define (suma-lista lista-nums) (eval (cons '+ lista-nums))) miércoles 23 de febrero de 2011

16 Ejercicios Qué hace el siguiente código en Scheme? (lambda (f x) (f x x))) Cómo habría que invocar a la función anterior para que devuelva 20? Define una función g que podamos invocar así y devuelva 18: (g (lambda (x) (+ x x)) (lambda (y) (* y y)) 3) Define una función h que se invoque de la siguiente forma y devuelva 6: ((h (lambda (x) (+ x x))) 3) miércoles 23 de febrero de 2011

17 Tema 3: Características de la programación funcional Sesión 7: El paradigma funcional (3) martes 1 de marzo de 2011 Referencias Capítulo 10 PLP: Functional Languages martes 1 de marzo de 2011

18 Hoy veremos Características de la programación funcional en LISP/Scheme martes 1 de marzo de 2011 Características de la programación funcional Evaluación sin efectos laterales: paradigma declarativo y modelo de sustitución Funciones como tipos de datos primitivos: forma especial lambda Ámbitos de variables: forma especial let Dualidad entre datos y programas: formas especiales eval y apply Listas como elemento fundamental de procesamiento Recursión martes 1 de marzo de 2011

19 Ámbito global de variables En Scheme existe un ámbito global de las variables en el que se les da valor utilizando la forma especial define (define a "hola") (define b (string-append "adios" a)) (define cuadrado (lambda (x) (* x x))) martes 1 de marzo de 2011 Ámbito local: forma especial let En Scheme se define la forma especial let que permite crear un ámbito local en el que da valor a variables. Sintaxis: (let ((<var1> <exp-1>)... (<varn> <exp-n>)) <cuerpo>) (let ((x 2) (y 5)) (+ x y)) Las variables var1, varn toman los valores devueltos por las expresiones exp1, expn y el cuerpo se evalúa con esos valores. martes 1 de marzo de 2011

20 let mejora la legibilidad de los programas El uso de let permite abstraer operaciones y dar un nombre a los resultados, aumentando la legibilidad de los programa (define (distancia x1 y1 x2 y2) (let ((dx (- x2 x1)) (dy (- y2 y1))) (sqrt (+ (cuadrado dx) (cuadrado dy))))) martes 1 de marzo de 2011 El ámbito de las variables definidas en el let es local Las variables definidas en el let sólo tienen valores en el ámbito de la forma especial (define x 5) (let ((x 1) (y 2)) (+ x y)) x y martes 1 de marzo de 2011

21 let permite usar variables definidas en un ámbito superior Desde el ámbito definido por el let se puede usar el ámbito superior. Por ejemplo, en el siguiente código se usa la variable z definida en el ámbito superior. (define z 8) (let ((x 1) (y 2)) (+ x y z)) martes 1 de marzo de 2011 Las variables del let pueden asociarse con cualquier valor Un ejemplo en el que definimos funciones de ámbito local: area-triangulo y apotema: (define (area-hexagono lado) (let ((area-triangulo (lambda (base altura) (/ (* base altura) 2))) (apotema (lambda (lado) (* (sqrt 3) (/ lado 2)))))) (* 6 (area-triangulo lado (apotema lado)))) martes 1 de marzo de 2011

22 Variables en las asignaciones del let Las expresiones del let se evalúan todas antes de asociar ningún valor con las variables. No se realiza una asignación secuencial: (define x 1) (let ((w (+ x 3)) (z (+ w 2))) ;; Error (+ w z)) martes 1 de marzo de 2011 Semántica del let Evaluar todas las expresiones de la derecha de las variables y guardar sus valores en variables auxiliares locales. Definir un ámbito local en el que se ligan las variables del let con los valores de las variables auxiliares. Evaluar el cuerpo del let en el ámbito local martes 1 de marzo de 2011

23 Es posible implementar let utilizando lambda La semántica anterior queda clara cuando comprobamos que let se puede definir en función de lambda. La expresión: (let ((<var1> <exp1>)... (<varn> <expn>)) <cuerpo>) Se puede implementar como: ((lambda (<var1>... <varn>) <cuerpo>) <exp1>... <expn>) (define x 5) (let ((x (+ 2 3)) (y (+ x 3))) (+ x y)) ((lambda (x y) (+ x y)) (+ 2 3) (+ x 3)) martes 1 de marzo de 2011 let* permite asignaciones secuenciales La forma especial let* permite una asignación secuencial de las variables y las expresiones: (let* ((x (+ 1 2)) (y (+ x 3)) (z (+ y x))) (* x y z) Cómo se puede implementar con let? martes 1 de marzo de 2011

24 let* permite asignaciones secuenciales La forma especial let* permite una asignación secuencial de las variables y las expresiones: (let* ((x (+ 1 2)) (y (+ x 3)) (z (+ y x))) (* x y z) Cómo se puede implementar con let? (let ((x (+ 1 2))) (let ((y (+ x 3))) (let ((z (+ y x))) (* x y z)))) martes 1 de marzo de 2011 let* permite asignaciones secuenciales El primer let crea un ámbito local en el que se evalúa el segundo let, que a su vez crea otro ámbito local en el que se evalúa el tercer let. Se crean tres ámbitos locales anidados, y en el último se evalúa la expresión (* x y z). (let ((x (+ 1 2))) (let ((y (+ x 3))) (let ((z (+ y x))) (* x y z)))) martes 1 de marzo de 2011

25 El ámbito definido en el let puede sobrevivir Un ejemplo avanzado del funcionamiento del let, en el que creamos una función en el ámbito del let: (define h (let ((x 3)) (lambda (y) (+ x y)))) Sucede lo siguiente: 1. Se invoca al let y se crea un entorno local en el que x vale 3 2. En ese entorno se crea una función de un parámetro que usa la variable x 3. Se devuelve la función y se asocia a h martes 1 de marzo de 2011 El ámbito definido en el let puede sobrevivir Qué pasa cuando se llama a h? Y si modificamos el valor de x en el ámbito global? (define h (let ((x 3)) (lambda (y) (+ x y)))) (h 5) (define x 10) (h 5) Funcionamiento: cuando se llama a la función, el intérprete restaura el entorno que estaba activo cuando la expresión lambda se evaluó. Y lo aumenta con las variables de los parámetros formales ligadas al valor del argumento. En este ámbito se evalúa el cuerpo de la función. martes 1 de marzo de 2011

26 El mismo efecto sin let En el ejemplo siguiente la llamada (make-sumador 3) produce exactamente el mismo efecto que el let anterior. (define (make-sumador x) (lambda (y) (+ x y))) (define h (make-sumador 3)) (define x 10) (h 5) martes 1 de marzo de 2011 El ámbito definido en el let puede sobrevivir Importante: Seguimos estando en el paradigma de programación funcional declarativa en el que no hay efectos laterales. El modelo de sustitución no explica correctamente este comportamiento. Veremos más adelante el modelo de entornos que sí lo hace. Llamamos entorno (environment) a un conjunto de valores asociados a variables. Utilizamos las palabras ámbito y entorno como sinónimos. martes 1 de marzo de 2011

27 Closure En muchos lenguajes de programación modernos existe el concepto de closure Se llama closure a una función creada en tiempo de ejecución junto con el entorno en el que ésta se ha creado Lo veremos en profundidad más adelante martes 1 de marzo de 2011 Dualidad entre datos y programas Los programas en Scheme son expresiones entre paréntesis Una expresión es una lista de símbolos Esto permite tratar a los programas como datos y viceversa La forma especial eval evalúa una expresión Un ejemplo: supongamos que queremos sumar una lista de números (define (suma-lista lista-nums) (eval (cons '+ lista-nums))) martes 1 de marzo de 2011

28 Forma especial apply Permite llamar a una función con una lista de argumentos Sintaxis: (apply <func> <lista-args>) Ejemplos: (apply + '( )) (apply '+ '( )) ; no funciona: '+ es un identificador (apply (lambda (x y) (* x y)) '(2 4)) martes 1 de marzo de 2011 Ejemplo de dualidad de datos y programa calculadora (define (calculadora) (display "Introduce parámetros entre paréntesis: ") (define params (read)) (display "Introduce cuerpo:") (define cuerpo (read)) (define func (eval (append '(lambda) (list params) (list cuerpo)))) (display "Introduce argumentos entre paréntesis: ") (define args (read)) (apply func args)) Este programa no es funcional: realiza pasos de ejecución para leer las expresiones introducidas por el usuario y para imprimir el resultado de su evaluación. martes 1 de marzo de 2011

29 Ejemplo avanzado (define (rep-loop) (display "mi-interprete> ") ; imprime un prompt (let ((expr (read))) ; lee una expresión (cond ((eq? expr 'adios) ; el usuario quiere parar? (display "saliendo del bucle read-eval-print") (newline)) (else ; en otro caso (write (eval expr)) ; evaluar e imprimir (newline) (rep-loop))))) martes 1 de marzo de 2011

30 Tema 3: Características de la programación funcional Sesión 8: El paradigma funcional (4) Referencias Capítulo 10 PLP: Functional Languages Capítulo 2.2 SICP, Abelson & Sussman

31 Hoy veremos Características de la programación funcional en LISP/Scheme Características de la programación funcional Evaluación sin efectos laterales: paradigma declarativo y modelo de sustitución Funciones como tipos de datos primitivos: forma especial lambda Ámbitos de variables: forma especial let Dualidad entre datos y programas: formas especiales eval y apply Listas como elemento fundamental de procesamiento: parejas, cons, car y cdr Recursión

32 Ejemplo de dualidad de datos y programa calculadora (define (calculadora) (display "Introduce parámetros entre paréntesis: ") (define params (read)) (display "Introduce cuerpo:") (define cuerpo (read)) (define func (eval (append '(lambda) (list params) (list cuerpo)))) (display "Introduce argumentos entre paréntesis: ") (define args (read)) (apply func args)) Este programa no es funcional: realiza pasos de ejecución para leer las expresiones introducidas por el usuario y para imprimir el resultado de su evaluación. Ejemplo de dualidad de datos y programa calculadora Es importante darse cuenta de que la expresión: (append '(lambda) (list params) (list cuerpo)) devuelve una lista que es una expresión lambda correcta, cuya evaluación va a crear un procedimiento al que se llama después. Por ejemplo: (define params '(x y)) (define cuerpo '(+ x y)) Si hiciéramos (append '(lambda) params cuerpo) qué obtendríamos?

33 Ejemplo de dualidad de datos y programa calculadora Es importante darse cuenta de que la expresión: (append '(lambda) (list params) (list cuerpo)) devuelve una lista que es una expresión lambda correcta, cuya evaluación va a crear un procedimiento al que se llama después. Por ejemplo: (define params '(x y)) (define cuerpo '(+ x y)) Si hiciéramos (append '(lambda) params cuerpo) obtendríamos una lista con 6 elementos: (append '(lambda) params cuerpo) -> (lambda x y + x y) Necesitamos obtener la lista '(lambda (x y) (+ x y)), una lista de 3 elementos Datos compuestos en Scheme En Scheme es posible crear datos compuestos. La forma de hacerlo es definiendo una construcción muy simple y usando esa construcción simple para hacer cosas más complicadas. El tipo de dato compuesto más simple es la pareja: una entidad formada por dos elementos. Se utiliza la función cons para construirla. (cons 1 2) (1. 2)

34 Diagramas caja y puntero Las parejas se representan mediante este tipo de figuras (cons 1 2) (1. 2) Funciones de acceso a una pareja Podemos obtener el elemento correspondiente a la parte izquierda con el operador car y su parte derecha con el operador cdr (define c (cons 1 2)) > (car c) 1 > (cdr c) 2 Definición declarativa: Las funciones cons, car y cdr quedan perfectamente definidas con las siguientes ecuaciones (car (cons x y)) = x (cdr (cons x y)) = y

35 Nota histórica De dónde vienen los nombres car y cdr? Realmente los nombres eran CAR y CDR (en mayúsculas) La historia se remonta al año 1959, en los orígenes del LISP y tiene que ver con el nombre que se les daba a ciertos registros de la memoria del IBM 709. Explicación completa: Las parejas pueden contener cualquier tipo de dato > (define c (cons 'hola #f)) > (car c) 'hola > (cdr c) #f

36 Las parejas pueden contener cualquier tipo de dato > (define c (cons 'hola #f)) > (car c) 'hola > (cdr c) #f (define p1 (cons (lambda (x) (+ x 3)) 5)) Cómo se podría llamar a la función de la parte izquierda de la pareja con la parte derecha como argumento? Las parejas pueden contener cualquier tipo de dato > (define c (cons 'hola #f)) > (car c) 'hola > (cdr c) #f (define p1 (cons (lambda (x) (+ x 3)) 5)) Cómo se podría llamar a la función de la parte izquierda de la pareja con la parte derecha como argumento? ((car p1) (cdr p1)) -> 8

37 Seguimos en el paradigma funcional Seguimos en el paradigma funcional Una vez creada una pareja no es posible modificar sus contenidos. Aunque Scheme tiene primitivas para modificar el contenido de las parejas. Las parejas son un tipo de dato de primer orden Una pareja es también un tipo de datos de primer orden: puede pasarse como argumento y devolverse como resultado de una función. > (define (doble-car pareja) (* 2 (car pareja))) > (doble-car (cons 4 2)) 8 > (define (doble-pareja pareja) (cons (doble-car pareja) (doble-cdr pareja))) > (doble-pareja (cons 2 3)) (4. 6)

38 Propiedad de clausura: parejas de parejas Las parejas pueden formar parte de otras parejas. Esta última propiedad se denomina clausura de la operación cons. El resultado de un cons puede usarse para construir otras parejas. Ejemplo: (define p1 (cons 1 2)) (define p2 (cons 3 4)) (define p (cons p1 p2)) Expresión equivalente: (define p (cons (cons 1 2) (cons 3 4))) Ejemplo (define p (cons (cons 1 (cons 3 4)) 2)) Qué figura representa la estructura anterior?

39 Funciones c????r > (car (cdr (car p))) 3 Es equivalente a: > (cadar p))) 3 El nombre de la función se obtiene concatenando a la letra "c", las letras "a" o "d" según hagamos un car o un cdr y terminando con la letra "r" Hay definidas 2^4 funciones de este tipo: caaaar, caaadr,, cddddr. Función pair? La función pair? nos dice si un objeto es atómico o es una pareja > (pair? 3) #f >(pair? (cons 3 4)) #t >(not (pair? (cons 2 3))) #f

40 Repaso de listas (list ) '( ) (define hola 1) (define que 2) (define tal 3) (list hola que tal) '(hola que tal) (define a '(1 2 3)) (car a) (cdr a) (length a) (length '()) (append '(1) '(2 3 4) '(5 6 7) '()) Construcción de listas con parejas Definición recursiva con parejas: Una pareja en la que el primer elemento es un dato y el segundo el resto de la lista. Un símbolo especial '() que denota la lista vacía Ejemplo: (cons 1 (cons 2 (cons 3 '())))

41 Lista vacía No es un símbolo No es una pareja Es una lista > (symbol? '()) #f > (pair? '()) #f > (length '()) 0 Funciones list? y null? Nos permite comprobar si un dato es una lista > (list? '(1 2 3)) #t > (list? '()) #t > (list? 2) #f Para comprobar si una lista está vacía utilizamos la función null? > (null? '()) #t

42 car y cdr para recorrer listas Ahora se entiende mejor por qué las funciones que permiten recorrer una lista son car y cdr como en el siguiente ejemplo: (define lista (cons 1 (cons 2 (cons 3 (cons 4 '()))))) (car lista) (cdr lista) cons para formar una nueva lista > (define l1 '( )) > (cons 'hola l1) (hola )

43 Ejercicio resuelto Define el procedimiento (insertar-list lista l2 n) que reciba dos listas y un número n. Deberá insertar en el mismo nivel, la l2 en la lista en la posición indicada por n (suponemos que n nunca será mayor que la longitud de la lista): > (define (insertar-list lista l2 n) (if (= n 0) (append l2 lista) (cons (car lista) (insertar-list (cdr lista) l2 (- n 1))))) > (insertar-list '( ) '(a b) 3) (1 2 3 a b 4) Ejercicios Dibuja el diagrama caja y puntero asociado a estas estructuras de datos: ((x) y z) (x (y z)) ((a) b (c ())) Dibuja el diagrama caja y puntero asociado a esta estructura de datos: (cons (cons 2 (cons 3 (cons 4 ()))) (cons 1 2)) Implementa la función mi-lis-ref que reciba un número n y una lista como argumento y devuelva el elemento n-ésimo de la lista (empezando a contar en 0). Implementa la función mi-list-tail que reciba un número n y una lista como argumento y devuelva la lista resultante de quitar n elementos de la lista original

44 list devuelve la primera pareja de la lista La construcción de una lista devuelve la primera pareja de la misma. Así, tras evaluar la expresión: (define lista (list 1 2 3)) La variable lista tomará el valor de la primera pareja de la lista, la pareja formada por un 1 y el resto de la lista. Es lo mismo que cuando hacemos: (define lista (cons 1 (cons 2 (cons 3 '())))) cons para formar una nueva lista > (define l1 '( )) > (cons 'hola l1) (hola ) martes 8 de marzo de 2011 Scheme muestra las estructuras compuestas como listas Cuando Scheme imprime una estructura compuesta por parejas, va recorriendo la estructura intentando escribirla como una lista. Por ejemplo: > (cons 1 (cons 2 (cons 3 '()))) (1 2 3) >(cons 1 (cons 2 3)) (1 2. 3) Esta última estructura no es una lista martes 8 de marzo de 2011

45 Listas con elementos compuestos Las listas pueden contener cualquier tipo de elementos, incluyendo otras parejas. La siguiente estructura se denomina lista de asociación: una lista cuyos elementos son parejas: (list (cons 'a 1) (cons 'b 2) (cons 'c 3)) -> ((a.1)(b.2)(c.2)) Cuál sería el diagrama de la lista anterior? La expresión equivalente utilizando parejas: martes 8 de marzo de 2011 Listas con elementos compuestos Las listas pueden contener cualquier tipo de elementos, incluyendo otras parejas. La siguiente estructura se denomina lista de asociación: una lista cuyos elementos son parejas: (list (cons 'a 1) (cons 'b 2) (cons 'c 3)) -> ((a.1)(b.2)(c.2)) Cuál sería el diagrama de la lista anterior? La expresión equivalente utilizando parejas: (cons (cons 'a 1) (cons (cons 'b 2) (cons (cons 'c 3) '()))) martes 8 de marzo de 2011

46 Listas de listas Las listas, al igual que las parejas, pueden contener cualquier tipo de dato, incluso otras listas: (define l1 (list 1 2 3)) (define l2 (list 1 l1 2 3)) La lista anterior también la podemos definir con quote: (define l2 '(1 (1 2 3) 2 3)) Cuál sería su representación con parejas? Y su diagrama caja y puntero? martes 8 de marzo de 2011 Implementación de funciones sobre listas Implementa la función mi-append que reciba dos listas como argumento y devuelva una nueva lista compuesta por la concatenación de las dos listas recibidas. martes 8 de marzo de 2011

47 Implementación de funciones sobre listas Implementa la función mi-append que reciba dos listas como argumento y devuelva una nueva lista compuesta por la concatenación de las dos listas recibidas. (define (mi-append l1 l2) (if (null? l1) l2 (cons (car l1) (mi-append (cdr l1) l2)))) martes 8 de marzo de 2011 Implementación de funciones sobre listas Implementa la función mi-length que reciba una lista como argumento y devuelva el número de elementos que contiene (en el primer nivel). > (mi-length '(1 2 3 (4 5 6))) 4 martes 8 de marzo de 2011

48 Implementación de funciones sobre listas Implementa la función mi-length que reciba una lista como argumento y devuelva el número de elementos que contiene (en el primer nivel). > (mi-length '(1 2 3 (4 5 6))) 4 (define (mi-length items) (if (null? items) 0 (+ 1 (mi-length (cdr items))))) martes 8 de marzo de 2011 Los datos compuestos pueden ser funciones Definimos la función mi-cons como: (define (mi-cons x y) (lambda (m) (cond ((equal? m 'car) x) ((equal? m 'cdr) y) (else (error "mensaje no definido: " m)) ))) La función anterior es equivalente a la función cons de Scheme. Se devuelve un procedimiento que admite un argumento m (mensaje). Cuando al procedimiento se le pasa el mensaje 'car devolverá el argumento x original de mi-cons y cuando se le pasa el mensaje 'cdr devolverá el argumento y martes 8 de marzo de 2011

49 Los datos compuestos pueden ser funciones Definimos la función mi-cons como: (define (mi-cons x y) (lambda (m) (cond ((equal? m 'car) x) ((equal? m 'cdr) y) (else (error "mensaje no definido: " m)) ))) Cómo la utilizamos? Pensad en un ejemplo martes 8 de marzo de 2011 Los datos compuestos pueden ser funciones Definimos la función mi-cons como: (define (mi-cons x y) (lambda (m) (cond ((equal? m 'car) x) ((equal? m 'cdr) y) (else (error "mensaje no definido: " m)) ))) Cómo la utilizamos? Pensad en un ejemplo > (define p (mi-cons 'hola #f)) > (p 'car) hola > (p 'cdr) #f martes 8 de marzo de 2011

50 Los datos compuestos pueden ser funciones Definimos la función mi-cons como: (define (mi-cons x y) Funciones (lambda (m) (cond ((equal? m 'car) x) ((equal? m 'cdr) y) (else (error "mensaje no definido: " m)) ))) Funciones que encapsulan la llamada a la función: Ahora no hay ninguna diferencia entre el comportamiento de las funciones originales y el de las nuestras martes 8 de marzo de 2011 Los datos compuestos pueden ser funciones Definimos la función mi-cons como: (define (mi-cons x y) Funciones (lambda (m) (cond ((equal? m 'car) x) ((equal? m 'cdr) y) (else (error "mensaje no definido: " m)) ))) Funciones que encapsulan la llamada a la función: (define (mi-car pareja) (pareja 'car)) (define (mi-cdr pareja) (pareja 'cdr)) Ahora no hay ninguna diferencia entre el comportamiento de las funciones originales y el de las nuestras martes 8 de marzo de 2011

51 Los datos compuestos pueden ser funciones Definimos la función mi-cons como: (define (mi-cons x y) Funciones (lambda (m) (cond ((equal? m 'car) x) ((equal? m 'cdr) y) (else (error "mensaje no definido: " m)) ))) Funciones que encapsulan la llamada a la función: (define (mi-car pareja) (pareja 'car)) (define (mi-cdr pareja) (pareja 'cdr)) (define p (mi-cons (mi-cons 1 (mi-cons 3 4)) 2)) > (mi-car (mi-cdr (mi-car p))) 3 Ahora no hay ninguna diferencia entre el comportamiento de las funciones originales y el de las nuestras martes 8 de marzo de 2011

Tema 3: Características de la programación funcional. Sesión 5: El paradigma funcional (1)

Tema 3: Características de la programación funcional. Sesión 5: El paradigma funcional (1) Tema 3: Características de la programación funcional Sesión 5: El paradigma funcional (1) Referencias Capítulo 1.1.5 SICP: [[http://mitpress.mit.edu/sicp/full-text/book/book-z- H-10.html#%_sec_1.1.5][The

Más detalles

Tema 3: Características de la programación funcional. Sesión 6: El paradigma funcional (2)

Tema 3: Características de la programación funcional. Sesión 6: El paradigma funcional (2) Tema 3: Características de la programación funcional Sesión 6: El paradigma funcional (2) Referencias Capítulo 1.1.5 SICP: [[http://mitpress.mit.edu/sicp/full-text/book/book-z- H-10.html#%_sec_1.1.5][The

Más detalles

Tema 4: Programación funcional avanzada en Scheme

Tema 4: Programación funcional avanzada en Scheme Tema 4: Programación funcional avanzada en Scheme Índice 1 Let... 2 2 Let*... 5 3 Letrec... 5 4 Quote...6 5 Eval... 7 6 Datos compuestos: parejas...8 7 Los datos compuestos pueden ser funciones...11 8

Más detalles

Tema 3: Programación funcional

Tema 3: Programación funcional Tema 3: Programación funcional Contenidos 5. Funciones como tipos de datos de primera clase 5.1. Forma especial lambda 5.2. Las funciones son objetos de primera clase 5.3. Funciones de orden superior 6.

Más detalles

Aplicación de la Inducción Matemática Programación Funcional. Julio Ariel Hurtado Alegría Departamento de Sistemas Universidad del Cauca

Aplicación de la Inducción Matemática Programación Funcional. Julio Ariel Hurtado Alegría Departamento de Sistemas Universidad del Cauca Aplicación de la Inducción Matemática Programación Funcional Julio Ariel Hurtado Alegría Departamento de Sistemas Universidad del Cauca Motivación Programación Imperativa Declarativa Procedimental Ejemplo:

Más detalles

CAPÍTULO IV: 4.1 Introducción a la. Programación Funcional

CAPÍTULO IV: 4.1 Introducción a la. Programación Funcional CAPÍTULO IV: Programación Funcional 4.1 Introducción a la Programación Funcional 1 Programación Funcional Paradigma diferente a los imperativos, que se aleja de la máquina de von Neumann Basado en funciones

Más detalles

GUÍA BÁSICA DE SCHEME v.4

GUÍA BÁSICA DE SCHEME v.4 Esta guía básica pretende ser una introducción elemental al lenguaje de programación Scheme. Se presenta como una guía de comienzo rápido de tal forma que permita conocer de una forma muy esquemática los

Más detalles

Tema 6: Estructuras de datos recursivas

Tema 6: Estructuras de datos recursivas Tema 6: Estructuras de datos recursivas Índice 1 Listas jerárquicas...2 2 Árboles binarios... 4 3 Árboles genéricos...7 4 Referencias...10 1. Listas jerárquicas Las listas tienen la propiedad de la clausura

Más detalles

Tema 2: Introducción a Scheme. Sesión 4: Introducción a Scheme (2)

Tema 2: Introducción a Scheme. Sesión 4: Introducción a Scheme (2) Tema 2: Introducción a Scheme Sesión 4: Introducción a Scheme (2) Referencias DrRacket (http://racket-lang.org/) A brief tour of DrScheme (http://www.plt-scheme.org/software/drscheme/ tour/) Structure

Más detalles

Lenguajes de Programación Programación funcional

Lenguajes de Programación Programación funcional Lenguajes de Programación Programación funcional Roberto Bonvallet Departamento de Informática Universidad Técnica Federico Santa María Concepto de función En el paradigma imperativo: Una función es una

Más detalles

Tema 9: Asignación, estado local y modelo de entornos

Tema 9: Asignación, estado local y modelo de entornos Tema 9: Asignación, estado local y modelo de entornos Índice 1 Programación imperativa... 2 2 Formas especiales set!...3 3 La forma especial begin... 3 4 Entornos... 4 5 El modelo de computación de Scheme

Más detalles

Tema 2: Características de la programación funcional

Tema 2: Características de la programación funcional Tema 2: Características de la programación funcional Índice 1 Aproximación teórica a la programación funcional...2 1.1 Programación declarativa... 2 1.2 El Lisp y el paradigma funcional...4 1.3 El cálculo

Más detalles

Tema 3: Programación funcional

Tema 3: Programación funcional Tema 3: Programación funcional Contenidos 1. El paradigma de Programación Funcional 1.1 Definición y orígenes del paradigma funcional 1.2. Programación declarativa 1.3. Valores y referencias 1.4. Modelo

Más detalles

Tema 3: Programación funcional (1/3)

Tema 3: Programación funcional (1/3) Tema 3: Programación funcional (1/3) Hoy: 1. El paradigma de programación funcional Historia de la PF Características fundamentales El renacimiento de la PF 2. Modelos de evaluación de expresiones en PF

Más detalles

Tema 10: Tipos de datos mutables

Tema 10: Tipos de datos mutables Índice 1 Introducción... 2 2 Primitivas set-car! y set-cdr!...2 2.1 Como implementar cons, set-car! y set-cdr!...3 3 Mutación... 3 4 Igualdad...6 5 TADs con datos mutables... 9 5.1 Lista ordenada... 9

Más detalles

Tema 9: Asignación, estado local y modelo de entornos

Tema 9: Asignación, estado local y modelo de entornos Tema 9: Asignación, estado local y modelo de entornos Índice 1 Programación imperativa... 2 2 Formas especiales set!...3 3 Entornos... 3 4 Estado local...8 4.1 Ejemplo 1: contador global... 8 4.2 Ejemplo

Más detalles

4.3 Recursión en Scheme. Recursión simple y asignación

4.3 Recursión en Scheme. Recursión simple y asignación 4.3 Recursión en Scheme Recursión simple y asignación Recursión Simple Un procedimiento recursivo es aquel se aplica a si mismo. Ejemplo: (define length (lambda (ls (if (null? ls 0 (+ 1 (length (cdr ls

Más detalles

4.3 Recursión en Scheme

4.3 Recursión en Scheme 4.3 Recursión en Scheme Recursión simple y asignación Recursión Simple Un procedimiento recursivo es aquel se aplica a si mismo. Ejemplo: (define length (lambda (ls (if (null? ls 0 (+ 1 (length (cdr ls

Más detalles

Tema 7: Programación imperativa. Sesión 23: Programación imperativa (4)

Tema 7: Programación imperativa. Sesión 23: Programación imperativa (4) Tema 7: Programación imperativa Sesión 23: Programación imperativa (4) Indice Historia de la programación imperativa Características principales Datos mutables en Scheme y en Scala Estructuras de control

Más detalles

Programación Declarativa

Programación Declarativa Programación Declarativa Tema 2: LISP (SCHEME) 2 Tema 2: LISP (SCHEME) Introducción Representación de Datos Definición de Funciones Predicados Listas 3 Introducción (I) SCHEME es un dialecto de LISP (LISt

Más detalles

Tema 3. Listas Recursión sobre datos

Tema 3. Listas Recursión sobre datos Tema 3 Listas Recursión sobre datos José A. Alonso M. José Hidalgo Álvaro Romero Dpto. Ciencias de la Computación e Inteligencia Artificial UNIVERSIDAD DE SEVILLA Informática ListasRecursión sobre datos

Más detalles

Tema 7: Macros. Índice. 1 Introducción Conceptos previos Macros en Scheme Más ejemplos de macros Referencias...

Tema 7: Macros. Índice. 1 Introducción Conceptos previos Macros en Scheme Más ejemplos de macros Referencias... Índice 1 Introducción... 2 2 Conceptos previos...2 3 Macros en Scheme... 7 4 Más ejemplos de macros...10 5 Referencias...13 1. Introducción El primer párrafo del Revised5 Report on the Algorithmic Language

Más detalles

Programación Funcional Lisp-Scheme

Programación Funcional Lisp-Scheme Programación Funcional Lisp-Scheme Dr. Oldemar Rodríguez Rojas Escuela de Informática Universidad de Nacional Dónde bajar? Lisp (EdScheme): www.schemers.com com Ejemplo: => (+ (* 3(+ (* 24) (+ 35))) (+

Más detalles

4.7 Operaciones sobre Objetos en Scheme

4.7 Operaciones sobre Objetos en Scheme 4.7 Operaciones sobre Objetos en Scheme Equivalencias y predicados de tipos, listas, números, caracteres, strings y vectores Ejemplos de Equivalencia (eq? a a) ;=> #t (eq? 3.1 3.1) ;=> () (eq? (cons a

Más detalles

4.7 Operaciones sobre Objetos en Scheme. Equivalencias y predicados de tipos, listas, números, caracteres, strings y vectores

4.7 Operaciones sobre Objetos en Scheme. Equivalencias y predicados de tipos, listas, números, caracteres, strings y vectores 4.7 Operaciones sobre Objetos en Scheme Equivalencias y predicados de tipos, listas, números, caracteres, strings y vectores a) Equivalencias (eq? obj 1 obj 2 ) retorno: #t si son idénticos (eqv? obj 1

Más detalles

Programación Funcional Lisp-DrScheme Primera Parte. Dr. Oldemar Rodríguez Rojas Escuela de Informática Universidad de Nacional

Programación Funcional Lisp-DrScheme Primera Parte. Dr. Oldemar Rodríguez Rojas Escuela de Informática Universidad de Nacional Programación Funcional Lisp-DrScheme Primera Parte Dr. Oldemar Rodríguez Rojas Escuela de Informática Universidad de Nacional Programación Funcional! La programación funcional es un paradigma de programación

Más detalles

UNIDAD IV Programación Funcional. Lic. Jesús Germán Andrés PAUTSCH - FCEQyN - UNaM

UNIDAD IV Programación Funcional. Lic. Jesús Germán Andrés PAUTSCH - FCEQyN - UNaM UNIDAD IV Programación Funcional Porqué? 2 Introducción Porque aprender programación funcional? - Recursión - Abstracción funcional - Funciones de primer orden Estos conceptos se han incorporado en la

Más detalles

Tema 4.- Recursión e iteración

Tema 4.- Recursión e iteración UNIVERSIDAD DE CÓRDOBA ESCUELA POLITÉCNICA SUPERIOR DE CÓRDOBA DEPARTAMENTO DE INFORMÁTICA Y ANÁLISIS NUMÉRICO PROGRAMACIÓN DECLARATIVA INGENIERÍA INFORMÁTICA ESPECIALIDAD DE COMPUTACIÓN CUARTO CURSO PRIMER

Más detalles

Tema 2.- Expresiones y funciones

Tema 2.- Expresiones y funciones UNIVERSIDAD DE CÓRDOBA ESCUELA POLITÉCNICA SUPERIOR DE CÓRDOBA DEPARTAMENTO DE INFORMÁTICA Y ANÁLISIS NUMÉRICO PROGRAMACIÓN DECLARATIVA INGENIERÍA INFORMÁTICA ESPECIALIDAD DE COMPUTACIÓN CUARTO CURSO PRIMER

Más detalles

PROGRAMACIÓN DECLARATIVA

PROGRAMACIÓN DECLARATIVA UNIVERSIDAD DE CÓRDOBA ESCUELA POLITÉCNICA SUPERIOR DE CÓRDOBA DEPARTAMENTO DE INFORMÁTICA Y ANÁLISIS NUMÉRICO PROGRAMACIÓN DECLARATIVA INGENIERÍA INFORMÁTICA CUARTO CURSO PRIMER CUATRIMESTRE Tema 5.-

Más detalles

Tema 3.- Predicados y sentencias condicionales

Tema 3.- Predicados y sentencias condicionales UNIVERSIDAD DE CÓRDOBA ESCUELA POLITÉCNICA SUPERIOR DE CÓRDOBA DEPARTAMENTO DE INFORMÁTICA Y ANÁLISIS NUMÉRICO PROGRAMACIÓN DECLARATIVA INGENIERÍA INFORMÁTICA ESPECIALIDAD DE COMPUTACIÓN CUARTO CURSO PRIMER

Más detalles

4.5 Ligado de Variables en Scheme

4.5 Ligado de Variables en Scheme 4.5 Ligado de Variables en Scheme Referencia a variables, lambda, formas let y asignación a) Referencia a una Variable variable retorno: valor de la variable Cualquier identificador no citada en una expresión

Más detalles

Programación Funcional en LISP Lógica para Ciencias de la Computación

Programación Funcional en LISP Lógica para Ciencias de la Computación Programación Funcional en LISP Lógica para Ciencias de la Computación Primer Cuatrimestre de 2009 Material Adicional Introducción A lo largo de la carrera estudiaremos diversos paradigmas de programación:

Más detalles

Tema 5: Macros. Sesión 14: Macros

Tema 5: Macros. Sesión 14: Macros Tema 5: Macros Sesión 14: Macros Hoy veremos... Conceptos generales Quasiquotation Macros en Scheme Ejemplos de macros Referencias Capítulo 3.7 Programming Language Pragmatics: Macro Expansion Definición

Más detalles

Funciones como parámetros, funciones como resultados. Introducción a la Computación Patricia Borensztejn Clase 26

Funciones como parámetros, funciones como resultados. Introducción a la Computación Patricia Borensztejn Clase 26 Funciones como parámetros, funciones como resultados Introducción a la Computación Patricia Borensztejn Clase 26 Funciones de orden superior Se llama así a la técnica que permite pasar funciones como parámetros

Más detalles

Clase 1 de prácticas: Introducción a Scheme

Clase 1 de prácticas: Introducción a Scheme Clase 1 de prácticas: Introducción a Scheme Índice 1 Ejercicio 1... 2 2 Ejercicio 2... 2 3 Ejercicio 3... 2 4 Ejercicio 4... 3 5 Ejercicio 5... 3 6 Ejercicio 6... 4 7 Ejercicio 7 (ampliación)...4 8 Ejercicio

Más detalles

Tipos algebraicos y abstractos. Algoritmos y Estructuras de Datos I. Tipos algebraicos

Tipos algebraicos y abstractos. Algoritmos y Estructuras de Datos I. Tipos algebraicos Algoritmos y Estructuras de Datos I 1 cuatrimestre de 009 Departamento de Computación - FCEyN - UBA Programación funcional - clase Tipos algebraicos Tipos algebraicos y abstractos ya vimos los tipos básicos

Más detalles

Abstracción de procedimientos

Abstracción de procedimientos Abstracción de procedimientos 1.- Consideremos ABN (árboles binarios numéricos) sin nodos repetidos. Denimos los siguientes conceptos: Se pide: Dados dos ABN, A y B, decimos que B es SUBARBOL PRINCIPAL

Más detalles

Intérpretes. Intérpretes. Intérpretes. Intérpretes. Lenguajes de definición y definido. Valores expresados y denotados

Intérpretes. Intérpretes. Intérpretes. Intérpretes. Lenguajes de definición y definido. Valores expresados y denotados Toman la sintaxis abstracta (parsed) de un programa Producen el valor de la expresión La especificación del interprete corresponde a la semántica del lenguaje de programación Intérprete básico: literales

Más detalles

CLIPS Definición de funciones

CLIPS Definición de funciones CLIPS Definición de funciones Por función consideramos tanto las funciones predefinidas en CLIPS como las definidas por el usuario en este lenguaje, o las definidas en un lenguaje externo (C, FORTRAN o

Más detalles

Procedimientos y Recursividad

Procedimientos y Recursividad Capítulo 2 Procedimientos y Recursividad 2.1 Introducción Es muy fácil definir un procedimiento en Scheme. El lenguaje proporciona una forma elegante de hacerlo, basada en el cálculo lambda de Alonzo Church

Más detalles

Procedimientos Definidos Localmente

Procedimientos Definidos Localmente Capítulo 5 Procedimientos Definidos Localmente 5.1 Distinguiendo entre definiciones globales ylocales Todas las primitivas (o procedimientos) disponibles en Scheme (p.ej., car, cons, cdr, etc.) se definen

Más detalles

Inducción, Recursión y Alcance. Inducción, Recursión y alcance. Inducción, Recursión y Alcance. Inducción, Recursión y Alcance

Inducción, Recursión y Alcance. Inducción, Recursión y alcance. Inducción, Recursión y Alcance. Inducción, Recursión y Alcance Inducción, Recursión y alcance Especificación inductiva de tipos de datos Tipo de datos: Conjunto de valores Conjunto de operaciones sobre dichos valores ejemplo: Sea S el conjunto más pequeño tal que:

Más detalles

Unidad Didáctica 3. Tipos genéricos. Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos

Unidad Didáctica 3. Tipos genéricos. Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Unidad Didáctica 3 Tipos genéricos Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Definición de tipo genérico Hablamos de un tipo genérico cuando el tipo en cuestión depende

Más detalles

Lenguajes de programación. Algoritmos y Estructuras de Datos I. Lenguajes compilados. Lenguajes compilados

Lenguajes de programación. Algoritmos y Estructuras de Datos I. Lenguajes compilados. Lenguajes compilados Lenguajes de programación Algoritmos y Estructuras de Datos I Primer cuatrimestre de 2014 Departamento de Computación - FCEyN - UBA Teórica - clase 3 Introducción a la programación imperativa Las computadoras

Más detalles

Tema 6: Programación funcional en Scala. Sesión 18: Programación funcional en Scala

Tema 6: Programación funcional en Scala. Sesión 18: Programación funcional en Scala Tema 6: Programación funcional en Scala Sesión 18: Programación funcional en Scala Referencias Programming in Scala. Martin Odersky, Lex Spoon, Bil Venners. Ed. Artima. Programming Scala. Dean Wampler,

Más detalles

Tema 5.- Tipos de datos compuestos

Tema 5.- Tipos de datos compuestos UNIVERSIDAD DE CÓRDOBA ESCUELA POLITÉCNICA SUPERIOR DE CÓRDOBA DEPARTAMENTO DE INFORMÁTICA Y ANÁLISIS NUMÉRICO PROGRAMAC CIÓN DECLARATIVA INGENIERÍA INFORMÁTICA ESPECIALIDAD DE COMPUTACIÓN CUARTO CURSO

Más detalles

Manual de Lisp para IACS (Curso 91 92)

Manual de Lisp para IACS (Curso 91 92) Dpto. de Álgebra, Computación, Geometría y Topología Universidad de Sevilla Manual de Lisp para IACS (Curso 91 92) Sevilla, 1992 Contenido 1 Introducción 1 1.1 Introducción............................

Más detalles

Práctica 5.- Recursividad

Práctica 5.- Recursividad Benemérita Universidad Autónoma de Puebla Facultad de Ciencias de la Computación Programación Avanzada en Java Prim. 2009 Práctica 5.- Recursividad Datos de la práctica Fecha 6 de marzo de 2009 Conceptos

Más detalles

Abstracción Sintáctica y Abstracción de Datos

Abstracción Sintáctica y Abstracción de Datos Abstracción Sintáctica y Abstracción de Datos Abstracción Sintáctica y de Datos (2) Abstracción de datos De las representaciones procedurales a las representaciones estructuradas (Data Structure Representations

Más detalles

Algoritmos y programas. Algoritmos y Estructuras de Datos I

Algoritmos y programas. Algoritmos y Estructuras de Datos I Algoritmos y programas Algoritmos y Estructuras de Datos I Primer cuatrimestre de 2012 Departamento de Computación - FCEyN - UBA Programación funcional - clase 1 Funciones Simples - Recursión - Tipos de

Más detalles

El lenguaje LISP. LISP is an easy language to learn (Henry et.al., 1984) Introducción

El lenguaje LISP. LISP is an easy language to learn (Henry et.al., 1984) Introducción El lenguaje LISP LISP is an easy language to learn (Henry et.al., 1984) 1 Introducción Origen: 1958 John McCarthy, pionero en IA, empezó a trabajar con la primera implementación de Lisp en 1958.»McCarthy,

Más detalles

El lenguaje LISP. LISP is an easy language to learn

El lenguaje LISP. LISP is an easy language to learn El lenguaje LISP LISP is an easy language to learn (Henry et.al., 1984) 1 Origen: 1958 Introducción John McCarthy, pionero en IA, empezó a trabajar con la primera implementación de Lisp en 1958.» McCarthy,

Más detalles

Laboratorio Análisis Lógico Práctica 1

Laboratorio Análisis Lógico Práctica 1 Laboratorio Análisis Lógico Práctica 1 Pedro Arturo Góngora Luna 1 1 Introducción 1.1 Haskell y la programación funcional En la década de los 30 s, Alonzo Church desarrolló un lenguaje formal llamado cálculo

Más detalles

Entendiendo expresiones lambda en C# con Mono

Entendiendo expresiones lambda en C# con Mono Entendiendo expresiones lambda en C# con Mono Martín O. Márquez Introducción La programación imperativa es uno de los paradigmas de computación más ampliamente utilizados por la mayoría

Más detalles

Para entender la recursividad primero tenemos que entender la recursividad

Para entender la recursividad primero tenemos que entender la recursividad Para entender la recursividad primero tenemos que entender la recursividad Funcional Clase 1 Matias Reparaz, Agustín Nieto Departamento de Computación, FCEyN,Universidad de Buenos Aires. 20 de Septiembre

Más detalles

Funciones Segunda parte

Funciones Segunda parte Expresiones condicionales Matemática Discreta usando el computador 2011 Funciones Segunda parte Una expresión condicional utiliza una expresión de tipo Bool para decidir entre dos opciones Estructura if...then...

Más detalles

Resumen de LISP. Javier Gil Julio, 2011

Resumen de LISP. Javier Gil Julio, 2011 Resumen de LISP Javier Gil Julio, 2011 ; conceptos fundamentales de Lisp ; sintaxis basica (+ 2 3) (* 2 (+ 4 6)) (+ 2/7 7/67) (/ #c(2 3) 6/4) ; operadores matematicos basicos (+ 2 3) (- 8 6) (* 2/7 6/5)

Más detalles

PROGRAMA DE CURSO. Horas de Trabajo Personal ,5 5,5

PROGRAMA DE CURSO. Horas de Trabajo Personal ,5 5,5 Código Nombre CC4101 Lenguajes de Programación Nombre en Inglés Programming Languages SCT PROGRAMA DE CURSO Unidades Docentes Horas de Cátedra Horas Docencia Auxiliar Horas de Trabajo Personal 6 10 3 1,5

Más detalles

Tema 4: Procedimientos y estructuras recursivas

Tema 4: Procedimientos y estructuras recursivas Tema 4: Procedimientos y estructuras recursivas Contenidos 1. Recursión 1.1 Pensando recursivamente 1.2 El coste de la recursión 1.3 Soluciones al coste de la recursión: procesos iterativos 1.4 Soluciones

Más detalles

2º Certamen ILI-253 Lenguajes de Programación Juan Pablo Menichetti Jorge Mujica 10 de Junio del 2004

2º Certamen ILI-253 Lenguajes de Programación Juan Pablo Menichetti Jorge Mujica 10 de Junio del 2004 º Certamen ILI-53 Lenguajes de Programación Juan Pablo Menichetti Jorge Mujica 10 de Junio del 004 ta: Tiempo: 10 Minutos. Responda con lápiz indeleble para acceder a recorrecciones. Utilice solo las hojas

Más detalles

Lenguajes funcionales: λ-cálculo

Lenguajes funcionales: λ-cálculo Lenguajes funcionales: λ-cálculo λ-cálculo (Church 1933) Cálculo para el estudio formal del comportamiento de las funciones Sintaxis: λ expresiones Reglas de reducción de λ expresiones Método matemático

Más detalles

Estructura de un programa en Java. Tipos de datos básicos. class miprimerprograma{ // comentario, no es parte del programa

Estructura de un programa en Java. Tipos de datos básicos. class miprimerprograma{ // comentario, no es parte del programa Contenido Estructura de un programa en Java... 2 Tipos de datos básicos... 2 Operadores... 3 Literales... 4 Entrada / Salida... 4 Sentencias condicionales... 5 Funciones... 5 Ejercicios... 6 Variables,

Más detalles

Un calculadora avanzada... y algo más!

Un calculadora avanzada... y algo más! INFORMÁTICA, GRUPO D Un calculadora avanzada... y algo más! Vamos a familiarizarnos con el entorno interactivo de Python. Vamos a construir expresiones aritméticas y a guardar los resultados en variables

Más detalles

Tema 1 Programación Funcional

Tema 1 Programación Funcional Tema 1 Programación Funcional Curso de Python Avanzado Juan Pedro Boĺıvar Puente Instituto de Astrofísica de Andalucía Mayo de 2011 Juan Pedro Boĺıvar Puente (Instituto de Astrofísica Tema de Andalucía)

Más detalles

PARADIGMAS DE PROGRAMACIÓN CALCULO LAMBDA CALCULO LAMBDA

PARADIGMAS DE PROGRAMACIÓN CALCULO LAMBDA CALCULO LAMBDA PARADIGMAS DE PROGRAMACIÓN 2006 CALCULO LAMBDA CALCULO LAMBDA El cálculo lambda fue desarrollado por Alonso Church en la década del 30 con el objeto de dar una teoría general de las funciones. El cálculo

Más detalles

Paradigma Funcional Caso de estudio: ML. Lenguajes de Programación 2018

Paradigma Funcional Caso de estudio: ML. Lenguajes de Programación 2018 Paradigma Funcional Caso de estudio: ML Lenguajes de Programación 2018 FUNCIÓN: Mapeo de un dominio en un rango El mapeo se puede describir por medio de una EXPRESIÓN f(1) = 2 f(2) = 3 Enumeración f(x)

Más detalles

Programación Interactiva

Programación Interactiva Capítulo 6 Programación Interactiva 6.1 Cadenas Una cadena es una secuencia de caracteres encerrados en comillas dobles. Scheme proporciona varios procedimientos para manipular cadenas: Procedimiento string?

Más detalles

TP 3: intérprete de C en LISP (alias máquina virtual de C en LISP )

TP 3: intérprete de C en LISP (alias máquina virtual de C en LISP ) TP 3: intérprete de C en LISP (alias máquina virtual de C en LISP Introducción Se deberá programar un intérprete de C en LISP. El código que ingresará al intérprete tendrá ciertas restricciones: Se utilizará

Más detalles

Modelos de Desarrollo de Programas Y Programación Concurrente Clase N 3

Modelos de Desarrollo de Programas Y Programación Concurrente Clase N 3 PROGRAMACION FUNCIONAL - Un lenguaje de programación funcional tiene gran flexibilidad, es conciso en su notación y su semántica es sencilla. El inconveniente principal de estos lenguajes ha sido la ineficiencia

Más detalles

Paradigma Funcional Caso de estudio: ML. Lenguajes de Programación 2017

Paradigma Funcional Caso de estudio: ML. Lenguajes de Programación 2017 Paradigma Funcional Caso de estudio: ML Lenguajes de Programación 2017 Paradigma Funcional FUNCIÓN: Mapeo de un dominio en un rango El mapeo se puede describir por medio de una EXPRESIÓN f(1) = 2 f(2)

Más detalles

Máquinas de estado finito y expresiones regulares

Máquinas de estado finito y expresiones regulares Capítulo 3 Máquinas de estado finito y expresiones regulares En este tema definiremos y estudiaremos máquinas de estado finito, llamadas también máquinas de estado finito secuenciales o autómatas finitos.

Más detalles

! Qué es la POO?! Un paradigma de programación. ! No hay paradigmas mejores ni peores! Todos tienen sus ventajas e inconvenientes

! Qué es la POO?! Un paradigma de programación. ! No hay paradigmas mejores ni peores! Todos tienen sus ventajas e inconvenientes Introducción Programación orientada a objetos Curso INEM. Programación en Java Santiago Muelas Pascual smuelas@fi.upm.es! Qué es la POO?! Un paradigma de programación! Un paradigma es una forma de afrontar

Más detalles

Tema 8: Tipos de datos. Sesión 24: Tipos de datos (1)

Tema 8: Tipos de datos. Sesión 24: Tipos de datos (1) Tema 8: Tipos de datos Sesión 24: Tipos de datos (1) Referencias Programming Languages Pragmatics: Capítulo 7, apartados 7.1 (Type Systems) y 7.2 (Type Checking) Programming in Scala: Capítulo 5 (Basic

Más detalles

Abstracción de Datos y

Abstracción de Datos y Capítulo 3 Abstracción de Datos y Números El cómputo numérico ha sido tradicionalmente ignorado por la comunidad de Lisp. Hasta antes del Common Lisp nadie había ideado una estrategia detallada para ordenar

Más detalles

Métodos CON valor de retorno

Métodos CON valor de retorno Métodos Estáticos C# Fundamentos de Programación. Objetivos del tema: Qué es un método? Qué métodos conoces? Métodos que NO devuelven valor. Métodos que SI devuelven un valor. Paso de parámetros. Variables

Más detalles

PHP: Lenguaje de programación

PHP: Lenguaje de programación Francisco J. Martín Mateos Carmen Graciani Diaz Dpto. Ciencias de la Computación e Inteligencia Artificial Universidad de Sevilla Tipos de datos Enteros Con base decimal: 45, -43 Con base octal: 043, -054

Más detalles

Apunte Laboratorio ALPI - El lenguaje de programación Pascal

Apunte Laboratorio ALPI - El lenguaje de programación Pascal Apunte Laboratorio ALPI - El lenguaje de programación Pascal 1 2 ÍNDICE GENERAL Índice 1. Estructura de un Programa en Pascal 3 2. Sintaxis de Pascal 4 2.1. Uso de mayúsculas.....................................

Más detalles

Unidad V. Ya veremos qué poner en "algunas_palabras" y "algo_más", por ahora sigamos un poco más.

Unidad V. Ya veremos qué poner en algunas_palabras y algo_más, por ahora sigamos un poco más. Implementación Orientada a Objetos. Unidad V 5.1 Estructura de una clase. Una clase consiste en: algunas_palabras class nombre_de_la_clase [algo_más] { [lista_de_atributos] [lista_de_métodos] Lo que está

Más detalles

Declaración. Introducción. Definición o implementación. Llamada. Un programa en C consta de una o más funciones.

Declaración. Introducción. Definición o implementación. Llamada. Un programa en C consta de una o más funciones. Dpto. de ATC, Universidad de Sevilla - Página 1 de 5 1 2 Introducción Declaración Un programa en C consta de una o más funciones. La función main es la primera función que se ejecuta y que llama a las

Más detalles

Se debe disponer sobre la mesa un documento de identificación con fotografía.

Se debe disponer sobre la mesa un documento de identificación con fotografía. Examen escrito de Programación 1. Miércoles 31 de enero de 2018 Se debe disponer sobre la mesa un documento de identificación con fotografía. Se debe comenzar a resolver cada uno de los problemas del examen

Más detalles

Clase 2 de prácticas: Funciones como datos primitivos

Clase 2 de prácticas: Funciones como datos primitivos Clase 2 de prácticas: Funciones como datos primitivos Índice 1 Ejercicio 1... 2 2 Ejercicio 2... 2 3 Ejercicio 3... 2 4 Ejercicio 4... 3 5 Ejercicio 5 (ampliación)...3 6 Ejercicio 6 (ampliación)...4 7

Más detalles

Tema 1: Introducción a la programación funcional

Tema 1: Introducción a la programación funcional Programación declarativa (2009 10) José A. Alonso Jiménez Grupo de Lógica Computacional Departamento de Ciencias de la Computación e I.A. Universidad de Sevilla 2 / 21 3 / 21 en Haskell En Haskell, una

Más detalles

n! = 1 2 n 0! = 1 (n+1)! = (n + 1) n!

n! = 1 2 n 0! = 1 (n+1)! = (n + 1) n! Capítulo 3 Recursión La recursión es un estilo autoreferencial de definición usado tanto en matemática como en informática. Es una herramienta de programación fundamental, particularmente importante para

Más detalles

Tema 3. Patrones y Definiciones de Funciones

Tema 3. Patrones y Definiciones de Funciones Programación Declarativa Haskell Informática Sistemas Curso 2003-2004 Pepe Gallardo Universidad de Málaga Tema 3. Patrones y Definiciones de Funciones 3.1 Comparación de Patrones Patrones constantes Patrones

Más detalles

Tipos en Haskell. Cecilia Manzino

Tipos en Haskell. Cecilia Manzino Tipos Tipo: conjunto de valores asociados a operaciones. Ejemplos: enteros, caracteres, booleanos, funciones de enteros a enteros. Sirven para: detectar errores antes de la evaluación especificar programas

Más detalles

Funciones recursivas

Funciones recursivas Introducción a la Computación Funciones recursivas Esteban E. Mocskos (emocskos@dc.uba.ar) Facultad de Ciencias Exactas y Naturales, UBA CONICET 08/04/2014 E. Mocskos (UBA CONICET) Clase 9: Funciones Recursivas

Más detalles

Introducción a c++ Introducción a la programación EIS Informática III

Introducción a c++ Introducción a la programación EIS Informática III Introducción a c++ Un lenguaje de programación es un lenguaje formal diseñado para realizar procesos que pueden ser llevados a cabo por máquinas como las computadoras. Pueden usarse para crear programas

Más detalles

Paradigmas de lenguajes de programación. Introducción a la programación imperativa. Lenguaje C. Programación imperativa

Paradigmas de lenguajes de programación. Introducción a la programación imperativa. Lenguaje C. Programación imperativa Paradigmas de lenguajes de programación Introducción a la programación imperativa Algoritmos y Estructuras de Datos I Paradigma: Definición del modo en el que se especifica el cómputo (que luego es implementado

Más detalles

Tema 7: Programación imperativa

Tema 7: Programación imperativa Tema 7: Programación imperativa Sesión 20: Programación imperativa Indice Historia de la programación imperativa Características principales Datos mutables Estructuras de control Modelo de entornos Orígenes

Más detalles

Docente: Juan Carlos Pérez P. Alumno : Fecha : Nota:

Docente: Juan Carlos Pérez P. Alumno : Fecha : Nota: Docente: Juan Carlos Pérez P. Alumno : Fecha : Nota: Justificación: Se pretende con éste contribuir a que el alumno se inicie y conozca el entorno del IDE en la creación de pequeños programas en java Objetivos:

Más detalles

CONCEPTO Y DEFINICIÓN DE CLASE EN JAVA. OBJETOS DEL MUNDO REAL Y ABSTRACTOS. EJEMPLOS. EJERCICIO (CU00644B)

CONCEPTO Y DEFINICIÓN DE CLASE EN JAVA. OBJETOS DEL MUNDO REAL Y ABSTRACTOS. EJEMPLOS. EJERCICIO (CU00644B) APRENDERAPROGRAMAR.COM CONCEPTO Y DEFINICIÓN DE CLASE EN JAVA. OBJETOS DEL MUNDO REAL Y ABSTRACTOS. EJEMPLOS. EJERCICIO (CU00644B) Sección: Cursos Categoría: Curso Aprender programación Java desde cero

Más detalles

$0 Representa al parámetro cero o nombre del programa $1 Representa al parámetro uno $2 Representa al parámetro dos

$0 Representa al parámetro cero o nombre del programa $1 Representa al parámetro uno $2 Representa al parámetro dos PROGRAMACIÓN DE SHELL SCRIPTS EN LINUX El shell es un intérprete de órdenes, pero el shell no es solamente eso; los intérpretes de órdenes de Linux son auténticos lenguajes de programación. Como tales,

Más detalles