Programación Funcional Lisp-DrScheme Primera Parte · Programación Funcional Lisp-DrScheme...

Click here to load reader

  • date post

    18-Jul-2018
  • Category

    Documents

  • view

    214
  • download

    0

Embed Size (px)

Transcript of Programación Funcional Lisp-DrScheme Primera Parte · Programación Funcional Lisp-DrScheme...

  • Programacin Funcional Lisp-DrScheme Primera Parte

    Dr. Oldemar Rodrguez Rojas Escuela de Informtica Universidad de Nacional

  • Programacin Funcional ! La programacin funcional es un paradigma de programacin

    declarativa basado en la utilizacin de funciones. ! Los programas escritos en un lenguaje funcional estn

    constituidos nicamente por definiciones de funciones, entendiendo stas no como subprogramas clsicos de un lenguaje imperativo, sino como funciones puramente matemticas, y por tanto, hay la carencia total de efectos laterales.

    ! Otras caractersticas propias de estos lenguajes son la no existencia de asignaciones de variables y la falta de construcciones estructuradas como la secuencia o la iteracin, lo que obliga en la prctica a que todas las repeticiones de instrucciones se lleven a cabo por medio de funciones recursivas.

  • Scheme ! Scheme es un lenguaje de programacin

    funcional (si bien impuro, ya que, por ejemplo, sus estructuras de datos no son inmutables) y un dialecto de Lisp.

    ! Fue desarrollado por Guy L. Steele y Gerald Jay Sussman en la dcada de los setenta e introducido en el mundo acadmico a travs de una serie de artculos conocidos como los Lambda Papers de Sussman y Steele.

  • Scheme ! Scheme, como todos los dialectos de Lisp, tiene una sintaxis

    muy reducida, comparado con muchos otros lenguajes. No necesita reglas de precedencia, ya que, en esencia, carece de operadores: usa notacin prefija para todas las llamadas a funcin.

    ! Scheme facilita la programacin funcional. La programacin funcional pura no precisa de variables globales ni sufre de efectos secundarios, y es, por tanto, automticamente segura en presencia de procesos concurrentes (thread-safe).

    ! Tambin permite la creacin de procedimientos annimos. ! El estndar de Scheme es tambin minimalista. Ello conlleva

    ventajas e inconvenientes. Por ejemplo, escribir un compilador o intrprete de Scheme que sea fiel al estndar es ms fcil que implementar uno de Common Lisp, uno de sus antesesores.

  • Dnde bajar Scheme? (PLTScheme DrScheme):

    http://plt-scheme.org/ http://racket-lang.org/

  • Ejemplo: > (+ (* 3 (+ (* 2 4) (+ 3 5))) (+ (- 10 7) 6)) 57 > (define tamao 2) tamao > tamao 2 > (+ 3 tamao) 5 > (* 2 tamao) 4

  • Definicin de Variables (define Pi 3.14159) Pi (define radio 10) Radio (define circunferencia (* 2 Pi radio)) circunferencia > circunferencia 62.8318

  • Funciones en Lisp

    (define (cuadrado x) (* x x)) > (cuadrado 2) 4

    Ejemplo:

  • Ejemplo: (define (circunferencia radio) (* Pi radio))

    > (circunferencia 4) 12.56636

  • Sintaxis de las funciones:

    (define ( ) (cuerpo))

  • Ejemplo:

    (define (suma_cuadrados x y) (+ (cuadrado x) (cuadrado y))) > (suma_cuadrados 2 3) 13

  • Ejemplo: Composicin de Funciones

    > (define (f1 a) (suma_cuadrados (+ a 1) (- a 1))) > (f 5) 52

  • El modelo de sustitucin para evaluar funciones

    (f1 5) (suma_cuadrados (+ 5 1) (- 5 1)) (+ (cuadrado (+ 5 1)) (cuadrado (- 5 1))) (+ (* (+ 5 1) (+ 5 1)) (* (- 5 1) (- 5 1))) (+ (* 6 6) (* 4 4)) (+ 36 16) 52

  • Funciones Booleanas

    (define (es-5? n) (= n 5)) > (es-5? 5) #t > (es-5? 7) #f

  • Funciones Booleanas (define (esta-entre-5-6? n) (and (< 5 n) (< n 6))) (define (esta-entre-5-6-o-sobre-10? n) (or (esta-entre-5-6? n) (>= n 10)))

  • Sintaxis del if

    (if )

  • Ejemplo:

    (define (f2 x) (if (>= x 2) (* x x) (if (and (< x 2) (> x -2)) (+ x 1) (/ x 2)))) > (f2 4) 16 > (f2 0) 1

  • Expresiones condicionales y predicados

    (cond ( ) ( ) ..... ( ) (else ))

    Sintaxis del cond

  • Ejemplo:

    (define (f3 x) (cond ((>= x 2) (+ (* x x) 1)) ((= x 0) 2) (else (* x x x)))) > (f3 3) 10

  • Expresiones condicionales y predicados

    (cond [ ] ... [ ] [else en+1])

    Sintaxis del cond

  • Ejemplo: (define (intereses cantidad) (cond [(

  • Sentencias read y write - Evaluando un documento (define (calcula-nota x y z) (/ (+ x y z) 3)) (define (paso? n) (>= n 70)) (define (nota) (newline) (write "Deme las notas") (newline) (calcula-nota (read) (read) (read)))

  • (define (resultado) (if (paso? (nota)) (write "GANO") (write "AMPLIACION"))) =>(resultado) "Deme las notas" 90 80 70 "GANO"

  • Definiciones Internas: (define (todo) (define (calcula-nota x y z)

    (/ (+ x y z) 3)) (define (paso? n)

    (>= n 70)) (define (nota)

    (newline) (write "Deme las notas") (newline) (calcula-nota (read) (read) (read)))

    (define (resultado) (if (paso? (nota)) (write "GANO") (write "AMPLIACION")))

    (resultado))

  • todo =>(todo) "Deme las notas" 90 40 50 "AMPLIACION =>(resultado) // ERROR top-level: unbound variable: resultado

  • Procesamiento simblico ! Un smbolo es una secuencia de

    caracteres precedida por un signo de comillas simple:

    ! Ejemplos:

    'El 'perro 'comio 'un 'gato 'chocolate 'dos^3 'y%en%lo?

  • Procesamiento simblico ! Scheme tiene una sola operacin bsica de

    manipulacin de smbolos: symbol=?, ! Es una operacin de comparacin, recibe dos

    smbolos y produce true si y slo si los dos smbolos son idnticos:

    ! Ejemplos; ! (symbol=? 'Hola 'Hola) = true ! (symbol=? 'Hola 'Hello) = false ! (symbol=? 'Hola x) = true si x almacena 'Hola ! (symbol=? 'Hola x) = false si x almacena 'Hello

  • Procesamiento simblico ! Los smbolos fueron introducidos a la computacin por los

    investigadores en inteligencia artificial que queran disear programas que pudieran tener conversaciones con la gente.

    ! Por ejemplo la funcin respuesta, que responde con alguna observacin a los diferentes saludos:

    (define (respuesta s) (cond [(symbol=? s 'buenos-dias) 'Hola] [(symbol=? s 'como-esta?) 'bien] [(symbol=? s 'buenas-tardes) 'buenas] [(symbol=? s 'buenas-noches) 'estoy-cansado]))

  • Recursin y Recursin Lineal ! Ejemplo:

  • ! Versin Recursiva

    (define (factorial n) (if (or (= n 0) (= n 1)) 1 (* n (factorial (- n 1)))))

  • ! Versin Recursiva Lineal (Recursin Lineal)

    (define (factorial1 n) (fac-iter 1 1 n)) (define (fac-iter resultado i n) (if (> i n) resultado (fac-iter (* resultado i) (+ i 1) n)))

  • Modelo de Sustitucin

    (factorial1 4) (fac-iter 1 1 4) (fac-iter 1 2 4) (fac-iter 2 3 4) (fac-iter 6 4 4) (fac-iter 24 5 4)

  • ! Ejemplo 2:

  • ! Versin Recursiva

    (define (fib n) (cond ((= n 0) 0) ((= n 1) 1) (else (+ (fib (- n 1)) (fib (- n 2))))))

  • (define (fib1 n) (fib-iter1 0 1 0 n)) (define (fib-iter1 ant res i n) (if (>= i n) ant (fib-iter1 res (+ res ant) (+ i 1) n)))

  • ! Versin Recursiva Lineal (Recursin Lineal)

    (define (fib1 n) (fib-iter 1 0 n)) (define (fib-iter a b n) (if (= n 0) b (fib-iter (+ a b) a (- n 1))))

  • Ejemplo 3:

  • Funciones como Parmetro ! Ejemplo 1:

    (define (serie1 a n) (if (> a n) 0 (+ a (serie1 (+ a 1) n))))

  • ! Ejemplo 2:

    define (serie2 a n) (if (> a n) 0 (+ (* a a) (serie2 (+ a 1) n))))

  • ! Ejemplo 3:

    (define (serie3 a n) (if (> a n) 0 (+ (/ 1 (+ (* a a) 1)) (serie3 (+ a 1) n))))

  • ! Toda serie es de la forma:

    ! Programa general

    (define (serie f a n) (if (> a n) 0 (+ (f a) (serie f (+ a 1) n))))

  • ! Ejemplo: (define (cuadrado a)

    (* a a))

    (define (sum f a n) (if (> a n) 0 (+ (f a) (sum f (+ a 1) n))))

    (define (serie2 a n) (sum cuadrado a n))

    (define (termino i) (/ i (+ (cubo i) 1)))

    (define (serie3 a n) (sum termino a n))

  • Funciones Lambda ! Las funciones Lambda permiten definir

    Funciones Annimas, con la siguiente sintaxis:

    ! (lambda () )

  • ! Ejemplo: (lambda (x) (+ x 4))

    ! Ejemplo:

    =>(define cubo (lambda (x) (* x x x))) cubo =>(cubo 3) 27

  • ! Ejemplo:

    (define (serie f a n) (if (> a n) 0 (+ (f a) (serie f (+ a 1) n)))) (define (serie4 a n) (serie (lambda (i) (/ i (+ (cubo i) 1))) a n))

  • Uso del let ! Sintaxis:

    (let (( ) ( ) . . . . . . )) )

  • Ejemplo: Una funcin que calcula el sueldo neto: ! sueldo=HT*SPH - 20% deducciones

    (define (salario HT SPH) (let ((sal-bruto (* HT SPH)) (deduccion (* (* HT SPH) 0.2))) (- sal-bruto deduccion)))

  • Funciones que retornan funciones ! Ejemplo: Escriba una funcin que recibe HT, SPH y retorna

    una funcin que recibe como parmetro el porcentaje de deduccin para calcular el salario neto:

    (define (salario2 HT SPH) (lambda (x) (- (* HT SPH) (* (* HT SPH) x)))) =>((salario 10 100) 0.2) 800.0 =>(salario 10 100) #[compound 8896152]

  • ! Ejemplo: Escribiremos una funcin que calcula la derivada de una funcin, que como se sabe es una funcin definida como sigue:

    cuando h es pequeo.

  • Cdigo: (define (derivada f h) (lambda (x) (/ (- (f (+ x h)) (f x)) h))) =>((derivada cubo 0.0001) 5) 75.0015000099324 =>(derivada cubo 0.0001) #[compound 8897184]

  • GRACIAS..