60
Programación Funcional Lisp-Scheme D Old Rdí Rj Dr. Oldemar Rodríguez Rojas Escuela de Informática Escuela de Informática Universidad de Nacional

Programación_Lisp_2008.229135104

Embed Size (px)

Citation preview

Page 1: Programación_Lisp_2008.229135104

Programación FuncionalgLisp-Scheme

D Old R d í R jDr. Oldemar Rodríguez RojasEscuela de InformáticaEscuela de Informática Universidad de Nacional

Page 2: Programación_Lisp_2008.229135104

¿Dónde bajar?Lisp (EdScheme):

www schemers comwww.schemers.com

Page 3: Programación_Lisp_2008.229135104
Page 4: Programación_Lisp_2008.229135104

Ejemplo:je p o=> (+ (* 3 (+ (* 2 4) (+ 3 5))) (+ (- 10 7) 6))( ( ( ( ) ( ))) ( ( ) ))57=> (define tamaño 2)( )tamaño=> tamaño> tamaño2=> (+ 3 tamaño)=> (+ 3 tamaño)5=> (* 2 tamaño)=> (* 2 tamaño)4

Page 5: Programación_Lisp_2008.229135104

Ejemplo:je p o=> (define Pi 3.14159)ipi

=> (define radio 10)( )radio=> (define circunferencia (* 2 Pi radio))=> (define circunferencia ( 2 Pi radio))circunferencia=> circunferencia62 831862.8318

Page 6: Programación_Lisp_2008.229135104

Funciones en Lisp

Ejemplo:

(d f ( d d ) (* ))

Ejemplo:

=> (define (cuadrado x) (* x x))

=> (cuadrado 2)4

Page 7: Programación_Lisp_2008.229135104

Ejemplo:j p=>(define (circunferencia radio)>(define (circunferencia radio)

(* Pi radio))

=>(circunferencia 4)>(circunferencia 4)12.56636

Page 8: Programación_Lisp_2008.229135104

Sintaxis de las funciones:S

(define (<nombre> <parámetros formales>) ( ))(cuerpo))

Page 9: Programación_Lisp_2008.229135104

Ejemplo:

=>(define (suma cuadrados x y)>(define (suma_cuadrados x y)(+ (cuadrado x) (cuadrado y)))

=>(suma cuadrados 2 3)>(suma_cuadrados 2 3)13

Page 10: Programación_Lisp_2008.229135104

Ejemplo:j p=>(define (f a)>(define (f a)

(suma_cuadrados (+ a 1) (- a 1)))

=>(f 5)>(f 5)52

Page 11: Programación_Lisp_2008.229135104

El modelo de sustitución para l f ievaluar funciones

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

Page 12: Programación_Lisp_2008.229135104

Sintaxis del ifS f

(if <predicado> <consecuencia>lt ti )<alternativa>)

Page 13: Programación_Lisp_2008.229135104

Ejemplo:j p

=>(define (f x)(if (>= x 2) (* x x)

(if (and (< x 2) (> x -2)) (+ x 1)(/ x 2))))(/ ))))

=>(f 4)=>(f 4)16=>(f 0)=>(f 0)1

Page 14: Programación_Lisp_2008.229135104

Expresiones condicionales y predicadosSi t i d l dSintaxis del cond

(cond (<p1> <e1>)(<p2> <e2>)(<p2> <e2>).....(<pn> <en>)(else <e 1>))(else <en+1>))

Page 15: Programación_Lisp_2008.229135104

Ejemplo:j p

(d fi (f )=>(define (f x)(cond ((>= x 2) (+ (* x x) 1))( (( ) ( ( ) ))

((= x 0) 2)(else (* x x x))))(else (* x x x))))

=>(f 3)1010

Page 16: Programación_Lisp_2008.229135104

Sentencias read y write - Evaluando un documento(define (calcula-nota x y z)(/ (+ x y z) 3))(/ (+ x y z) 3))

(define (paso? n)(d (pa o )(>= n 70))

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

Page 17: Programación_Lisp_2008.229135104

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

(write "AMPLIACION")))

=>(resultado)

"Deme las notas"90808070"GANO"GANO

Page 18: Programación_Lisp_2008.229135104

Definiciones Internas:(define (todo)

(define (calcula-nota x y z)( ( y )(/ (+ x y z) 3))

(define (paso? n)(>= n 70))

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

(d fi ( lt d )(define (resultado)(if (paso? (nota)) (write "GANO")

(write "AMPLIACION")))(write AMPLIACION )))(resultado))

Page 19: Programación_Lisp_2008.229135104

todo=>(todo)"Deme las notas"90404050"AMPLIACION“AMPLIACION

>(resultado) // ERROR=>(resultado) // ERRORtop-level: unbound variable: resultado

Page 20: Programación_Lisp_2008.229135104
Page 21: Programación_Lisp_2008.229135104
Page 22: Programación_Lisp_2008.229135104

Recursión y Recursión LinealEjemplo 1:

Page 23: Programación_Lisp_2008.229135104

Versión Recursiva

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

1(* (f t i l ( 1)))))(* n (factorial (- n 1)))))

Page 24: Programación_Lisp_2008.229135104

Versión Recursiva Lineal (Recursión Lineal)e s ó ecu s a ea ( ecu s ó ea )

(define (factorial1 n)(define (factorial1 n)(fac-iter 1 1 n))

(define (fac-iter resultado i n)(if ( i )(if (> i n)

resultado(fac-iter (* resultado i) (+ i 1) n)))

Page 25: Programación_Lisp_2008.229135104

Modelo de Sustituciónode o de Sust tuc ó(factorial1 4)(factorial1 4)(fac-iter 1 1 4)(fac-iter 1 2 4)(fac-iter 2 3 4)(fac iter 2 3 4)(fac-iter 6 4 4)(fac-iter 24 5 4)

Page 26: Programación_Lisp_2008.229135104

Ejemplo 2:

Page 27: Programación_Lisp_2008.229135104

Versión Recursiva

(define (fib n)(define (fib n)(cond ((= n 0) 0)( (( ) )

((= n 1) 1)( l (+ (fib ( 1)) (fib ( 2))))))(else (+ (fib (- n 1)) (fib (- n 2))))))

Page 28: Programación_Lisp_2008.229135104

(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)))(fib iter1 res (+ res ant) (+ i 1) n)))

Page 29: Programación_Lisp_2008.229135104

Versión Recursiva Lineal (Recursión Lineal)

(define (fib1 n)(define (fib1 n)(fib-iter 1 0 n))

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

bb(fib-iter (+ a b) a (- n 1))))

Page 30: Programación_Lisp_2008.229135104

Funciones como Parámetrou c o es co o a á et oEjemplo 1:Ejemplo 1:

(define (serie1 a n)(if (> a n)(if (> a n)

0(+ a (serie1 (+ a 1) n))))

Page 31: Programación_Lisp_2008.229135104

Ejemplo 2:j p

d fi ( i 2 )define (serie2 a n)(if (> a n)( ( )

0(+ (* a a) (serie2 (+ a 1) n))))

Page 32: Programación_Lisp_2008.229135104

Ejemplo 3:

(define (serie3 a n)( ( )(if (> a n)

00(+ (/ 1 (+ (* a a) 1)) (serie3 (+ a 1) n))))

Page 33: Programación_Lisp_2008.229135104

Toda serie es de la forma:

Programa generalPrograma general

(define (serie f a n)(if (> )(if (> a n)

0(+ (f a) (serie f (+ a 1) n))))

Page 34: Programación_Lisp_2008.229135104

Ejemplo:(define (cuadrado a)

(* a a))

(define (sum f a n)(define (sum f a n)(if (> a n)

0(+ (f a) (sum f (+ a 1) n))))

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

(d fi (t i i)(define (termino i)(/ i (+ (cubo i) 1)))

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

Page 35: Programación_Lisp_2008.229135104

Funciones LambdaLas funciones Lambda permiten definir Funciones Anónimas con la siguienteFunciones Anónimas, con la siguiente sintaxis:

(lambda (<parámetros>) <cuerpo>)(lambda (<parámetros>) <cuerpo>)

Page 36: Programación_Lisp_2008.229135104

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

Ejemplo:

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

cubo>(cubo 3)=>(cubo 3)

27

Page 37: Programación_Lisp_2008.229135104

Ejemplo:

(define (serie f a n)( ( )(if (> a n)

00(+ (f a) (serie f (+ a 1) n))))

(define (serie1 a n)(define (serie1 a n)(serie (lambda (i) (/ i (+ (cubo i) 1))) a n))

Page 38: Programación_Lisp_2008.229135104

Uso del letUso de etSintaxis:Sintaxis:

(let ((<var1> <exp1>)(<var2> <exp2>)(<var2> <exp2>)

. . . . . .<varn> <expn>))<cuerpo>)<cuerpo>)

Page 39: Programación_Lisp_2008.229135104

Ejemplo: Una función que calcula el sueldo neto:neto:

sueldo=HT*SPH - 20% deduccionessueldo HT SPH 20% deducciones

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

(deduccion (* (* HT SPH) 0.2)))(- sal-bruto deduccion)))

Page 40: Programación_Lisp_2008.229135104

Funciones que retornan funcionesEjemplo: Escriba una función que recibe HT, SPH y retorna una función que recibe como parámetro el porcentaje de deducción para calcular el salario neto:porcentaje de deducción para calcular el salario neto:

(define (salario HT SPH)(define (salario HT SPH)(lambda (x)(- (* HT SPH) (* (* HT SPH) x))))( ( ) ( ( ) ))))

=>((salario 10 100) 0.2)800.0=>(salario 10 100)#[compound 8896152]

Page 41: Programación_Lisp_2008.229135104

Ejemplo: Escribiremos una función que l l l d i d d f iócalcula la derivada de una función, que

como se sabe es una función definida como sigue:

cuando h es pequeñocuando h es pequeño.

Page 42: Programación_Lisp_2008.229135104

Código:C g(define (derivada f h)( ( )(lambda (x)(/ ( (f (+ x h)) (f x)) h)))(/ (- (f (+ x h)) (f x)) h)))

=>((derivada cubo 0.0001) 5)75.0015000099324=>(derivada cubo 0.0001)#[compound 8897184]#[compound 8897184]

Page 43: Programación_Lisp_2008.229135104

Pares y Aritmética SimbólicaLisp posee una estructura compuestadenominada par las cuales de manipulancon las funciones: cons, cdr y carEjemplos:=>(define x (cons 1 2))x=>x(1 . 2)

( ) 2

x

=>(car x)1

>( d )

......

1

2

=>(cdr x)2

1

Page 44: Programación_Lisp_2008.229135104

=>(define y (cons 3 -8))yy=>y(3 . -8)=>(define z (cons x y))z=>z((1 . 2) 3 . -8)=>(car z)(1 . 2)

( d )=>(cdr z)(3 . -8)

Page 45: Programación_Lisp_2008.229135104

=>(car (car z))1=>(caar z)( )1=>(cdr (car z))>(cdr (car z))2=>(cdar z)=>(cdar z)2

>(cddr z)=>(cddr z)-8

Page 46: Programación_Lisp_2008.229135104

Ejemplo: La aritmética de los Racionales Q

; CONSTRUCTOR

(define (racional a b)( b))(cons a b))

(define (denominador r)(cdr r))( ))

(define (numerador r)(define (numerador r)(car r))

Page 47: Programación_Lisp_2008.229135104

; DEFINE SUMA DE NUMEROS RACIONALES

(define (suma r1 r2)(racional (+ (* (numerador r1) (denominador r2))( ( ( ( ) ( ))

(* (denominador r1) (numerador r2))) (* (denominador r1) (denominador r2))))( ( ) ( ))))

; DEFINE RESTA DE NUMEROS RACIONALES

(define (resta r1 r2)(racional (- (* (numerador r1) (denominador r2))

(*(denominador r1) (numerador r2))) (* (denominador r1) (denominador r2))))

Page 48: Programación_Lisp_2008.229135104

; DEFINE PRODUCTO DE NUMEROS RACIONALES

(define (producto r1 r2)(racional (* (numerador r1) (numerador r2))(racional ( (numerador r1) (numerador r2))

(* (denominador r1) (denominador r2))))

; DEFINE LA DIVISIÓN NUMEROS RACIONALES

(define (division r1 r2)(racional (* (numerador r1) (denominador r2))(racional ( (numerador r1) (denominador r2))

(* (denominador r1) (numerador r2))))

Page 49: Programación_Lisp_2008.229135104

; IMPRIME NUMEROS RACIONALES; IMPRIME NUMEROS RACIONALES

(define (imprime r)(define (imprime r)(newline)(write (numerador r))(write (numerador r))(write-char #\/ )(write (denominador r)))(write (denominador r)))

Page 50: Programación_Lisp_2008.229135104

Ejemplos de Uso=>(define r1 (racional 1 2))r1=>(define r2 (racional 3 4))r2=>(imprime r1)>(imprime r1)1/2=>(imprime r2)3/43/4=>(define z (suma r1 r2))z=>(imprime z)10/8

>(define p (p od cto 1 ))=>(define p (producto r1 z))p=>(imprime p)( p p)10/16

Page 51: Programación_Lisp_2008.229135104

Listas Enlazadas vrs Pares

=>(cons 3 4)=>(cons 3 4)(3 . 4)

Primera

......3

4

Page 52: Programación_Lisp_2008.229135104

Listas Enlazadas vrs Pares=>(cons (cons 3 4) (cons 7 8))((3 . 4) 7 . 8)

PrimeraPrimera

88

7

4

E t Li t3

Esto no es una Lista

Page 53: Programación_Lisp_2008.229135104

Listas Enlazadas vrs Pares

=>(cons 3 (cons 4 (cons 7 (cons 8 '()))))=>(cons 3 (cons 4 (cons 7 (cons 8 ()))))(3 4 7 8)

Primera

3 4 7 8

Esto si es una lista

Page 54: Programación_Lisp_2008.229135104

La función para construir listas es:(list a1 a2 a3 . . . . an)

Ejemplo:j p

(li t 3 4 7 8)=>(list 3 4 7 8)(3 4 7 8)( ); es equivalente a (cons 3 (cons 4 (cons 7 (cons 8 '()))))

Page 55: Programación_Lisp_2008.229135104

Más Ejemplos:j p=>(define L1 (list 'dos 'mas 'tres 'es 4))( ( ))l1=>L1=>L1(dos mas tres es 4)=>(car L1)dos=>(cdr L1)(mas tres es 4)(mas tres es 4)

Page 56: Programación_Lisp_2008.229135104

Operaciones con listasOpe ac o es co stasdefine (longitud L)( g )(if (null? L)

00(+ 1 (longitud (cdr L)))))

(define (n-esimo n L)(if ( n 1)(if (= n 1)

(car L)( i ( 1) ( d ))))(n-esimo (- n 1) (cdr L))))

Page 57: Programación_Lisp_2008.229135104

(define (suma-lista L)(define (suma lista L)(if (null? L)

00(+ (car L) (suma-lista (cdr L)))))

(define (pega L1 L2)(define (pega L1 L2)(if (null? L1)

L2L2(cons (car L1) (pega (cdr L1) L2))))

Page 58: Programación_Lisp_2008.229135104

(define (cuadrado-lista L)(if (null? L)

'()'()(cons (* (car L) (car L)) (cuadrado-lista (cdr L)))))

(define (multiplica-listas L1 L2)(if (null? L1)

'()( (* ( L1) ( L2)) ( lti li li t ( d L1) ( d L2)))))(cons (* (car L1) (car L2)) (multiplica-listas (cdr L1) (cdr L2)))))

Page 59: Programación_Lisp_2008.229135104

Ejemplos:=>(define L1 (list 3 4 5 -1))l1

>(define L2 (list 1 1 2 2))=>(define L2 (list 1 1 2 2))l2=>(longitud L1)( g )4=>(n-esimo 3 L1)55=>(pega L1 L2)(3 4 5 -1 1 1 2 2)=>(cuadrado-lista L1)(9 16 25 1)=>(suma-lista L2)=>(suma lista L2)6=>(multiplica-listas L1 L2)(3 4 10 -2)

Page 60: Programación_Lisp_2008.229135104

(define (aplica f L) Más Ejemplos(define (aplica f L)(if (null? L) '()

(cons (f (car L)) (aplica f (cdr L)))))(cons (f (car L)) (aplica f (cdr L)))))

(define (c enta pa es L)(define (cuenta-pares L)(if (null? L) 0

(if (= (modulo (car L) 2) 0)(+ 1 (cuenta-pares (cdr L)))(+ 0 (cuenta-pares (cdr L))))))

(define (invierte L)(if (null? L) '()(if (null? L) ()

(append (invierte (cdr L)) (list (car L)))))