100% encontró este documento útil (1 voto)
115 vistas51 páginas

Programacion Funcional Lisp DrScheme Primera - Parte

Este documento describe conceptos básicos de programación funcional como Scheme, un lenguaje de programación funcional. Explica características como la falta de asignaciones de variables y la utilización de funciones recursivas en lugar de iteraciones. También cubre temas como definición de funciones, funciones booleanas, expresiones condicionales, procesamiento simbólico, recursión lineal, funciones como parámetros y funciones lambda.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
100% encontró este documento útil (1 voto)
115 vistas51 páginas

Programacion Funcional Lisp DrScheme Primera - Parte

Este documento describe conceptos básicos de programación funcional como Scheme, un lenguaje de programación funcional. Explica características como la falta de asignaciones de variables y la utilización de funciones recursivas en lugar de iteraciones. También cubre temas como definición de funciones, funciones booleanas, expresiones condicionales, procesamiento simbólico, recursión lineal, funciones como parámetros y funciones lambda.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 51

Programacin Funcional

Lisp-DrScheme
Primera Parte Primera Parte
Dr. Oldemar Rodriguez Rojas
Escuela de !nformatica
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 estan
constituidos unicamente por definiciones de funciones,
entendiendo stas no como subprogramas clasicos de un
lenguaje imperativo, sino como funciones puramente lenguaje imperativo, sino como funciones puramente
matematicas, y por tanto, hay la carencia total de efectos
laterales.
Otras caracteristicas 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 practica 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. 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 articulos 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 Scheme facilita la programacin funcional. La programacin
funcional pura no precisa de variables globales ni sufre de
efectos secundarios, y es, por tanto, automaticamente segura en
presencia de procesos concurrentes (thread-safe).
Tambin permite la creacin de procedimientos annimos.
El estandar de Scheme es tambin minimalista. Ello conlleva
ventajas e inconvenientes. Por ejemplo, escribir un compilador o
intrprete de Scheme que sea fiel al estandar es mas facil que
implementar uno de Common Lisp, uno de sus antesesores.
Dnde bajar Scheme?
(PLTScheme DrScheme):
http://plt-scheme.org/
Ejemplo:
> (+ (* 3 (+ (* 2 4) (+ 3 5))) (+ (- 10 7) 6))
57
> (define tamao 2)
Tamao Tamao
> tamao
2
> (+ 3 tamao)
5
> (* 2 tamao)
4
Definicin de Variables
(define Pi 3.14159)
Pi
(define radio 10) (define radio 10)
Radio
(define circunferencia (* 2 Pi radio))
Circunferencia
> circunferencia
62.8318
Funciones en Lisp
(define (cuadrado x) (* x x))
Ejemplo:
(define (cuadrado x) (* x x))
> (cuadrado 2)
+
Ejemplo:
(define (circunferencia radio)
(* Pi radio))
> (circunferencia +)
12.56636
Sintaxis de las funciones:
(define (<nombre> <parametros formales>)
(cuerpo)) (cuerpo))
Ejemplo:
(define (suma_cuadrados x y)
(+ (cuadrado x) (cuadrado y)))
> (suma_cuadrados 2 3)
13
Ejemplo: Composicin de Funciones
> (define (f1 a) > (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) (* + +))
(+ 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 <predicado> <consecuencia>
<alternativa>) <alternativa>)
Ejemplo:
(define (f2 x)
(if (>= x 2) (* x x)
(if (and (< x 2) (> x -2)) (+ x 1)
(f x 2))))
> (f2 +)
16
> (f2 0)
1
Expresiones condicionales y predicados
(cond (<p
1
> <e
1
>)
(<p
2
> <e
2
>)
Sinfoxis deI cond
(<p
2
> <e
2
>)
.....
(<p
n
> <e
n
>)
(else <e
n+1
>))
Ejemplo:
(define (f3 x)
(cond ((>= x 2) (+ (* x x) 1)) (cond ((>= x 2) (+ (* x x) 1))
((= x 0) 2)
(else (* x x x))))
> (f3 3)
10
Expresiones condicionales y predicados
(cond
[<p
1
> <e
1
>|
Sinfoxis deI cond
[<p
1
> <e
1
>|
...
[<p
n
> <e
n
>|
[else e
n+1
|)
Ejemplo:
(define (intereses cantidad)
(cond
[(<= cantidad 1000) 0.0+0| [(<= cantidad 1000) 0.0+0|
[(<= cantidad 5000) 0.0+5|
[else 0.050|))
Sentencias read y write - Evaluando un documento
(define (calcula-nota x y z)
(f (+ x y z) 3))
(define (paso? n) (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 "ANPL!AC!ON")))
=>(resultado)
"Deme las notas"
90
80
70
"GANO"
Definiciones Internas:
(define (todo)
(define (calcula-nota x y z)
(f (+ x y z) 3))
(define (paso? n)
(>= n 70))
(define (nota)
(newline) (newline)
(write "Deme las notas")
(newline)
(calcula-nota (read) (read) (read)))
(define (resultado)
(if (paso? (nota)) (write "GANO")
(write "ANPL!AC!ON")))
(resultado))
todo
=>(todo)
"Deme las notas"
90
+0 +0
50
"ANPL!AC!ON
=>(resultado) ff ERROR
top-level: unbound variable: resultado
Procesamiento simblico
Un smbolo es una secuencia de caracteres
precedida por un signo de comillas simple:
Ejemplos: Ejemplos:
'El 'perro 'comio 'un 'gato 'chocolate
'dos'3 'yenlo?
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 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: 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)) (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 +)
(fac-iter 1 1 +)
(fac-iter 1 2 +) (fac-iter 1 2 +)
(fac-iter 2 3 +)
(fac-iter 6 + +)
(fac-iter 2+ 5 +)
Ejemplo 2:
versin Recursiva
(define (fib n)
(cond ((= n 0) 0) (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) (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))))
Funciones como Parmetro
Ejemplo 1:
(define (serie1 a n) (define (serie1 a n)
(if (> a n)
0
(+ a (serie1 (+ a 1) n))))
Ejemplo 2:
define (serie2 a n)
(if (> a n) (if (> a n)
0
(+ (* a a) (serie2 (+ a 1) n))))
Ejemplo 3:
(define (serie3 a n)
(if (> a n)
00
(+ (/ 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)))) (+ (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 (<parametros>) <cuerpo>)
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)
00
(+ (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 ((<var > <exp >) (let ((<var
1
> <exp
1
>)
(<var
2
> <exp
2
>)
. . . . . .
<var
n
> <exp
n
>))
<cuerpo>)
Ejemplo: Una funcin que calcula el sueldo
neto:
sueldo=HT*SPH - 20 deducciones
(define (salario HT SPH) (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) (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 (- (f (+ x h)) (f x)) h))) (f (- (f (+ x h)) (f x)) h)))
=>((derivada cubo 0.0001) 5)
75.001500009932+
=>(derivada cubo 0.0001)
#[compound 889718+|
GRACIAS..

También podría gustarte