Lenguajes de Programación Programación funcional

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

Tema 3.- Predicados y sentencias condicionales

Programación Funcional Lisp-Scheme

4.7 Operaciones sobre Objetos en Scheme

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

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

DESCRIPCIÓN ESPECÍFICA NÚCLEO: COMERCIO Y SERVICIOS SUBSECTOR: INFORMÁTICA

Algoritmos y programas. Algoritmos y Estructuras de Datos I

Agradecimientos. Nota de los autores. 1 Problemas, algoritmos y programas 1

Generación de Código Intermedio

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

Un. VI. Generador de código intermedio.

ALGORÍTMICA. Dpto. Ingeniería de Sistemas y Automática Facultad de Ciencias Universidad de Valladolid.

Informática. JavaScript: Lenguaje de programación. Fco J. Martín Mateos Carmen Graciani

UNIVERSIDAD AUTONOMA DE QUERETARO Facultad de Informática

Bloque II. Elementos del lenguaje de programación Java

PHP: Lenguaje de programación

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

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

Unidad II: Análisis semántico

JavaScript Básico. Elementos Básicos: Comentarios: Literales: Valores que puede tomar una variable o una constante.

Fundamentos PHP. El término puntuación nos referimos a la sintaxis usada en PHP para la terminación de una línea de código (;)

Introducción a Python. Cecilia Manzino

MISIÓN UNIVERSIDAD DEL ISTMO VICERRECTORIA ACADÉMICA PROGRAMA ANALÍTICO

Tipos de datos algebraicos

Programación estructurada (Tipos, operadores y expresiones)

Controla el flujo de tokens reconocidos por parte del analizador léxico. 4.2 Introduccion a las gramaticas libres de contexto y arboles de derivacion

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

Componentes Básicos. InCo. InCo Componentes Básicos 1 / 28

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

Semántica: principales usos. Semántica: principales enfoques. Semántica Operacional. Sintaxis abstracta de un lenguaje (sujeto) Semántica Operacional

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

Semántica Denotacional

Programación de Computadores 4 Iteraciones y Decisiones. Prof. Javier Cañas. Universidad Técnica Federico Santa María Departamento de Informática

Esquemas repetitivos en Fortran 90. Esquemas repetitivos en Fortran 90. Esquemas repetitivos en Fortran 90. Tipos de Esquema

Ficha de Aprendizaje N 13

Guía práctica de estudio 05: Pseudocódigo

SISTEMAS INFORMÁTICOS PROGRAMACION I - Contenidos Analíticos Ing. Alejandro Guzmán M. TEMA 2. Diseño de Algoritmos

PROGRAMA: COMPUTACION I

UNIDAD ACADÉMICA PROFESIONAL TIANGUISTENCO

Tipos Abstractos de Datos

VARIABLES, CONSTANTES Y EXPRESIONES ASIGNACIÓN. TIPOS ELEMENTALES. PRECEDENCIA DE LOS ESTRUCTURAS DE CONTROL. CONDICIONAL E

El lenguaje C. 1. Identificadores, constantes y variables

Secuencias en Python. Introducción a la Computación Clase 11 Patricia Borensztejn

Compiladores y Lenguajes de Programación. Maria de Guadalupe Cota Ortiz

Metodologías de Programación II Introducción

ÁRBOLES DE SINTAXIS. Los nodos no terminales (nodos interiores) están rotulados por los símbolos no terminales.

Manual de Lisp para IACS (Curso 91 92)

Estructuras de Control

Principios de Computadoras II

Informática General 2016 Cátedra: Valeria Drelichman, Pedro Paleo, Leonardo Nadel, Norma Morales

AC2 - Arquitectura de Computadores II

Evaluación de los aprendizajes Elabora un cuadro comparativo con las principales características del lenguaje de programación Java.

Es un lenguaje estructurado, tiene una abundante cantidad de operadores y tipos de datos.

Verificación de programas. Algoritmos y Estructuras de Datos I. Semánticas formales: Primer cuatrimestre de 2016

UNIVERSIDAD NACIONAL DE SAN ANTONIO ABAD DEL CUSCO

Conceptos básicos sobre gramáticas

4. Operadores Operador asignación

Tema 5. Soporte lógico de computadoras.

PASCAL. Repaso de Pascal Introducción a Python. Pascal. Pascal - introducción. Pascal Declaraciones: Variables. Pascal Declaraciones: Tipos 07/04/2015

Exterior del algoritmo. Entorno. Usuario. Procesador. Escribir. v1 v2 v3. Leer. <acción> {; <acción>}

FUNDAMENTOS DE INFORMÁTICA

Algoritmos. Diagramas de Flujo. Informática IV. L. S. C. Heriberto Sánchez Costeira

Abstracción de Datos y

TÍTULO: MATEMÁTICA DISCRETA Y LÓGICA Disponibilidad

2. Estructuras condicionales

Apunte Laboratorio ALPI - El lenguaje de programación Pascal

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

Programcaión Básica. Secuencias de Control y Repetición. Arturo Vega González.

Introducción a la programación: Contenido. Introducción

Nombres, Ligaduras, Chequeo de Tipos y Alcance. Luis Garreta (Basados en el libro de Robert Sebesta)

UNIVERSIDAD DE SAN CARLOS DE GUATEMALA FACULTAD DE INGENIERIA ESCUELA DE CIENCIAS Y SISTEMAS

Programación I Recursividad.

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

Área: INFORMÁTICA. Saber- Saber: Identificar DFD como herramienta para escribir los algoritmos de forma lógica.

Metodología y Tecnología de la Programación

Contenido. Prefacio Orígenes de la programación orientada a objetos... 1

Sentencias de Procesamiento Iterativo: while y do-while

TUTORIAL PSEINT. Ing. Ronald Rentería Ayquipa. Fundamentos de Programación

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

Lenguaje C. República Bolivariana de Venezuela Fundación Misión Sucre Aldea Fray Pedro de Agreda Introducción a la Programación III

Diseño de Compiladores I. Estructura General de un Compilador

TEMA 3: ANÁLISIS SEMÁNTICO

INICIACIÓN A LA PROGRAMACIÓN 1ª parte

ESTRUCTURAS DE CONTROL

1. Computadores y programación

Programación Orientada a Objetos Profr. Pedro Pablo Mayorga

PROGRAMACIÓN ORIENTADA A OBJETOS (L40629) Sabino Miranda-Jiménez

Introducción a Java. Introducción a Java. Programación I

Transcripción:

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 secuencia de instrucciones El valor de retorno se obtiene a través de una serie de manipulaciones de estado Existencia de estado implica posibles efectos laterales Consecuencia de la arquitectura de von Neumann

Concepto de función En matemáticas: Una función es un mapeo de los elementos de un conjunto a los de otro: f : A B Generalmente descrita por una expresión o una tabla de valores Evaluación controlada por recursión y expresiones condicionales Libre de efectos laterales

Influencia del paradigma imperativo en la programación Lenguajes imperativos están diseñados para explotar la arquitectura del computador Apego a la arquitectura es una restricción innecesaria al proceso de desarrollo de software Lenguajes diseñados según otros paradigmas son impopulares debido a penalizaciones de rendimiento Máquina de Turing: modelo matemático para estudiar capacidades y limitaciones del computador

Fundamentos de los lenguajes funcionales Objetivo: emular las funciones matemáticas lo más posible. No se usa variables ni asignaciones. Repetición a través de recursión. Transparencia referencial. Funciones son objetos de primera clase. Un programa consiste de definiciones de funciones y aplicaciones de ellas.

Funciones Funciones simples Ejemplo: cubo(x) x x x x representa cualquier valor del dominio, pero está fijo en un elemento específico durante la evaluación Durante la evaluación, cada aparición de un parámetro está ligada a un valor y es considerada constante Notación lambda para funciones anónimas: λ(x) x x x Evaluación de una función anónima: ( λ(x) x x x ) (2) = 8

Funciones Formas funcionales (funciones de mayor orden) Reciben funciones como parámetros, o entregan funciones como resultado. Por ejemplo: composición ( f g ) (x) = f ( g(x) ) construcción aplicar a todo [ g, h, i ] (x) = ( g(x), h(x), i(x) ) α ( j, (x, y, z) ) = ( j(x), j(y), j(z) )

Comparación entre un programa imperativo y uno funcional Problema sencillo: aplicar dos funciones a una lista de valores Programa imperativo: target [] for i in source do t 1 g(i) t 2 f (t 1 ) target.append(t 2 ) end for Distintas versiones funcionales del mismo programa: target α(f ( g, source) target α λ(x) f ( g(x) ) ), source [ target f ( g(i) ) ] i source

Introducción a Scheme Características: dialecto de LISP sintaxis y semántica simples nombres tienen ámbito estático no es puramente funcional

Funcionamiento del intérprete de Scheme Entorno interactivo implementa un ciclo lectura-evaluación-escritura Se puede cargar las expresiones desde un archivo para facilitar el desarrollo. Las llamadas a funciones se evalúan así: 1. se evalúa los parámetros; 2. se aplica la función sobre los parámetros.

Funcionamiento del intérprete de Scheme Ejemplo de sesión interactiva 12 > 12 ( 1 2 3 4) > (1 2 3 4) (+ 1 2 3) > 6 ( string append h o l a mundo ) > h o l a mundo

Sintaxis del lenguaje Scheme utiliza la misma sintaxis para: 1. listas: (1 2 3 4 5) 2. llamadas a función: (max 43 23 15 58 2 1) 3. formas sintácticas: ( i f (< x 0) x ( x ) )

Constantes literales Valores literales pueden ser: números enteros, reales, racionales y complejos: 123456789 3.14159 22/7 +27.0 3.0 i 5. 0 @3. 0 strings: Hola mundo caracteres: #\a #\space booleanos: #t #f

Listas Notación de listas: ( a b c d ) Los elementos pueden ser de cualquier tipo: ( 1. 0 Hola mundo 3) Las listas se pueden anidar: ( a ( b c ) ( d e ( f ) g ) ) Las listas se tratan como objetos inmutables

Representación interna de las listas implementadas como listas enlazadas los nodos se llaman pares o celdas cons el final de una lista se marca con la lista vacía Figura: Representación de (1 2 3 4 5)

Representación interna de las listas implementadas como listas enlazadas los nodos se llaman pares o celdas cons el final de una lista se marca con la lista vacía Figura: Representación de (1 (2) (3 (4 5 6) (7)) ((8)))

Celdas cons Las celdas cons son el tipo de datos estructurado fundamental de Scheme. El campo izquierdo de una celda se denomina el car, y el campo derecho, el cdr. En una lista enlazada propia, las celdas tienen: un valor en el car; una referencia a una lista en el cdr.

Celdas cons Las funciones car y cdr obtienen el car y el cdr de una celda. La función cons permite crear una celda cons definiendo su car y su cdr, y por lo tanto se puede usar para crear listas enlazadas. ( c a r ( 1 2 3 4 5 ) ) > 1 ( c dr ( 1 2 3 4 5 ) ) > (2 3 4 5) ( cons a ( b c d ) ) > ( a b c d )

Listas impropias Una lista es impropia cuando el cdr de su última celda no es la lista vacía. Las listas impropias se representan usando la notación de par con punto. Figura: Representación de (1 2 3 4. 5)

Listas impropias Una lista es impropia cuando el cdr de su última celda no es la lista vacía. Las listas impropias se representan usando la notación de par con punto. Figura: Representación de ((2 (3. 4) 5). 1)

Listas impropias Una lista es impropia cuando el cdr de su última celda no es la lista vacía. Las listas impropias se representan usando la notación de par con punto. Figura: Representación de ((((). 3). 2). 1)

Llamadas a funciones Llamadas a funciones utilizan la misma notación que las listas: ( f u n c i o n arg 1 arg 2... arg N ) Para evitar que una lista sea evaluada como función, se utiliza el operador de citado: ( a b c d ) e r r o r : a no e s una f u n c i o n ( quote ( a b c d ) ) > ( a b c d ) ( a b c d ) > ( a b c d )

Funciones aritméticas Scheme provee las funciones aritméticas elementales +,, y /: (+ 2 3) > 1 ( 1 2 3 4 5) > 120 (+ ( 3 3) ( 4 4 ) ) > 25 ( (/ 81 9) ( ) (+)) > 8 Notación prefija evita ambigüedad en la evaluación.

Funciones anónimas La forma sintáctica lambda permite definir funciones anónimas. Sintaxis: ( lambda ( arg 1 arg 2... ) e x p r 1 e x p r 2... ) Ejemplo: ( lambda ( x y ) (+ ( x x ) ( y y ) ) ) > #<procedure > ( ( lambda ( x y ) (+ ( x x ) ( y y ) ) ) 3 4) > 25

Sintaxis alternativas de lambda Guarda en args la lista de todos los argumentos: ( lambda a r g s e x p r 1 e x p r 2... ) Guarda en rest todos los argumentos adicionales: ( lambda ( arg 1... arg N. r e s t ) e x p r 1 e x p r 2... )

Ligados locales La forma sintáctica let establece ligados de nombres locales. Nombres ligados con let son visibles sólo en el cuerpo del let. Sintaxis: ( l e t ( ( v a r 1 v a l 1 ) ( v a r 2 v a l 2 )... ) e x p r 1 e x p r 2... ) Ejemplo: ( l e t ( ( a 17) ( b 31)) (+ ( 1/2 a b ) ( 1/3 a b ) ) ) > 439.166666666667 ( ( lambda ( x y ) ( l e t ( ( x squared ( x x ) ) ( y squared ( y y ) ) ) ( s q r t (+ x squared y squared ) ) ) ) 5 12) > 13.0

Definiciones de nivel superior La forma sintáctica define liga un nombre a una expresión. Sintaxis: ( d e f i n e nombre e x p r ) Ejemplo: ( d e f i n e n 25) ( d e f i n e s q u a r e ( lambda ( x ) ( x x ) ) ) ( s q u a r e n ) > 625

Expresiones condicionales simples La forma sintáctica if permite evaluar una expresión de manera condicional. Sintaxis: ( i f c o n d i c i o n c o n s e c u e n c i a a l t e r n a t i v a ) Ejemplo: ( d e f i n e s i g n o ( lambda ( x ) ( i f (>= x 0) p o s i t i v o n e g a t i v o ) ) ) ( s i g n o 2) > n e g a t i v o ( s i g n o 5) > p o s i t i v o

Expresiones condicionales múltiples La forma sintáctica cond permite evaluar una expresión usando distintos casos. Sintaxis: ( cond c l a u s u l a 1 c l a u s u l a 2... ) Cada cláusula tiene alguna de estas formas: 1. (condicion) 2. (condicion expr 1 expr 2...) 3. ( condicion => expr) La última cláusula puede tener la forma: 4. ( else expr 1 expr 2...)

Ejemplo de uso de cond ( d e f i n e income tax ( lambda ( income ) ( cond ((<= income 10000) ( income. 0 5 ) ) ((<= income 20000) (+ ( ( income 10000). 0 8 ) 5 0 0. 0 0 ) ) ((<= income 30000) (+ ( ( income 20000). 1 3 ) 1 3 0 0. 0 0 ) ) ( e l s e (+ ( ( income 30000). 2 1 ) 2 6 0 0. 0 0 ) ) ) ) )

Evaluación de valores de verdad Todos los objetos son considerados verdaderos, excepto #f. Existen las formas sintácticas and, or y not. and y or hacen cortocircuito. En general, los predicados lógicos tienen nombres terminados en?.

Ejemplos de valores de verdad ( i f 1 t r u e f a l s e ) > t r u e ( i f ( ) t r u e f a l s e ) > t r u e ( i f #f t r u e f a l s e ) > f a l s e ( not #t ) > #f ( not f a l s e ) > #f ( or ) > #f ( or #f #t ) > #t ( or #f a #t ) > a

Ejemplos de predicados lógicos (< 1 2 3 4 5) > #t ( n u l l? ( ) ) > #t ( n u l l? ( 1 2 3 ) ) > #f ( p a i r? ( 8. 2 ) ) > #t ( eqv? 3 2) > #f ( number? 15) > #t ( l i s t? Veamos s i soy una l i s t a... ) > #f

Recursión simple En Scheme, la iteración se hace usando recursión. La recursión es más general que construcciones tipo for o while, y elimina la necesidad de usar variables de control. Una función recursiva debe tener: 1. un caso base, y 2. un paso de recursión. Ejemplo: ( d e f i n e length ( lambda ( l s ) ( i f ( n u l l? l s ) 0 (+ 1 ( length ( c dr l s ) ) ) ) ) ) ( length ( ) ) > 0 ( length ( a b c ) ) > 3