You are on page 1of 7

Paradigmas y lenguajes de programación representativa.

La programación funcional
La programación funcional, o mejor dicho, los lenguajes de programación funcionales, son
aquellos lenguajes donde las variables no tienen estado — no hay cambios en éstas a lo largo del
tiempo — y son inmutables — no pueden cambiarse los valores a lo largo de la ejecución. Además
los programas se estructuran componiendo expresiones que se evalúan como funciones. Dentro
de los lenguajes funcionales tenemos Lisp, Scheme, Clojure, Haskell, OCaml y Standard ML, entre
otros. Estos lenguajes están diversidad de tipificación, donde se encuentran lenguajes dinámicos,
estáticos y estáticos fuertes.

En los lenguajes funcionales las instrucciones cíclicas como for, while y do-while no existen. Todo
se procesa usando recursividad y funciones de alto orden. Esto se debe a los fundamentos
matemáticos de la mayoría de los lenguajes funcionales, principalmente con bases en el sistema
formal diseñado por Alonzo Church para definir cómputos y estudiar las aplicaciones de las
funciones llamado Cálculo Lambda. En este sistema formal se puede expresar recursividad en las
funciones, y entre otras cosas interesantes, se pueden expresar combinadores — funciones sin
variables libres — como el Combinador de Punto Fijo o Y-Combinator, que expresa recursividad sin
hacer llamadas recursivas. En el Cálculo Lambda existen tres transformaciones esenciales, la
conversión α, la reducción β y la conversión η. En la conversión α se sustituyen los nombres de las
variables para dar más claridad a la aplicación de las funciones, por ejemplo evitando duplicados
en sus nombres. En la reducción β se traza el llamado de las funciones sustituyendo las funciones
por sus expresiones resultantes. Finalmente en las conversiones η se busca las equivalencias de
trazado de funciones sustituyéndolas por sus equivalentes. Estas transformaciones también
pueden ser aplicadas en los lenguajes funcionales — o en su mayoría — dando lugar lenguajes que
cuentan con una gran expresividad y consistencia.

Los lenguajes funcionales proporcionan:

 Facilidades de abstracción sofisticadas.
 Sistemas de módulos.
 Soluciones “puras” para la integración de facilidades de I/O en la programación
declarativa.
 Además de técnicas y estrategias eficientes para la ejecución de los programas.

Características:

 Transparencia referencial. Al no haber variable, no hay efectos laterales, es decir,
al ejecutar la función (aunque ya hemos visto que el concepto de ejecutar no existe
como tal) no cambiará nada fuera del entorno de ésta. Tampoco dependerá para
nada de lo que haya en ese entorno. Se dice que una función tiene transparencia

una tras otra.  Elegancia. Esto permite cosas como el código Haskell take 5 [1. el alto nivel hace que los errores lo tengan difícil para esconderse por el código. está en Haskell. En programación funcional esto es siempre así por definición. Para una mente acostumbrada a lo imperativo esto cuesta de entender.. más se potencian estas características. como la entrada/salida o los números aleatorios. El código más artístico que he visto nunca. los cinco primeros números. sólo se genera lo que se necesita. Los lenguajes funcionales implementan muchísimos mecanismos de abstracción que te hacen la vida muy. referencial si.  Altísima abstracción. Esto facilita además…  Facilidad para las pruebas y la depuración. mónadas… Las inevitables operaciones que no son puramente funcionales. muy feliz. Esto puede redundar en una ejecución más eficiente y un código más claro y cercano al matemático. produce siempre la misma salida. cuanto más abstracto es un lenguaje. más concisos y más bellos que sus contrapartidas en lenguajes imperativos (incluso en preciosidades como Python o Ruby). Gracias a la transparencia referencial. Además. Al no tener que seguir una serie de órdenes. quedan envueltos en abstracciones que resuelven la papeleta con elegancia. para un valor de entrada. polimorfismo en muchos niveles.]. hacer unit testing en lenguajes imperativos es trivial. la ausencia de entorno y de estado permite que. que significa «coger los cinco primeros números de una lista infinita de números empezando por el 1». esto llevaría a un bucle infinito mientras se genera la lista. en este caso. Esto permite la…  Evaluación perezosa (Lazy evaluation). En un lenguaje imperativo. functores. flexibilidad. con diferencia. si estás leyendo una función. algunos los lenguajes funcionales sólo evalúan lo que les es requerido en cada momento. Un brutal sistema de tipos de datos. Por lo general. por lo que suelen salir programas muy fiables. legibilidad. . y un montón de nuevos conceptos como funciones de orden superior. por lo que los programas funcionales suelen ser más claros. En Haskell. sin preocuparte de más. sólo tengas que retener en tu cabeza esa función. Además. así que atención.

Uso de lenguaje Lisp: Potencia: (Defun potencia (base exponente) (if (= exponente 0) 1 (* base (potencia base (. el código fuente de lisp está compuesto de listas. Una de las estructuras de datos importante de Lisp son las listas encadenadas. El nombre Lisp viene de "LISt Processing" (Proceso de LIStas).exponente 1))))) POTENCIA Break 101 [103]> (POTENCIA 1 2) 1 Break 101 [103]> (POTENCIA 2 2) 4 Break 101 [103]> (POTENCIA 2 5) 32 Break 101 [103]> (POTENCIA 3 3) 27 Break 101 [103]> (POTENCIA 3 3) Factorial: Break 114 [117]> (defun factorial (n) (if (= n 0) 1 (* n (factorial (. los dialectos de Lisp más ampliamente conocidos son el Scheme y Common Lisp.n 1))))) FACTORIAL Break 114 [117]> (FACTORIAL 5) 120 .Lisp Lisp es un lenguaje tipo funcional. es el segundo lenguaje de alto nivel más viejo. Es un lenguaje útil para desarrollar la inteligencia artificial.

La computación con información parcial. una combinación de la unificación y reducción como mecanismo de evaluación que subsume a la reescritura y a SLD-resolución. hacer razonamientos. La semántica operacional de los lenguajes integrados esta usualmente basada en narrowing. La programación lógica La programación lógica es aquel tipo de programación que permite al software “razonar”. Algunos campos donde este tipo de lenguajes es aplicado son en la implementación de Sistemas Expertos (programas que generan una respuesta o una recomendación sobre el tema para el que están implementados) o para la Generación de nuevos Teoremas (dadas una serie de reglas. ALF está basado en “cláusulas de Horn” (por eso es programación lógica) pero también en funciones y ecuaciones (y por esto es también programación funcional). se ha demostrado que las ventajas de estos estilos pueden combinarse de manera efectiva y útil sobre un lenguaje único. Al igual que Prolog.…). Sin embargo. Básicamente. por ejemplo. de tipo deductivo o inductivo. ALF (Another logical framework) Este lenguaje combina la programación lógica con la programación funcional (funcional – basado en la evaluación de expresiones y funciones matemáticas más que en la utilización de comandos como. el sistema es capaz de hacer razonamientos. propiedades de esas entidades y relaciones de unas entidades con otras. Dada una base de datos consistente en un conjunto de entidades. este proceso se expresa de la siguiente forma: Resultados = reglas + hechos Donde entendemos que “hechos” es el conjunto de datos que conoce el sistema a priori(o que va adquiriendo a lo largo de su ejecución) y “reglas” son un conjunto de operaciones que se pueden aplicar a dichos datos para sacar un resultado lógico.Están provistos de facilidades de búsqueda de soluciones. Los lenguajes lógico funcionales modernos ofrecen características de ambos estilos. Los lenguajes lógicos permiten: . . generan teoremas). . esto es.

que son más eficientes (“el final de la expresión que se evalúa primero siempre es un cierre de paréntesis. se sustituye todo él por el resultado al que se ha llegado. es un archivo de la librería predefinida. y se sigue procesando el siguiente paréntesis”). Además ALF usa “backtracking” con búsqueda en profundidad en el árbol de derivaciones. Como el proceso de “narrowing” puede ser largo. el primer cierre y después de evaluar esta expresión. ALF usa reglas de resolución para evaluar los literales y reglas de “estrechamiento” (“narrowing”) para evaluar las expresiones funcionales. En este caso. Actualmente. hacen que la búsqueda sea mucho más eficiente. Estos dos pasos previos. en el que se define lo que es un vector y sus propiedades. puedes poner una expresión funcional como si fuese un predicado y cualquier predicado puede ser introducido como condición en cualquier ecuación. que es una representación del lenguaje.En ALF. las expresiones sufren un proceso de reescritura (“rewriting”) antes de ser procesadas por las reglas de “narrowing” y las ecuaciones cuyos dos lados de la igualdad no tengan el mismo nodo como origen son rechazadas (“rejected”). por lo que cualquier usuario puedo introducir sus funciones y modificarlo a su gusto. Además. Este lenguaje es “open Source”. se usan técnicas de “leftmost- innermost basic narrowing”. Aquí tenemos un ejemplo de este lenguaje. Los programas escritos en ALF. esta máquina virtual es un emulador y su implementación está basada en C. . Esto lo hace buscando en un árbol. se compilan y dan lugar a una serie de instrucciones de una máquina virtual basada en Warren Abstract Machine (WAM) con múltiples extensiones para soportar “narrowing and rewriting”. se puede mezclar expresiones y ecuaciones. La base del procesamiento de ALF es “resolution-narrowing-rewritingrejection”.

ya que es mucho más declarativo que Prolog. por ejemplo. Es un buen lenguaje para tareas de meta-programación.Gödel programming language Gödel es un lenguaje en el que las sentencias lógicas llevan un orden y en el que existe el polimorfismo. depuración. Está basado en módulos (que aceptan polimorfismo) y en tipos de datos (soporta enteros y racionales con una precisión infinita. y número en coma flotante) y tiene una amplia librería de módulos predefinidos. tales como compilación. análisis. verificación o transformación de programas. Como curiosidad. se puede destacar que este lenguaje no funciona en un entorno Windows. Ejemplo: Máximo Común Divisor .

com/paradigmas-de-programacion/programacion-funcional-un-enfoque- diferente-a-los-problemas-de-siempre .uc3m.genbetadev.mx/~acaceres/courses/itesm/lp/clases/lp14.it.cs.cinvestav. Bibliografía http://www.pdf http://computacion.es/jvillena/irc/practicas/estudios/Lenguajes_Logicos.pdf http://www.