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
Publicar un comentario