Programación Funcional Lisp-Scheme

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

GUÍA BÁSICA DE SCHEME v.4

Abstracción de Datos y

Tema 3.- Predicados y sentencias condicionales

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

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

Manual de Lisp para IACS (Curso 91 92)

Valores Booleanos Interpretación #t Cierto #f Falso

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

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

Lenguajes de Programación

Funciones Tipos de funciones y Recursividad

Programación Interactiva

Implementación de algoritmos y cálculo simbólico

OPERACIONES CON POTENCIAS. Una potencia es un producto de factores iguales. Está formada por la base y el exponente.

TEMARIO PRESENTACIÓN 7 MÓDULO I 17 EXPRESIONES ALGEBRAICAS 19

Estructuras de control

Isabelle como un lenguaje funcional

sumas = 58 = 48 = 73 = 59 =

Programación 1 - Práctica 0, recargada.

ESCUELA POLITÉCNICA SUPERIOR PRÁCTICA 2: EXPRESIONES, PRINTF Y SCANF

Tema 4: Procedimientos y estructuras recursivas

Semántica Denotacional

Metodología de la Programación II. Recursividad

Exponencial, lineal y logarítmico

Ejercicios Tema 6. Funciones

Operaciones de números racionales

Guía práctica de estudio 05: Diagramas de flujo

La raíz n-ésima de un número, es. Y, al igual que la simplificación de las raíces cuadradas, podemos simplificar las raíces n-ésimas.

ANEXO XVII DE LA RESOLUCION N

Tema 3: Recursión. Índice

Introducción a Haskell. El lenguaje Haskell

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

Rolando Burgos Cárdenas MANUAL DE REFERENCIA RAPIDA DE LISP.

PHP: Lenguaje de programación

LISP I. Programación recursiva frente a iterativa. Características de la programación recursiva:

Tema: Funciones, Procedimientos y Recursividad en C#.

Curso 0 de Informática

TECNICO SUPERIOR EN INFORMÁTICA EMPRESARIAL MÓDULO INTRUCCIONAL

Estructura general de un programa

Curso de Java Introducción a la Programación III

Inteligencia Artificial: Prolog

Carlos A. Rivera-Morales. Precálculo 2

TEMA 3. NÚMEROS RACIONALES.

LENGUAJE DE PROGRAMACION UNO.

2 INTRODUCCIÓN A LISP

Capítulo 5. Los números reales y sus representaciones Pearson Education, Inc. Diapositiva 5-4-1

Introducción rápida a la programación (estructurada ) con C++

Un identificador le da nombre único a un elemento en un programa (Variables, procedimientos, etc.). No puede contener operadores como + - * /

Manual de turbo pascal

Recursos. Temas. Tiempo. Evaluación. Competencias:

Tema 7. El sistema de clases

Operaciones con números racionales. SUMA/RESTA.

Base de datos relacional. Diccionario ABAP. Modelo Base de datos. Mundo real

Módulo 8: Primitivas en Pascal

Sistemas Operativos sesión 13: shell-scripting

Programación n Orientada a Objetos Sentencias Java Parte I. Ing. Julio Ernesto Carreño o Vargas MsC.

Construcciones del Lenguaje Java

Tema 5: Abstracción. Índice

Créditos institucionales de la UA: 6 Material visual: Diapositivas. Unidad de competencia I Conceptos preliminares

FRACCIONES PARCIALES. Procedimiento para: Descomposición en fracciones parciales en la cual cada denominador es lineal.

Aritmética: Fracciones

Escuela Politécnica Superior de Ingeniería Departamento de Ingeniería Informática

Estructuras de Control

Alumno/a:... Lo primero que debes tener en cuenta cuando trabajes con radicales es que no son más que potencias con exponente fraccionario.

GUIA DE EJERCICIOS N 1 LENGUAJE C# Página 1 de 5. Instructor: Ing. Néstor Raúl Suarez Perpiñan

Declaración de Procedimientos

Unidad 2: Ecuaciones, inecuaciones y sistemas.

Expresiones Aritméticas

No pueden empezar por un número, es decir, el primer caracter del nombre de la variable ha de ser una letra o _


Tema 2 Conceptos básicos de programación. Fundamentos de Informática

Tema 1 Programación Funcional

Taller #1 (versión del 18 de septiembre de 2009) Programación básica y aproximación al paradigma orientado a objetos

Principios de Computadoras II

OPERADORES Y EXPRESIONES

Control de Flujo. Estructuras de Control! Experiencia Educativa de Algorítmica CONTROL DE FLUJO

El lenguaje C. 1. Identificadores, constantes y variables

Elementos de un programa en C

LÍMITES. Ing. Ronny Altuve

UNIVERSIDAD NACIONAL DE SAN ANTONIO ABAD DEL CUSCO

Que es PHP? Que se puede hacer con PHP? Sintaxis del lenguaje. Variables. Operadores básicos. Condicionales. Ciclos.

Profesor(a): Ing. Miriam Cerón Brito

Nano Taller de Python

CONTENIDOS: ALGEBRA. 1. SISTEMA DE LOS NÚMEROS REALES

Programación Estructurada

Preparación para Álgebra 1 de Escuela Superior

Introducción a la programación: Algoritmos

Tema 2. El lenguaje JAVA

GUIA ALGEBRA PARTE I. Ejercicios básicos de aritmética EJERCICIOS

Estructuras de Repetición (Repita para)

Ejercicios del Tema 3. Fundamentos de la programación en ensamblador

11. Integrales impropias

GUIA ALGEBRA PARTE I. Ejercicios básicos de aritmética QUEBRADOS

Paso de Parámetros a una Función

UNIDAD 10. DERIVADAS. APLICACIONES DE LAS DERIVADAS

MATEMÁTICAS - 6º curso

Lenguaje C. Tipos de Datos Simples y Estructuras de Control

Semana de las Matemáticas e Ingeniería. Desarrollo de algoritmos recursivos empleando la aplicación PseInt

2.3 DEFINICIÓN DE LENGUAJES ALGORÍTMICOS

Transcripción:

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))) (+ (- 107) 6)) 57 => (define tamaño 2) tamaño => tamaño 2 => (+ 3 tamaño) 5 => (* 2 tamaño) 4

Ejemplo: => (define Pi 3.14159) pi => (define radio 10) radio => (define circunferencia (* 2 Pi radio)) circunferencia => circunferencia 62.8318

Funciones en Lisp Ejemplo: => (define (cuadrado d x) (* x x)) => (cuadrado 2) 4

Ejemplo: =>(define (circunferencia radio) (* Pi radio)) =>(circunferencia 4) 12.56636

Sintaxis de las funciones: (define (<nombre> <parámetros formales>) (cuerpo))

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

Ejemplo: =>(define (f a) (suma_cuadrados (+ a 1) (- a 1))) =>(f 5) 52

El modelo de sustitución para evaluar funciones (f 5) (suma_cuadrados (+ 5 1) (- 5 1)) (+ (cuadrado (+ 5 1)) (cuadrado (- 5 1))) (+ (* (+51)(+51))(* 5 1)) ( (- 51)(- 5 1))) (+ (* 6 6) (* 4 4)) (+ 36 16) 52

Sintaxis del if (if <predicado> <consecuencia> <alternativa>) ti

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

Expresiones condicionales y predicados Sintaxis i del cond (cond (<p 1 > <e 1 >) (<p 2 ><e 2 >)... (<p n > <e n >) (else <e n+1 >))

Ejemplo: =>(define (f x) (cond ((>= x 2) (+ (* x x) 1)) ((= x 0) 2) (else (* x x x)))) =>(f 3) 10

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

Recursión y Recursión Lineal Ejemplo 1:

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

Versión esó Recursiva ecus Lineal (Recursión só Lineal) ea) (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 o de Sustitución tuc (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:

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

Versión Recursiva Lineal (Recursión 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 o Parámetro 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 Anónimas, con la siguiente sintaxis: (lambda (<parámetros>) <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) 0 (+ (f a) (serie f (+ a 1) n)))) (define (serie1 a n) (define (serie1 a n) (serie (lambda (i) (/ i (+ (cubo i) 1))) a n))

Uso del let Sintaxis: (let ((<var 1 > <exp 1 >) (<var 2 ><exp 2 >)...... <var n > <exp n >)) <cuerpo>)

Ejemplo: Una función 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 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: (define (salario HT SPH) (lambda (x) (- (* HT SPH) (* (* HT SPH) x)))) =>((salario 10 100) 0.2) 800.0 =>(salario 10 100) #[compound 8896152]

Ejemplo: Escribiremos una función que calcula l la derivada d de una función, que como se sabe es una función definida como sigue: cuando h es pequeño.

Código: (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]

Pares y Aritmética Simbólica Lisp posee una estructura compuesta denominada par las cuales de manipulan con las funciones: cons, cdry car Ejemplos: =>(define x (cons 1 2)) x =>x (1. 2) x =>(car x) 2 1 1 =>(cdr x) 2...

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

=>(car (car z)) 1 =>(caar z) 1 =>(cdr (car z)) 2 =>(cdar z) 2 =>(cddr z) -8

Ejemplo: La aritmética de los Racionales Q ; CONSTRUCTOR (define (racional a b) (cons a b)) (define (denominador r) (cdr r)) (define (numerador r) (define (numerador r) (car r))

; 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))))

; DEFINE PRODUCTO DE NUMEROS RACIONALES (define (producto r1 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)) (* (denominador r1) (numerador r2))))

; IMPRIME NUMEROS RACIONALES (define (imprime r) (newline) (write (numerador r)) (write-char #\/ ) (write (denominador r)))

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

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

Listas Enlazadas vrs Pares =>(cons (cons 3 4) (cons 7 8)) ((3. 4) 7. 8) Primera 8 7 4 3 Esto no es una Lista

Listas Enlazadas vrs Pares =>(cons 3 (cons 4 (cons 7 (cons 8 '())))) (3 4 7 8) Primera 3 4 7 8 Esto si es una lista

La función para construir listas es: (list a1 a2 a3.... an) Ejemplo: =>(list 3 4 7 8) (3 478) ; es equivalente a (cons 3 (cons 4 (cons 7 (cons 8 '()))))

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

Operaciones es con listas define (longitud L) (if (null? L) 0 (+ 1 (longitud (cdr L))))) (define (n-esimo n L) (if (= n 1) (car L) (n-esimo (- n 1) (cdr L))))

(define (suma-lista L) (if (null? L) 0 (+ (car L) (suma-lista (cdr L))))) (define (pega L1 L2) (if (null? L1) L2 (cons (car L1) (pega (cdr L1) L2))))

(define (cuadrado-lista L) (if (null? L) '() (cons (* (car L) (car L)) (cuadrado-lista (cdr L))))) (define (multiplica-listas L1 L2) (if (null? L1) '() (cons (* (car L1) (car L2)) (multiplica-listas li li t (cdr L1) (cdr L2)))))

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

Más Ejemplos (define (aplica f L) (if (null? L) '() (cons (f (car L)) (aplica f (cdr L))))) (define (cuenta-pares es 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) '() (append (invierte (cdr L)) (list (car L)))))