2.- Modelo de Programación Funcional

2.1.- Introducción al modelo de programación
funcional.

El paradigma de programación funcional es uno de los fundamentales entre los llamados de programación declarativa. Como tal, permite aunar los componentes de especificación y programación en las tareas de solución automática de problemas.




Los lenguajes funcionales ofrecen al programador un buen número de recursos expresivos que permiten resolver problemas complejos mediante programas pequeños y robustos. Entre ellos cabe destacar: un sistema de tipos polimórficos que permite definir una amplia variedad de estructuras de datos de uso genérico, la posibilidad de definir funciones que aceptan otras funciones como argumentos y devuelven funciones como resultado, facilidades para definir y manipular estructuras de datos infinitas, un modelo computacional simple, claro y bien fundamentado, etc. De no menor importancia es la posibilidad de razonar, de forma sencilla, acerca de las propiedades de los programas: su corrección, su eficacia, su comportamiento en ejecución, ... Esto permite optimizar las tareas de implementación de los lenguajes funcionales.


Podemos encontrar, en casi todos los lenguajes de programación funcional, un núcleo común de conceptos y técnicas asentado sobre bases firmemente establecidas. En esta asignatura estudiamos los fundamentos de la programación funcional y su utilización en la definición de implementaciones correctas y eficientes de los lenguajes de programación que se enmarcan en este paradigma.


2.2.- El tipo de datos.

Los tipos básicos de datos, también llamados primitivos, muy a groso modo, se pueden agrupar en 3: Los tipos de datos numéricos, los lógicos y los de texto (o alfanuméricos).

Dentro del grupo de los tipos de datos numéricos, a su vez, destacan dos tipos: los enteros y los reales.

Entre los tipos de datos de texto hay que mencionar dos: el tipo carácter y el tipo cadena (cadena de caracteres, o string).
Puedes ver de forma más esquemática esta agrupación de tipos de datos.
Este esquema en realidad es mucho más extenso, ya que cada lenguaje tiene multitud de tipos de datos, pero como se mencionó anteriormente, ahora debes captar las nociones elementales de los tipos de datos, por tanto, en principio, es preferible que te centres en unos pocos, los más generales y comunes:
·         Tipo de dato entero: Son los números naturales positivos y negativos, más el cero. Se trata de un conjunto infinito de términos que en matemáticas usualmente se denomina "Z", compuesto por los números sin decimales. Cada término crece o decrece según para donde nos desplacemos en una unidad, por ejemplo 12, 13, 14, 15 o -3, -4, -5, -6. Son ejemplos 2, -4 y 0. En pseudocódigo se suele utilizar la palabra reservada "entero" para este tipo de datos.
·         Tipo de dato real: Son los que pueden tomar como valores a los números racionales o irracionales. Este tipo de datos admite decimales. En matemáticas se denomina conjunto "R" y es también un conjunto infinito de términos. En este conjunto entre dos términos siempre existen un número infinito de términos. Para éstos, en pseudocódigo, se usa la palabra reservada "real".
·         Tipo de dato lógico: Un dato lógico es aquel que sólo puede tomar valor verdadero o valor falso, es decir que algo se cumpla o no. Un ejemplo puede ser una puerta de paso, que puede estar abierta (asociamos por ejemplo verdadero) o cerrada (falso en este caso por oposición al convenio anterior). Para referenciar este tipo de datos en pseudocódigo se usa la palabra reservada "lógico".
·         Tipo de dato carácter: El conjunto de valores que representa este tipo de datos es el formado por cualquier carácter que pueda representar el ordenador. Normalmente se representan entre comillas, ya sean dobles o simples (dependiendo del lenguaje). En pseudocódigo, para este tipo de datos, se utiliza la palabra reservada "carácter".
·         Tipo de datos cadena: Una cadena es una secuencia de caracteres y se representa también normalmente entre comillas. Los espacios en blanco dentro del entrecomillado también son caracteres que forman parte de la cadena, por ejemplo "El gato" es una cadena de 7 caracteres. En pseudocódigo se usa la palabra reservada "cadena" para este tipo de datos.


2.3.- Funciones.

Un problema complejo se puede dividir en pequeños subproblemas mas sencillos. Estos subproblemas se conocen como “Módulos” y su complementacion en un lenguaje se llama subprograma (procedimientos y funciones).
Un subprograma realiza las mismas acciones que un programa, sin embargo, un subprograma lo utiliza solamente un programa para un propósito especifico.
Un subprograma recibe datos de un programa y le devuelve resultados (el programa “llama” o “invoca” al subprograma, este ejecuta una tarea especifica y devuelve el “control” al programa que lo llamo).
Función: Una función en matemáticas, es una operación que toma un o mas valores (argumentos) y devuelve un resultado (valor de la función para los argumentos dados). Por ejemplo:
F(X) = X / (1+X2)
Donde:
F ………….. Nombre de la función
X …………. Es el argumento (también conocido como parámetro formal)
Definición de funciones: Una definición de función se presenta de la siguiente manera:
Función nombre_funcion (p1, p2, …, pn)
Inicio
Bloque de instrucciones
Fin
Donde:
Función …………… Es la palabra clave que nos indica una definición de función.
Nombre_funcion ….. Es el identificador con el cual se reconoce a la función en el cuerpo del
algoritmo principal.
P1,p2,…,pn ……… Es el grupo de parámetros que define a la función.
Llamado a una función
Cuando definimos una función solo le indicamos al algoritmo que esta función existe, pero una definición de función no implica la realización de las instrucciones que la constituyen. Para hacer uso de una función, el algoritmo principal la debe llamar. Por ejemplo:
Función F(X)
Inicio
F = X /(1 + X^2)
Fin
Inicio
Imprimir “Este es el algoritmo principal”
Leer N
R = F(N) llamado de la función
Imprimir “El resultado de la función es:”,R
Fin


2.4.- Intervalos



1.- Concepto:

Los intervalos son subconjuntos de R (ICR). Se dice que I es un intervalo si y solo si es el conjunto de todos los números reales  que se comprenden entre otros dos llamados extremos que se puede dar real o ideal.

2.- Tipos de intervalo:

-       Intervalo cerrado:      

  
-       Intervalo abierto:


-       Intervalo semiabierto por la derecha:




-       Intervalo semiabierto por la izquierda: 




3.- Desigualdad:
    Es un enunciado que establece que un número es menor o mayor que otro.
    - Sea a,b y c números reales, entonces
    (a) si a < b, entonces a + - c > b + - c
    (b) si a < b y c > 0, entonces a x c <b x c
    (c) si a < b y c <0, entonces a x c > b x c
4.- Ejercicios:

    SI A ₌ ]-6;0[U]-1;7] , B ₌ ]-OO;2]U]5;9] Y U₌R , determine 
   A)     A∩B ₌ ]-6;2] U ]5;7]
         B)      AUB ₌ ]-00;9]
         C)      A-B ₌ ]2;5]
         D)     B-A ₌ ]-00;-6] U ]7;9]
         E)      (AUB)-(B∩A)₌ ]-00;-6] U ]2;5] U ]7;9]
         F)      (B-A)ᶜ ₌ [-6;7]U]9 ; +00

    
Inecuaciones de Primer Grado 
Las inecuaciones de primer grado con una incógnita se resuelven aplicando inversos aditivos (opuestos) o  inversos multiplicativos (recíprocos) para despejar la incógnita. Conviene dejar positivo el coeficiente de la incógnita.
A continuación veremos cómo se aplican las propiedades anteriores en la resolución de inecuaciones lineales de primer grado con una incógnita.
Ejemplo:  
                                             Resolver la inecuación: x – 2 < 3x – 6
  • Método 1: 
Primero sumemos –3x a ambos lados 
                x – 3x – 2 < – 6               
sumemos 2 en ambos lados
                x – 3x < 2 – 6 
multipliquemos por -1/2 a ambos lados. La desigualdad cambia en virtud de la propiedad 3
                -2x < -4               
                    x > 2    
 Observa que el signo cambió pues se multiplicó por un número negativo.
  • Método 2: 
                x – 2 < 3x – 6               
Conviene dejar la incógnita positiva, por tanto restaremos x a ambos lados 
                -2 < 3x – x – 6  
Sumamos  6 en ambos lados
                -2 <  2x – 6       
                     4 < 2x
                                2 < x


2.5.- Operadores

· En programación declarativa sólo existen valores, no hay referencias.

· La distinción entre valores y referencias es fundamental, sin embargo, en la programación imperativa.





2.6.- Aplicaciones de las listas 

En Scheme todos los datos compuestos se construyen a partir de las parejas. En concreto las listas se definen de una forma recursiva muy elegante como secuencias de parejas. Esta característica se remonta al origen del LISP en el que John McCarthy definió el concepto de S-expression e introdujo la notación del "." para definir una pareja.




2.7.- Evaluación perezosa.

Es una estrategia de evaluación que retrasa el cálculo de una expresión hasta que su valor sea necesario, y que también evita repetir la evaluación en caso de ser necesaria en posteriores ocasiones. Esta compartición del cálculo puede reducir el tiempo de ejecución de ciertas funciones de forma exponencial, comparado con otros tipos de evaluación.
Los beneficios de la evaluación perezosa son:
·         El incremento en el rendimiento al evitar cálculos innecesarios, y en tratar condiciones de error al evaluar expresiones compuestas.
·         La capacidad de construir estructuras de datos potencialmente infinitas.
·         La capacidad de definir estructuras de control como abstracciones, en lugar de operaciones primitivas.
Este método de evaluación es comúnmente implementado encapsulando cada expresión en una función que, cuando sea computada, devolverá el valor deseado de la expresión. De esta manera, cuando el resultado sea necesitado, la función creada será ejecutada para conseguirlo.
La evaluación perezosa puede también reducir el consumo de memoria de una aplicación, ya que los valores se crean solo cuando se necesitan. Sin embargo, es difícil de combinar con las operaciones típicas de programación imperativa, como el manejo de excepciones o las operaciones de entrada/salida, porque el orden de las operaciones puede quedar indeterminado. Además, la evaluación perezosa puede conducir a fragmentar la memoria.
La evaluación perezosa es frecuentemente combinada con memoización, tal y como lo describe Jon Bentley en Writing Efficient Programs1​ (Escribiendo Programas Eficientes). Después de que el valor de una función sea computado para un parámetro o una serie de estos, el resultado es almacenado en una tabla de consulta que está organizada por los valores de estos parámetros; la próxima vez que se le llama a la función, la tabla es consultada para determinar si el resultado para esa combinación de parámetros está disponible. Si es el caso, la función devuelve dicho resultado. Si no, la función es evaluada y otro elemento es añadido a la tabla para reutilización posterior.

Comentarios

Entradas populares de este blog

3.- Programación Lógica

1.- Conceptos Fundamentales