Bienvenido al mundo paradigmático..!!

PARADIGMA : El joven conoce las reglas de los paradigmas, el viejo las excepciones..!!
Wilucha
Paradigmas
de Vida
Sistémico
Linguístico
Matemático

A los padres de los paradigmas
Bernstein, Kunh, Mac Carthy, Minsky, Moore, Newell,
Rochester, Samuel, Selfrige, Solomonoff, Simon, Von Neumann, ...

ASI NACE UN PARADIGMA . . .
Un científico cerró cinco monos en una jaula grande, en cuyo centro ubicó una escalera y en la cima de esta puso un montón de bananas.

Te preguntaste por qué; hacemos las cosas de una manera,
si quizás podemos hacerlas de otra.?
Pues bién . . .
cada, una de nuestras actividades diarias,..
está guiada por un paradigma..!!


Paradigma
Es mas facil desintegrar un atomo
que un preconcepto..!!

Albert Einstein

TEORIA DE LOS PARADIGMAS

Un paradigma puede ser :

Declarativo
Demostrativo
Funcional
Heuristico
Imperativo
Logico
Orientado Objeto
Procedimental

El término paradigma que según la historia anterior seria un modelo de comportamiento a imitar, se remonta a la época de los griegos, quienes le denominaban "Parâdeima", actualmente, según el diccionario al que consultes encontarás entre otros muchos, que el paradigma es . . .

Cuando cursaba una maestría, aprendí que estos conceptos comenzaron a madurar, cuando Thomas Kuhn alumbraba su genial obra que revolucionó el restringido ámbito de los historiadores y filósofos de la ciencia "La Estructura de las Revoluciones Científicas", del cual te destaco los siguientes aspectos:

Paradigma
Lo que se hace por amor
está más allá del bién y del mal.!
Nietzsche

  1. REINADO DEL PARADIGMA DE LA SIMPLICIDAD
    El paradigma de la simplicidad, dotado de:
    • Explicaciones simplistas.

    • Desarrollos expresadas en leyes deterministas.

    • Fundamentos basadas en modelos ideales.

    ...reinó desde el nacimiento de la ciencia moderna hasta casi nuestro siglo, siendo su gran referente la dinámica de Newton, caracterizada por...

    • Usar el método analítico.

    • Su inflexible búsqueda de unidades fundamentales.

    • El estudio de su comportamiento.

    • Explicar el comportamiento del conjunto, por ensamble de sus partes.

    A partir de estos aspectos se pergenian los grandes problemas conceptuales del siglo XX. Así, con:

    • Darwin
      En Francia, nace el desarrollo de la Teoría de la Evolución.

    • Fourier
      Nace el concepto de "Entropia" en su obra "Nueva Ciencia del Calor" que generará el concepto de la flecha del tiempo.

    Como por una parte el marco conceptual newtoniano ya era incapaz de abordar las problemáticas generadas por los avances de la biología, las ciencias sociales y la física; y por otra, los paradigmas para los científicos son como los expedientes para los jueces: "lo que no figura allí no existe..!!"; se impone la necesidad de plantear estos cambios, sus transformaciones y la complejidad alcanzadas, para ello, nacen las siguientes teorías que explican con metodologías no reduccionistaslos nuevos temas complejos:

    • Ludwig Von Bertalanffy
      Biologo que crea en 1945 la "Teoría General de Sistemas" para explicar el comportamiento del organismo como un todo. Plantea el "Problema de la Complejidad", cuestionando la teoría del conocimiento del positivismo lógico, manifestando al respecto:

      • Sin importar su status metafísico, la percepción no es un simple reflejo de las cosas reales.

      • El conocimiento no es solo una aproximación a la "verdad" o "realidad", sino una interacción entre cognoscente y cognoscendo, relacionados una gran variedad de factores biológicos, psicológicos, culturales, lingüísticos.

      Bertalanffy adopta los "Sistemas Abiertos" que intercambian materia, energía e información con el medio, como modelo general y la investigación posterior, propone "Sistemas Abiertos" como centro de gravedad de la investigación para explicar los modelos de interacción, irreductibles, complejos, multicausales y no lineales.

      Para el, la Teoría de Sistemas Abiertos, posee un alto grado de conexiones, pues relaciona los aspectos teóricos y tecnológicos de la "Cinética Química", con la "Termodinámica de Procesos Irreversibles" de Ilya Prigogine, con la fisiología y hasta con las ciencias sociales.

    • Ilya Prigogine
      Refuta al paradigma de la simplicidad siguiendo la lógica interna de sus investigaciones, con sistemas lejos del equilibrio que lo obligaron a desarrollar nuevas categorías conceptuales, para abordar los problemas de la complejidad, la transformación y la evolución de los sistemas que estudiaba.

      Enfocaba la problemática global de la complejidad y su interés en la reflexión epistemológica, produciendo así su acercamiento a los sistémicos, manifestado como un fructífero intercambio que madurará en el siguiente período evolutivo de la teoría de sistemas.

    • Dora Freíd Schnitman
      Adoptando un modelo sistémico alumbra su libro "Aspectos culturales de la terapia familiar".

    • Wiener
      En 1948 propone su trabajo sobre "Cibernética".

    • Shanon y Weave
      En 1949, expone sus trabajos sobre "Teoría de la comunicación".

    • Von Neumann y Morgenstern
      En 1949, plantean sus argumentos sobre la "Teoría del Juego".

    Así, la investigación enfatizó los aspectos de la "Teoría General de Sistemas" aceptando el añejo postulado aristotélico: "El todo es más que las partes", aplicado al organismo de seres vivos, al comportamiento individual, familiar o social, a los sistemas de comunicación, incluidos los lenguajes y en general a todo sistema complejo.

    Por ello, la "Teoría General de Sistemas" que rompe con el paradigma newtoniano de simplicidad y analiticidad para plantearse problemas relacionados con la complejidad e interacción, además de su naturaleza "Interdisciplinaria", es "Transdisciplinaria", porque abarca características muy generales que comparten sistemas muy diversos, tales como la:

    • Cibernética,

    • Teoría de autómatas,

    • Teoría de la información,

    • Teoría de control,

    • Teoría de conjuntos,

    • Teoría de grafos y redes,

    • Teoría de juegos y decisiones,

    • Teoría de las matemáticas relacionales,

    • Teoría de la computación y

    • .. muchas otras.

    El planteo sistémico consciente del cambio conceptual propuesto, donde la investigación ligada siempre a la reflexión epistemológica, cuestiona la omnipotencia del método analítico, ponderando a las redes de relaciones, sobre los elementos; a los bucles de retroalimentación, sobre la causalidad lineal y unidireccional.

    Volver al principio


  2. LLEGA LA CIBERNETICA..!!

    En un primer período de evolución, que va de sus orígenes hasta finalizar la década del sesenta, la investigación se centró en el objetivo de comprender el equilibrio dinámico debido, en buena parte, al gran enigma biológico respecto del mantenimiento de la estructura corporal.

    Sabemos que nuestras células se recambian permanentemente, pese a ello nos concebimos como un organismo más o menos estable, arruga más, arruga menos.

    Al respecto dice Schnitman:

    • "El desarrollo temprano de la cibernética y la teoría general de sistemas se caracterizaron por un énfasis en la estructura, en la adaptación, en el equilibrio dinámico, con el propósito de comprender cómo una organización dada podía ser estabilizada y mantenida por medio del cambio continuo"

    • "Sin embargo las estructuras vivientes y sociales no pueden ser estabilizadas permanentemente, también requieren una comprensión las transformaciones espontáneas; la sistémica integró progresivamente el estudio del cambio estructural y de la capacidad de transformaciones espontáneas del sistema como dominio necesario".

    Este segundo período de la sistémica se inicia con la década del'70 y su búsqueda fundamental es la comprensión del cambio.

    En este terreno los aportes de Prigogine han sido fundamentalmente relevantes, ya que su modelo de estructuras disipativas, sujetas a fluctuaciones internas y externas, que a partir de cierto valor crítico, o umbral, se amplifican y llevan a la formación de nuevas estructuras que permiten desarrollar nuevas categorías conceptuales y modelos que integren la dinámica del cambio, el azar y la necesidad, el mantenimiento y la transformación.

    Edgar Morin, desde sus investigaciones sociológicas y antropológicas, y también desde la reflexión epistemológica realizó valiosísimos aportes en este sentido, que se reflejan en su trilogía "El método".

    Morin, desde una perspectiva centrada en la complejidad, se orienta hacia una concepción bio-antro-cosmológica, en donde los niveles físico, viviente y social no sean compartimento s estancos sino que se articulen e integren.

    El pensar en torno al cambio y la evolución llevó en su desarrollo natural a que los investigadores se cuestionaran sobre las condiciones de producción del conocimiento, la aparición de novedades, la creatividad

    Volver al principio


  3. TAMBIEN LA RECURSIVIDAD..Y LOS BUCLES..!!

    La epistemología positivista se corresponde claramente con el paradigma de la simplicidad. El sujeto (científico) es un observador (neutral, objetivo) de una naturaleza que independiente (ajena a sus deseos y sufrimientos).

    El conocimiento es reflejo (en el sujeto) de la realidad que está allí afuera; el conocer no modifica esa realidad ya que el observador no interfiere en absoluto con su objeto de estudio.

    Esta concepción objetivista del conocimiento no fue cuestionada exclusivamente por Khun.

    Así, Ian Piaget realizó una crítica demoledora en sus investigaciones en psicología experimental y epistemología genética, desarrollando una postura constructivista del conocimiento donde el sujeto y objeto ya no son polos opuestos de una dicotomía, sino que ambos se construyen en el proceso de conocimiento.

    Ya en las primeras décadas del siglo, la propia física, a través de los principios de indeterminación de Heisemberg, introduce al observador dentro de la teoría científica.

    Aunque mucho más tarde, también la biología, especialmente la neurofisiología, con los aportes de McCulloch, Maturana, etc., confirman que no podemos prescindir del observador como parte del sistema de observación, desde la investigación de fenómenos fisiológicos.

    La cibernética da cuenta de este proceso de reflexión del conocimiento del conocimiento, donde para:

    • Para conocer el cerebro usamos...: el cerebro

    • Para conocer el lenguaje usamos...: el lenguaje

    O sea que la recursividad es la norma, donde no hay linealidad posible, sólo bucles.

  4. INTERDISCIPLINARIEDAD y la TRANSDISCIPLINARIEDAD

    Hasta Aquí hemos visto cómo se enlazan la teoría de sistemas, la reflexión epistemológica desde Khun a la cibernética, las teorías de Prigogine y Morino

    La teoría general de los sistemas nació como una perspectiva transdisciplinaria, que permite abordar sistemas complejos de cualquier clase.

    No constituye una disciplina en sí, sino una metadisciplina; pues más que una teoría sobre el mundo, es una teoría para desarrollar teorías.
    Esta últimas sí nos hablarán del mundo, y de nosotros hablando del mundo, y serán teorías sistémicas de áreas específicas.

    El quiebre del paradigma newtoniano, el surgimiento de distintas perspectivas y alternativas nos llevan a la necesidad de pensar sobre estos cambios, evoluciones y crisis que se expresan en la historia de las ideas (paradigmas), en la historia de las sociedad (culturas) y de los individuos que las co-forman (sujetos)

  5. EL REINO DE LOS PARADIGMAS DE PROGRAMACION

    En estos links, solo me refiero a conceptos aplicables a paradigmas generadores de la actividad informática, tomados como modelos algorítmicos de heurísticas destinadas a automatizar los procesos de digitalización de datos, de acuerdo al criterio del siguiente mapa conceptual:

    
                       ----------------------
                       | El PARADIGMA es |
                       ----------------------
                               |      
                        MODELO CONCEPTUAL
                               |
                          que guía un
                               |
                        PROCESO DE DISEÑO
                               | 
                         y determina un
                               |
                       FORMATO DE PROGRAMA         
    

    En tal ámbito, notarás que el paradigma de programación es la fuerza sinérgica que dinamiza la fascinante y atrapante sociedad digitalizada, a la que gustoso te doy la bienvenida...!!

    Antes de seguir con esto, te propongo conceptualizar como:

    • ALGORITMO:
      A la secuencia operativa diseñada para lograr un resultado predefinido, capáz de resolver una situación problemática en particular.

    • HEURÍSTICA:
      A la acción intelectual desarrollada para la generación de nuevas creaciones lógicas.

    Los sistémicos podríamos plantear un enfoque socio-global, afirmando que un paradigma es un modelo de comportamiento computacional para resolver problemas operacionales de los usuarios, dando lugar al desarrollo de dos grandes modelos paradigmáticos:

    • PARADIGMA DEL PODER O HEURISTICO: Generado en el sueño de Von Newmann, quién anhelaba aplicar las leyes mentales humanas, a la capacidad de la computadora, para resolver dinámicamente cualquier problema, aplicando sistemas eficientes de búsqueda dotadas de buenas heurísticas..!!

    • PARADIGMA DEL CONOCIMIENTO O EPISTEMOLOGICO: Plantea que cualquier problema solo será solucionable si se conoce y comprende integralmente su estructura operativa, proponiendo textualmente: "Un problema se resuelve según el conocimiento que se tenga de el..!!"

    Estos paradigmas promovieron el desarrollo de la Inteligencia Artificial, planteada como:

    • CIENCIA: Cuando analiza el estado del comportamiento inteligente, destinado a comprobar una teoría de inteligencia que explique el comportamiento natural de los seres inteligentes.

    • TECNOLOGIA: Cuando permite construir máquinas automáticas, denominados AUTÓMATAS capaces de resolver problemas, operando de manera similar al de los humanos.

Volver al principio


PARADIGMA
Cualquier paradigma que dependa de la fiabilidad humana..
.. no es fiable..!!
Wilucha

CLASIFICACION DE LOS PARADIGMAS

Declarativo
Demostrativo
Funcional
Heuristico
Imperativo
Logico
O Objeto
Procedimental

PARADIGMA
Las computadoras no son fiables
.. pero los hombres menos aún..!!
Wilucha

Los Paradigmas de Programación tomados como guías básicas de diseño y desarrollo de sistemas, se agrupan de acuerdo a la subjetividad de criterios que cada autor quiere destacar, por ejemplo, según la naturaleza de cada problema, cuya solución puede requerir más de un tipo de paradigmas, que te describo a continuación:

Volver al principio


Paradigma
Hay ciertos defectos que bién manejados..
brillan más que la misma virtud..!!
Rochefocauld

Volver al principio
Demostrativo
Funcional
Heuristico
Imperativo
Logico
O Objeto
Procedimental

PARADIGMA DECLARATIVO: Describe la solución

Destaca las características que debe tener la solución, pero no describe como procesarla.

  • A partir de esta información el sistema proporciona un esquema que incluya el orden de evaluación que compute una solución. Aquí no existe la descripción de las diferentes etapas a seguir para alcanzar una solución.

  • Estos paradigmas permiten el uso de variables para almacenar valores intermedios, pero no para actualizar estados de información.

  • Dado que estos paradigmas especifican la solución sin indicar cómo construirla, en principio eliminan la necesidad de probar que el valor calculado es el valor solución.

  • Las soluciones son todavía producidas más como construcciones que cómo especificaciones.

Los paradigmas resultantes y los lenguajes que los soportan no son verdaderamente declarativos, sino pseudodeclarativos. En este grupo se encuentran: el funcional, el lógico y el de transferencia.

En principio, estos no son soluciones inherentes de tipos serie o paralelo, ya que no dirigen la secuencia de control y no pueden alterar el natural no paralelismo del algoritmo.

No obstante, los paradigmas pseudodeclarativos requieren al menos un limitado grado de secuencia, y por lo tanto admiten versiones en serie y paralelo.

PARADIGMA
Errar es humano, pero para enrredar las cosas en grande
..hace falta una computadora..!!
Wilucha

SOLUCIÓN DECLARATIVA:

Bajo este entorno paradigmático, un programa se diseña marcando hechos, reglas, restricciones, ecuaciones, transformaciones y demás propiedades derivadas del conjunto de parámetros o valores que configuran la solución.

  • Basada en esta información, el sistema proporcionará un esquema que incluya la secuencia u orden de evaluación que genere una solución. A diferencia de los paradigmas procedimentales, aquí se carece de la descripción de las diferentes etapas a seguir para lograr la solución.

  • Los paradigmas declarativos usan variables para almacenar valores intermedios, pero no para actualizar estados de información y como especifican la solución sin indicar cómo construirla, anulan la necesidad de verificar que el valor calculado corresponde a la solución correcta.

  • Mientras que muchos de los paradigmas con secuencia de control y efecto de lado, que requieren prácticamente la noción de estado, sus soluciones son todavía producidas como construcciones más bien que cómo especificaciones.

    Por ello, los paradigmas resultantes y los lenguajes que los soportan no serán totalmente declarativos, sino pseudo declarativos, como el paradigma funcional, el lógico y el de transformación.

    li>El paradigma declarativo no es solución inherente de tipos serie o paralelo, porque no dirige la secuencia de control y tampoco altera el natural no paralelismo del algoritmo.

    Aún así, los paradigmas pseudo declarativos requieren al cierto grado de secuencialidad, y por lo tanto admiten versiones en serie y paralelo.

  • Genera soluciónes sin indicar cómo construirla, ni describir los pasos para lograrla, pues solo señala reglas, restricciones y expresiones de valores que configuran la solución.

    Esta solución de definición, señala las características que debe tener la solución, sin describir cómo procesarla. Es decir, señala qué se desea obtener pero no cómo obtenerla.

  • Determina el de orden de evaluación que requiere la solución y como sus secuencias de control constituyen sus propias restricciones, eliminando así, la necesidad de probar que el valor logrado es el resultado esperado.

    Un ejemplo de este tipo de lenguaje es SQL, que utiliza en la consulta de bases de datos relacionales.

    Otros ejemplos son los lenguajes de programación lógica como PROLOG y los lenguajes específicos de la Ingeniería del Conocimiento, los cuales utilizan representaciones complejas del conocimiento sobre un problema para manipularlas y generar soluciones de forma declarativa.-

PROGRAMACION DECLARATIVA

El objetivo a largo plazo que se pretende alcanzar, es la creación de una herramienta que pueda adaptarse a varios paradigmas de programación.

Aunque fundamentada en teorías matemáticas de principios del siglo XX, la programación declarativa tiene sus inicios en los ordenadores con el lenguaje de programación LISP, el cual aparece en 1959, habiendo sido desarrollado por John McCarthy, con la idea de facilitar el manejo de listas algebraicas, usadas en las investigaciones del campo de la inteligencia artificial.

Este lenguaje, aunque contemporáneo del FORTRAN, ya incorpora la recursividad, la recolección de basura y una definición formal del lenguaje (escrita en LISP), y además podemos decir, que al surgir sus nuevas versiones, ha sido pionero en cuanto a la creación de entornos globales de programación que agrupan en una misma herramienta al editor, el interprete y el depurador.

Sus caracteristicas son:

  • Los lenguajes declarativos, están orientados a buscar la solución del problema, si preocuparse por la forma de llegar a ello, es decir, el programador deberá de concentrarse en la lógica del algoritmo, más que en el control de la secuencia.

  • Los programas están formados por un conjunto de definiciones o ecuaciones, las cuales describen lo que debe ser calculado, no en sí la forma de hacerlo.

  • Las variables sólo pueden tener asignado un solo valor a lo largo de la ejecución del programa, lo cual implica que no puede existir asignación destructiva. Debido a esto, cobra especial importancia el uso del anidamiento y la recursividad.

  • Las listas representan la estructura fundamental de datos.

  • El orden de ejecución no resulta importante, debido a que no existen efectos colaterales, es decir que al calcular un valor, resulta imposible afectar el calculo de otros y con esto se puede afirmar, que cualquier secuencia de ejecución deberá de conducir al mismo resultado.

  • Las expresiones o definiciones, pueden ser usadas como valores y por lo tanto se pueden tratar como argumentos de otras definiciones.

  • El control de la ejecución, no es responsabilidad del programador.

PARADIGMA
La Inteligencia Artificial
.. es incompatible con la Estupidez Natural..!!
Wilucha

CLASES DE LENGUAJES DECLARATIVOS

Fuertemente basada en el establecimiento de relaciones, la programación declarativa hace uso de funciones o bien de la lógica de predicados para establecer dichas relaciones, y por esto aparecen las dos principales ramas que agrupan a los lenguajes clasificados bajo esta filosofía, denominadas:

  • PROGRAMACIÓN FUNCIONAL:
    basado en la evaluación de funciones matemáticas.

  • PROGRAMACIÓN LOGICA:
    se sustenta en la idea de que un problema puede ser descripto definiendo ciertas relaciones sobre un conjunto de datos, y que pueden obtenerse conclusiones a partir de estas premisas aceptadas como validas, por medio de aplicación de ciertas reglas de deducción.

Paradigma
Cuando veas un gigante, examina la posición del Sol
..no vaya ser la sombra de un pigmeo..!!
Von Hardenberg

Volver al principio
Declarativo
Funcional
Heuristico
Imperativo
Logico
O Objeto
Procedimental

PARADIGMA DEMOSTRATIVO: Describe soluciones de problemas similares

  • Permite al sistema que generalice una solución procedimental a partir de esas demostraciones, por ello también es llamada programación por ejemplos.

  • El mayor problema que se presenta con estos sistemas, es conocer cuándo un programa es correcto. En el caso de los sistemas procedimentales, se consigue estudiando el algoritmo y el resultado de juegos de ensayo apropiados.

  • En el caso de los sistemas demostrativos el algoritmo se mantiene en una representación interna, por lo que la veracidad de la decisión se debe hacer exclusivamente sobre la base de eficiencia del algoritmo sobre los casos específicos de prueba.

    Ejemplo: Una maquina generadora de números pares, puede usar la siguiente regla de recursividad:

    • Se establece que el numero 2 es par ;por lo tanto 2 pertenece al conjunto de los pares

    • Si él numero x pertenece al conjunto de los pares, entonces x + 2 es par
Demostremos esto:
	
                2 + 2 = 4
            	2 + 4 = 6
             	2 + 6 = 8

Vemos que la maquina tomara el resultado de las sumas y lo incrementara en dos, de este modo genera los números pares, y así establecemos los pasos para llegar a la solución del problema.

LA PROGRAMACION DEMOSTRATIVA O POR EJEMPLOS:

Es del tipo "bottom-up", resulta compatible con nuestra capacidad de pensar, aunque en la mayor parte de los paradigmas, la solución del problema se logra aplicando métodos abstractos "top-down".

Este tipo capta aspectos similares de los objetos y a partir de ellos generaliza similitudes para resolver los nuevos casos. Apesar que esta es una versión de la solución procedimental, pero por producir resultados diferentes, merece ser tratada como una categoría distinta.

Especifica la solución describiendo ejemplos, y permite que el sistema generalice la solución de esos ejemplos para otros casos, aunque tal criterio pueda generar distintos resultados

Propone soluciones de problemas similares y promueve que el sistema, a partir de sus demostraciones, generalice una solución procedimental. Las opciones para lograr este objetivo son:

  • SIMULAR
    La acción operativa que produce una secuencia procedimental

  • INFERIR
    Tanto las intenciones o inferencias de conocimiento.

    • LOS SISTEMAS QUE INFIEREN:
      Generalizan a partir del razonamiento basado en el conocimiento, mientras que una solución basada en la inferencia determinará las similitudes del grupo de datos u objetos, que servirá para generalizar sus singularidades.

    • MEJORES RESULTADOS:
      Del procedimiento de inferencia están en áreas limitadas, donde el sistema tiene un profundo conocimiento semántico de la aplicación.

    • MAYOR DESVENTAJA:
      Es la necesidad de conocer cuándo el programa funciona correctamente, como en el caso de los sistemas procedimentales, donde tal detalle se logra con un eficiente diseño del algoritmo, de manera de generar el resultado apropiado.

    • PROGRAMACION ASISTIDA:
      Donde el sistema observa acciones que el programador ejecuta, y si son similares o acciones pasadas, intentará inferir cuál es la próxima acción que del programador.

    • OBJECIONES:
      Sus detractores critican al sistema de inferencia por que:

      • Si la comprobación no es exhaustiva pueden producirse programas erróneos que trabajan correctamente con los ejemplos de prueba, pero que con otros casos fallan.

      • Destacan que la capacidad de inferencia es limitada, tanto que el usuario debe guiar casi siempre el proceso.

PARADIGMA
Es más valioso quién se levanta
que quién nunca cayó..
Wilucha
Bienvenido al mundo paradigmático..!!

Declarativo
Demostrativo
Heuristico
Imperativo
Logico
Orientado Objeto
Procedimental

PARADIGMA FUNCIONAL

Funciones + Estructura de datos = Programa

Como antecedentes de este paradigma:

  • M. Schönfinkel: Desarrolla en Alemania y Rusia los Fundamentos de la lógica combinatoria.
  • Haskell Curry: En Inglaterra crea la lógica combinatoria y el lambda cálculo tipado
  • Alonzo Church: En 1934 en EEUU propone un nuevo modelo de estudio de la computabilidad mediante el cálculo lambda.
  • John McCarthy: En 1950 diseña el lenguaje LISP (List Processing) usando las listas como tipo básico que admitía funciones de orden superior, de aplicación en el campo de la Inteligencia Artificial.

Para detener el crecimiento incontrolado de los lenguajes propios desarrollados por cada investigador, un grupo de investigadores notables propone como estándar a Haskell ( 98 última versión) que es un lenguaje no estricto y puramente funcional.

El paradigma funcional está cimentado en el modelo matemático de composición funcional, y abarca:

  • ASPECTOS del PARADIGMA FUNCIONAL
    • Cada función ejecuta las mismas operaciones, como un modulo de programa codificado para procesar distintos datos, produciendo un resultado llamado "valor de la función".

    • Tal valor devuelto como resultado del cálculo realizado por la función, es el nuevo parámetro operable; que se usa como nuevo dato de entrada de la siguiente instrucción y así sucesivamente hasta alcanzar el resultado deseado.

    • No existe el concepto de celda de memoria que es asignada o modificada, solo considera valores intermedios que son el resultado de cálculos anteriores y en entradas a siguientes cálculos.

    • La programación funcional incorpora el concepto de función como objeto de primera clase, donde cada función puede ser operada como un dato normal, tratado como parámetro, calculado y devuelto como valor común, como otra forma de dato de cálculo; aspecto que lo diferencia de la programación imperativa.

  • CARACTERISTICAS del PARADIGMA FUNCIONAL

    El paradigma funcional basado en el concepto matemático de función:

    • Es entendida una regla de correspondencia que relaciona a dos elementos en un conjunto origen y destino, cuyo resultado de calculo es la entrada del siguiente, y así sucesivamente hasta producir el valor deseado.

    • En lugar de la celda de memoria asignada o modificada, existen valores intermedios resultados de cálculos anteriores y las entradas a cálculos siguientes.

    • No existen sentencias imperativas y todas las funciones tiene transparencia referencial.

    • Incorpora el concepto de función como objeto de primera clase, donde las funciones se pueden tratar como datos que pueden pasar como parámetros , calculadas y devueltas como valores normales, y mezcladas en el cálculo con otras formas de datos, donde:

      • La función puede tener varios argumentos, incluyendo cero, pero siempre debe devolver un único valor.

      • La definición de función proporciona:
        • Un parámetro formal o un nombre, y
        • La llamada a la función proporciona un argumento real o un valor.

      • En lugar de secuencias de eventos, tenemos composición de funciones.

  • PARADIGMA FUNCIONAL Vs IMPERATIVO
    Un ejemplo que destaca la diferencia entre la programación funcional y la imperativa es el siguiente:

    • PROGRAMA IMPERATIVO en Lenguaje C:
      
        void siguiente ( int *  puntero )     
        {
          int contenedor;
          for ( contenedor = 0; contenedor <= 9; contenedor++ )
             *( puntero +  contenedor ) += 1;
        }
      
        void cuadrado ( int *  puntero )    
        {
           int contenedor;
      
           for ( contenedor = 0; contenedor <= 9; contenedor++ )
              *( puntero +  contenedor ) *= *( puntero + contenedor );
         }
      
      
        void main ( void )
        {
          int lista [ 10 ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
      
          siguiente ( &lista [ 0 ] );
          cuadrado ( &lista [ 0 ] );
        }
      

      El ejemplo muestra un código C que calcula el cuadrado de un array de enteros cuyos elementos fueron previamente incrementados en una unidad.

      Las funciones C que realizan este trabajo deben usar un área de memoria común, denominada lista, donde almacenar los datos iniciales, los resultados intermedios y los datos finales de los cálculos.

    • PROGRAMA FUNCIONAL en Pseudolenguaje:
      
        siguiente ( x ) : int [ 10 ] -> int [ 10 ] = { xi = xi + 1; i = 0 .. 9 };
        cuadrado ( x ) : int [ 10 ] -> int [ 10 ] = { xi = xi * xi; i = 0 .. 9 };  
      
        cuadrado ( siguiente ( [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 ] ) )
      

      El concepto de celda de memoria se refiere a esta lista sucesivamente modificada, por cálculos intermedios previos efectuados, hasta generar un resultado final.-

      El concepto funcional, a modo similar a la función matemática dotada de argumentos de entrada, de un tipo definido y devuelve un resultado de tipo también definido, pero no requiere un área intermedia para almacenar los resultados del cálculo.

      Las funciones matemáticas que por medio de su propiedad de composición, permiten que su resultado sirva de argumento a otra función, si el tipo es el adecuado; en C, sólo funciona para tipos simples, mientras que en lo lenguajes funcionales es válido para todos los tipos, ya sean simples, estructurados o incluso funcionales.-

      La forma de especificar las funciones puede variar según el lenguaje de programación concreto que se utilice, acercándose más o menos a una definición del tipo de una función matemática.

      Algunos lenguajes de programación funcional se alejan mucho de este enfoque, y definen procedimentalmente cómo se efectúan los cálculos, esto es, definen de forma estricta la secuencia de operaciones.-

      En la práctica los lenguajes que soportan esta forma procedimental del paradigma funcional a menudo incluye el natural no-efecto lateral de este paradigma, y obliga a considerar la secuencia del programa en su construcción.-

      Cuando el paradigma funcional permite que se produzcan efectos laterales, se destruye una capacidad que, en su forma matemática, posee el paradigma de forma nativa: el paralelismo.

      La programación funcional utiliza como objetos de primer orden las funciones para construir los programas, cuyo mecanismo básico de ejecución es la composición funcional, que permite enlazar la evaluación de funciones en una secuencia computacional.

    Volver al principio

    PARADIGMA
    Los tipos de personas son: Los que se elevan y los que se inclinan..!!
    Wilucha

  • PROGRAMACION FUNCIONAL
    La programación funcional, es un modelo basado en la evaluación de funciones matemáticas, entendidas como mecanismos para aplicar ciertas operaciones sobre algunos valores o argumentos, para obtener un resultado o valor de la función para tales argumentos.

    Aunque los argumentos y el resultado de una función, sean constantes numéricas, como el siguiente ejemplo:

    f(x) = x2 + x ,

    donde si pasamos como argumento la constante entera 2, la función f definida en términos de la función potencia cuadrada, y de la función suma, obtendremos,

    f(2) = 22 + 2 = 6 como valor de la función.

    Sin embargo, tanto argumentos como resultado de una función, pueden ser otra función, o incluso la misma, tal como una forma de recursividad, que constituye una poderosa herramienta de la programación funcional.

    La teoría de esta programación, se basa en el modelo de computación conocido como "cálculo lambda", inventado por Alonzo Church en 1934 por lo que resulta ser el primer lenguaje funcional.

    Aunque cuando aparece el cálculo lambda, aún no existían las computadoras, resulta ser una herramienta simple que se adelanta a su época, que abarca dos operaciones:

    1. Definir alguna(s) función(es) de un solo argumento y con un cuerpo específico, denotado por la siguiente terminología:

      lx.B, en donde:

      • x
        : Define el parámetro o argumento formal.

      • B
        : Representa el cuerpo de la función. Por tanto:

      • f(x) = B
        .

    2. REDUCCION:
      Consiste en aplicar alguna de las funciones creadas, sobre un argumento real (A); resultado de sustituir las ocurrencias del argumento formal (x), que aparezcan en el cuerpo (B) de la función, con el argumento (A),

      Es decir: (lx.B)

      Ejemplo:
      (lx.(x+5))3, indica que en la expresión x + 5, debemos sustituir el valor de x por 3.

      Cuando ya no es posible reducir una función, se dice que ésta se encuentra en su estado normal, o sea hemos encontrado el valor de la función, que dependerá únicamente de los argumentos y siempre tendrá la consistencia de regresar el mismo valor para los mismos argumentos.

      Lo anterior es la transferencia referencial y al no contar con variables globales, permiten al sistema la ejecución de procesos en forma paralela para incrementar su eficiencia.

    Sobre estos simples conceptos está basada la programación funcional, aunque existen otros, usados para identificarla y aumentan su potencial en el desarrollo de aplicaciones.

    Volver al principio

    PARADIGMA
    Los tipos de personas son: Los que se elevan y los que se inclinan..!!
    Wilucha

  • PARADIGMA FUNCIONAL: PROGRAMACION LISP

    Funciones primitivas predefinidas:

    
        Tratamiento de listas
    	CAR Devuelve la cabeza de la lista
    
     	CDR  Devuelve la cola de la lista
    
    	CONS Construye una lista CONS a partir de otras dos
    
    	LIST Construye una lista a partir de varias sublistas
    	
    	Asignación, relaciones booleanas y predicados
    	SET y SETQ Evalúan sus argumentos
    
    	EQ Comprueba si dos argumentos son iguales
    
    	GREATERP y LESSP Compara si el arg 1 es mayor/ menor que el 2
    
    	NULL Comprueba si la lista es nula
    
    	ATOM; LISTP NUMBERP Averiguan el tipo de un objeto
    
    	OR, AND y NOT Predicados de suma, multiplicación y negación
    	
    	Aritméticas
    	PLUS, DIFERENCE, TIMES, QUOTIENT, REMAINDER Suma, resta, multiplicación, cociente, resto
    	
    	Condicionales e iterativas
    	COND Condicional con varios predicados
    
    	LOOP Función iterativa no declarativa
    
        Formas funcionales para crear y combinar funciones
    	DEFUN Función que permite crear otras funciones
    
        Objetos de datos
    	LISP dispone de esta estructura como fundamental
     

    Veamos el siguiente ejemplo en LISP, donde se comprueba si un número es primo:

    
        (DEFUN PRIMO(N)
    	COND((EQ N 2) T) ((EQ N 3) T)
    	(T (PRIMO1 N (QUOTIENT N 2)))))
    	(DEFUN PRIMO1 (N Y)
    	COND((EQ (REMAINDER N Y) 0) NIL)
    	((EQ Y 2) T)
    
    	(T (PRIMO1 N (DIFERENCE Y 1))))
    

    Al ejecutarlo, genera:

    
       (PRIMO 3) T 
    
       (PRIMO 8) NUL 
    

    Volver al principio

    PARADIGMA
    El joven conoce las reglas pero el viejo las excepciones..!!
    Wilucha

  • PARADIGMA FUNCIONAL: LENGUAJE HASKELL

    Los primeros ordenadores se construyeron en los años cuarenta. Estos modelos fueron ‘programados’ con grandes reels. Luego se almacenaron los programas en la memoria del ordenador, haciendo que los primeros lenguajes de programación hicieran su entrada.

    En aquel tiempo el uso de un ordenador era muy costoso y era lógico que el lenguaje de programación guardara mucha relación con la arquitectura del ordenador.

    Un ordenador consta de una unidad de control y una memoria. Por eso un programa consistía en instrucciones para cambiar el contenido de la memoria. La unidad de control se encargaba de ejecutarlas. De esta manera se creó el estilo de programación imperativa.

    En la matemática de los últimos cuatrocientos años son muy importantes las funciones. Estas establecen la relación entre los parámetros (la ‘entrada’) y el resultado (la ‘salida’) de procesos definidos.

    Con cada computación, el resultado depende de una u otra forma de los parámetros. Por esa razón, una función es una buena manera de especificar una computación. Esta es la base del estilo de programación funcional.

    Un ‘programa’ consiste en la definición de una o más funciones. Para la ejecución de un programa, se dan parámetros a una función y el ordenador tiene que calcular el resultado. Con este tipo de computación existe libertad en la manera de ejecución.

    • ANTECEDENTES del LENGUAJE HASKELL

      La base teórica de la programación imperativa fue dada (en Inglaterra) por Alan Turing en los años treinta. También la teoría de funciones como modelo de computación proviene de los años veinte y treinta.

      Los fundadores son, entre otros, M. Schönfinkel en Alemania y Rusia(fundamentos de la lógica combinatoria), Haskell Curry en Inglaterra (Lógico matemático creador de la lógica combinatoria y el lambda cálculo tipado y Alonzo Church en EEUU (propuso un nuevo modelo de estudio de la computabilidad mediante el cálculo lambda).

      Hacia 1950, John McCarthy diseñó el lenguaje LISP (List Processing) usando las listas como tipo básico ya que admitía funciones de orden superior (usado en el campo de la Inteligencia Artificial).

      A la larga, cada investigador se dedicó a desarrollar su propio lenguaje que para detener este crecimiento incontrolado, un grupo de investigadores notables Estándar como lenguaje no estricto y puramente funcional. Haskell 98 es la última versión del lenguaje.

      La principal información sobre el lenguaje Haskell puede consultarse en la dirección: http://www.haskell.org

      Propiedades de Haskell

      • - Funciones de alto orden.
      • - Inferencia de tipos
      • - Polimorfismo paramétrico
      • - Semántica no estricta, evaluación perezosa
      • - Listas por comprensión
      • - Propiedades nuevas
      • - Clases de tipos, sobrecarga.
      • - Entrada/salida funcional.
      • - Soporte para mónadas

      En un lenguaje funcional se pueden definir funciones las cuales se usan en una expresion cuyo valor tiene que ser calculado. Para calcular el valor de una expresion se necesita un programa que entienda las definiciones de las funciones. Tal programa se llama interprete.

      En el fichero prelude están las definiciones de las funciones estándar. Lo primero que hace el interprete es analizar estas funciones estándar. ‘Prelude’ significa ‘preludio’: este archivo se examina antes de que se puedan definir nuevas funciones.

      Finalmente, el interprete comunica que se puede teclear .

      
         Type :? for help
      
         Prelude>   
      

      El signo de interrogación indica que el interprete esta listo para calcular el valor de una expresion. En el prelude están definidas, entre otras, las funciones aritméticas. Se puede usar el interprete como calculadora.

      
         Prelude> 5+2*3
         
         11
      
         (5 reductions, 9 cells)
         
         Prelude>
      

      El interprete calcula el valor de la expresion (el operador * indica multiplicación). Después de decir cual es el resultado, el interprete indica lo que fue necesario para el calculo: ‘5 reductions’ (una medida para el tiempo utilizado) y ‘9 cells’ (una medida para la memoria utilizada).

      Prelude> ,indica que el interprete esta listo para el próximo cálculo.

      Volver al principio

      PARADIGMA
      Los tipos de personas son: Los que se elevan y los que se inclinan..!!
      Wilucha

    • CONCEPTOS de HASKELL
      En un lenguaje funcional se pueden definir nuevas funciones aparte de las que están definidas en el preludio. La definición de una función se almacena en un fichero. El fichero se puede crear con cualquier procesador de textos.

      El procesador de textos se arranca con el comando ‘:edit’, seguido por el nombre de un fichero,

      
         Prelude> :edit nuevo
      

      Por los dos puntos al principio de la regla, el intérprete sabe que edit no es una expresion, sino un comando interno. El procesador de textos ocupa temporalmente el lugar que ocupaba Haskell en la pantalla.

      EJ: Para la Función factorial debe definirse la función factorial en un fichero, por ejemplo el fichero ‘nuevo’. El factorial de un numero n (normalmente escrito como n!) es el producto de los números desde 1 hasta n inclusive, ej. 4! = 1* 2 * 3 * 4 = 24.

      La definición sería:

      
          fac n = product [1..n]
      

      Esta definición usa la notación para ‘lista de números entre dos valores’ y la función estándar product.

      Luego se guarda este fichero como nuevo.hs y se puede salir del procesador de textos.

      Para usar la nueva función, se puede indicar a través del comando :load

      
          Prelude> :load nuevo
      

    • COMANDOS DEL INTERPRETE de HASKELL

      Además de :edit y :load, existen otros comandos que se envían directamente al interprete. Todos empiezan por dos puntos. Algunos de comandos son:

      • load fichero(s) Después de este comando se conoce las funciones que están definidas en los ficheros especificados.

      • also fichero(s) Con este comando se pueden añadir definiciones de otros ficheros, sin eliminar las definiciones existentes.

      • edit fichero ´Este es un comando para crear o modificar un fichero. Sin nombre, edit usa el ultimo fichero que se ha recuperado y, después de salir del procesador de textos, se carga otra vez.

        Ejemplo, si se hicieron cambios en otra ‘ventana’).

      • type expresion Con este comando se determina el tipo de la expresion dada.

      • set ±letra Con este comando se pueden aplicar o eliminar algunas opciones. Activa y desactiva número de reducciones y cuanta memoria se ha usado.

        Con :set -s deja de hacerlo. Con :set +s da otra vez esta información.

        Las opciones más importantes son s, t, g en i:

        • s
          : Información estadística (reducciones y memoria) después de cada computación.

        • t
          : Da el tipo de cada resultado de una computación

        • g
          : Se informa sobre Garbage collection.

        • i
          : Las constantes de enteros se manejan de forma especial.

    • FUNCIONES Y OPERADORES de HASKELL

      Los nombres de las funciones y los parámetros tienen que empezar con una letra minúscula, (minúsculas y mayúsculas son diferentes para el interprete).

      Después pueden seguir mas letras (minúsculas y mayúsculas), pero también números, el símbolo ’ y el símbolo _.

      Algunos ejemplos de nombres de funciones y parámetros son:

      
          f               sum            x3               g’             
      
          tot_de_macht                 nombreLargo
      

      • PALABRAS RESERVADAS de HASKELL

        Que no pueden se pueden usar para definir funciones, son:

        
           Case, class, data, else, if, in, infix, infixl, infixr, 
        
           instance, let, of, primitive, then, type, where
        

      • OPERADORES de HASKELL:

        Los símbolos que se pueden usar para formar operadores son los siguientes:

        
          :       #        $    %    
        
          &    *    +    -    =    .    
        
          /    \    <    >    ?    !    
        
          @    ^    |
        

        Operadores permitidos son, por ejemplo:

        
          +      ++      &&      
          
          ||    <=    ==    /=     .    //
        
          $     @@     -*-        \ /           
        
          / \              ...            
          
          <+>          ?         :->
        

      • FUNCIONES SOBRE NÚMEROS de HASKELL Para números reales están definidas algunas operaciones que son primitivas:
        
          sqrt la función raíz cuadrada
          sin  la función seno
          log  la función logaritmo natural
          exp  la función exponente (e-elevado-a)
        

        Funciones que convierten enteros en números reales y viceversa:

        
          fromInteger entero a numero real
        
          round redondear un numero real a un entero
        

      • FUNCIONES BOOLEANAS de HASKELL:

        OPERADORES:

        
           < (menor que),  
           > (mayor que), 
           <= (menor o igual que), 
           >= (mayor o igual que), 
           == (igual a) y 
           /= (distinto de).
        

        El operador < comprueba si un numero es menor que otro numero. El resultado es la constante True (si es menor) o la constante False (si no):

        
          Ej.1:
        
               Prelude>1<2
               True
        
          Ej.2:
        
               Prelude> 2<1
               False
        

      • FUNCIONES SOBRE LISTAS de HASKELL
        • Length : determina el tamaño de una lista,
        • sum :calcula la suma de los números en la lista,
        • ++ :concatena dos listas en una sola,
        • null : función booleana sobre listas. Comprueba si la lista esta vacía ( lista sin elementos),
        • take :tiene dos parámetros: un numero y una lista. Si el numero es n, el resultado es una lista con los primeros n elementos de la lista.
        • reverse : pone los elementos de una lista en el orden inverso, sort :ordena los elementos de menor a mayor.

        CONCEPTOS BÁSICOS

        El entorno HUGS funciona siguiendo el modelo de una calculadora en el que se establece una sesión interactiva entre el ordenador y el usuario.

        Una vez arrancado, el sistema muestra un prompt " Prelude>" y espera a que el usuario introduzca una expresión (denominada expresión inicial y presione la tecla .

        Cuando la entrada se ha completado, el sistema evalúa la expresión e imprime su valor antes de volver a mostrar el prompt para esperar a que se introduzca la siguiente expresión.

        Ejemplo:

        
           Prelude> (2+3)*8
           40
        

        Expresión evaluada por el sistema imprimiendo como resultado el valor "40".

        
           Prelude> sum[1..10]
           55
        

        Expresión que representa la lista de enteros que van de 1 hasta 10, y sum es una función estándar que devuelve la suma de una lista de enteros. Es decir:

        
         1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = 55
        

        Estas operaciones utilizaron funciones estándar, incluidas junto a una larga colección de funciones en un fichero denominado "estándar prelude" que es cargado al arrancar el sistema.

        Por otra parte, el usuario puede definir sus propias funciones y almacenarlas en un fichero de forma que el sistema pueda utilizarlas en el proceso de evaluación.

        El proceso de evaluación consiste en tomar una expresión e ir transformándola aplicando las definiciones de funciones (introducidas por el programador o predefinidas) hasta que no pueda transformarse más.

        La expresión resultante se denomina representación canónica y es mostrada al usuario.

        En el proceso de evaluación pueden seguirse diversas trayectorias, por ejemplo:

        
            cuadrado (3+4)
            =                  { evaluando la suma }
            cuadrado 7
        
            =                                     { utilizando la definición cuadrado x = x * x }
             7 * 7
        
           =                { evaluando la multiplicación }
                    49
        

        En el ejemplo anterior se evaluaron primero las expresiones internas antes de la aplicación de la función.

        Otra posibilidad sería utilizar la definición de la función antes de evaluar los argumentos.

        
           cuadrado (3+4)
        
           =       { utilizando la definición cuadrado x = x * x }
           (3+4) * (3+4)
        
           =       { evaluando la parte izquierda de la multiplicación }
            7 * (3+4)
        
           =       { evaluando la parte derecha de la multiplicación }
                   7 * 7
        
          = { evaluando la multiplicación }
                   49
        

        El primer esquema, evaluar los argumentos antes de llamar a la función, se denomina llamada por valor y se asocia con la evaluación ansiosa. El segundo se denomina llamada por nombre y está asociado a la evaluación perezosa.

        En algunas ocasiones, la llamada por valor puede no terminar, mientras que la llamada por nombre sí.

      Volver al principio

      PARADIGMA
      El joven conoce las reglas pero el viejo las excepciones..!!
      Wilucha

    • TIPOS:

      El sistema de tipos es utilizado para detectar errores en expresiones y definiciones de función.

      Cada tipo tiene asociadas un conjunto de operaciones que no tienen significado para otros tipos, por ejemplo, se puede aplicar la función (+) entre enteros pero no entre caracteres o funciones.

      Una propiedad importante del Haskell es que es posible asociar un único tipo a toda expresión bien formada. Esta propiedad hace que el Haskell sea un lenguaje fuertemente tipado. Como consecuencia, cualquier expresión a la que no se le pueda asociar un tipo es rechazada como incorrecta antes de la evaluación.

      El análisis tiene dos fases:

      • Análisis sintáctico: Verifica la corrección sintáctica de las expresiones y

      • Análisis de tipo: Verifica que todas las expresiones tienen un tipo correcto.

        Información de tipo
        Además de las definiciones de función, en los escritos se puede incluir información de tipo mediante una expresión de la forma

        A : : B
        para indicar al sistema que A es de tipo B.

        Por Ej.:

        cuadrado:: Int -> Int

        Indica que la función cuadrado es del tipo "función que toma un entero y devuelve un entero".

        cuadrado x = x * x

      • TIPOS PREDEFINIDOS

        Los principales tipos predefinidos del sistema Haskell, se podrían clasificar en:

        • tipos básicos, cuyos valores se toman como primitivos, y los

        • tipos compuestos.

      • TIPOS BÁSICOS DE DATOS

        Los tipos básicos que deben escribirse con mayúsculas:

        • Int [Int]

        • Float [Float]

        • Bool [Bool]

        • Char [Char]

      • ENTEROS

        Representados por el tipo "Int", se incluyen los enteros positivos y negativos tales como el -273, el 0 ó el 383.

        El rango de los enteros utilizables está restringido. También se puede utilizar el tipo Integer que denota enteros sin límites superior ni inferior.

        En el standar prelude se incluye un amplio conjunto de operadores y funciones que manipulan enteros:

        • (+): Suma,

        • (*): Multiplicación,

        • (-): Substracción,

        • (^): Potenciación, etc.

      • FLOTANTES

        El tipo "Float", puede representar fraccionarios así como cantidades muy largas o muy pequeñas. Un valor numérico se toma como un flotante cuando incluye un punto en su representación o cuando es demasiado grande para ser representado por un entero.

        También se puede utilizar notación científica; por ejemplo 1.0e3 equivale a 1000.0, mientras que 5.0e-2 equivale a 0.05.

        El standar prelude incluye también múltiples funciones de manipulación de flotantes: pi, exp, log, sqrt, sin, cos, tan, asin, acos, atan, etc.

      • CARACTERES

        Representados por el tipo "Char", representan caracteres individuales por ejemplo: 'a', '0', '.' y 'Z'.

        Algunos caracteres especiales deben ser introducidos utilizando un código de escape; cada uno de éstos comienza con el caracter de barra invertida (\) , seguido de uno o más caracteres que seleccionan el caracter requerido.

        EJ:

        
           '\\' barra invertida
        
           '\'' comilla simple
        
           '\"' comilla doble
           
           '\n' salto de línea
           etc.
        

      • TIPOS COMPUESTOS:

        Son aquellos cuyos valores se construyen utilizando otros tipos, por ejemplo, listas, funciones y tuplas.

    • FUNCIONES

      Si a y b son dos tipos, entonces a->b es el tipo de una función que toma como argumento un elemento de tipo a y devuelve un valor de tipo b.

      Las funciones en Haskell son objetos de primera clase. Pueden ser argumentos o resultados de otras funciones o ser componentes de estructuras de datos.

      En Haskell, la función suma tiene el tipo:

      • (+) :: Int->(Int->Int) ó Se podría escribir simplemente

      • (+)::Int->Int->Int, puesto que el operador -> es asociativo a la derecha.

      • (+) es una función de un argumento de tipo Int que devuelve una función de tipo

        Int->Int.

    • LISTAS

      Si a es un tipo cualquiera, entonces [a] representa el tipo de listas cuyos elementos son valores de tipo a.

      Hay varias formas de escribir expresiones de listas:

      • - La lista vacía, se representa mediante [].

      • - Las listas no vacías pueden ser construidas:

      Enunciando explícitamente sus elementos (por ejemplo, [1,3,10]) o

      Añadiendo un elemento al principio de otra lista utilizando el operador de construcción (:).

      Estas notaciones son equivalentes:

      [1,3,10] = 1:[3,10] = 1:(3:[10]) = 1:(3:(10:[]))

      El operador (:) es asociativo a la derecha, de forma que 1:3:10:[] equivale a

      (1:(3:(10:[]))),

      Una lista cuyo primer elemento es 1, el segundo 3 y el último 10.

      El standar prelude incluye un amplio conjunto de funciones de manejo de listas.

      Por Ej.: length xs devuelve el número de elementos de xs

      
         Prelude>length [1,3,10]
        
         3
      

      Obsérvese que todos los elementos de una lista deben ser del mismo tipo.

      La expresión ['a',2,False] no está permitida en Haskell

    • CADENAS

      Una cadena es tratada como una lista de caracteres y el tipo "String" se toma como una abreviación de "[Char]".

      Las cadenas pueden ser escritas como secuencias de caracteres encerradas entre comillas dobles. Todos los códigos de escape utilizados para los caracteres, pueden utilizarse para las cadenas.

      Ej.

      
          Prelude>"hola" 
          
          hola
      

      Puesto que las cadenas son representadas como listas de caracteres, todas las funciones del standar prelude para listas pueden ser utilizadas también con cadenas:

      Ej.

      
         Prelude> length "Hola"
         4
      
         Prelude> "Hola, " ++ "amigo"
         Hola, amigo
      

    • TUPLAS

      Los elementos de una tupla pueden tener tipos diferentes. Sin embargo, el tamaño de una tupla es fijo.

      Si t1, t2, ..., tn son tipos y n >= 2, entonces hay un tipo de n-tuplas escrito

      
          (t1, t2, ..., tn) 
      

      cuyos elementos pueden ser escritos también como

      
          (x1, x2, ..., xn) 
      

      donde cada x1, x2, ..., xn tiene tipos t1,t2, ..., tn respectivamente.

      Ejemplo:

      
         (1, [2], 3) :: (Int, [Int], Int)
      
         ('a', False) :: (Char, Bool)
      
         ((1,2),(3,4)) :: ((Int, Int), (Int, Int))
      

      Existe una tupla especial con 0 elementos denominada tipo unidad y se escribe como ().

    • INDUCCION Y RECURSIVIDAD

      En la definición de una función se pueden usar las funciones estándar y las funciones definidas por el usuario.

      Pero también se puede usar la propia función que se define en su definición. A tal definición se la llama definición recursiva.

      La siguiente función es una función recursiva:

      f x = f x

      Las funciones recursivas tienen sentido bajo las siguientes dos condiciones:

      • el parámetro de la llamada recursiva es mas simple que el parámetro de la función que se quiere definir (por ej., numéricamente menor o una lista mas corta);

      • existe una definición no recursiva para un caso base.

      Una definición recursiva de la función factorial es:

      
         fac n | n==0 = 1
      
         | n>0 = n * fac (n-1)
      

      Aquí el caso base es n==0; en este caso se puede calcular el resultado directamente (sin recursión).

      En el caso n>0 existe una llamada recursiva, es decir fac (n-1).

      El parámetro de esta llamada (n-1) es menor que n.

      Otra manera de distinguir estos dos casos (caso base y caso recursivo) es usando patrones:

      
         fac 0 = 1
         
         fac (n+1) = (n+1) * fac n
      

      También en este caso el parámetro de la llamada recursiva (n) es menor que el parámetro de la función que se quiere definir (n+1).

      El uso de patrones tiene mucha relación con la tradición matemática del usar inducción.

      Por ejemplo, la definición matemática de la función potencia puede ser usada casi directamente como función

      
         x ^ 0 = 1
      
         x ^ (n+1) = x * x^n
      

      Una definición recursiva en que se usan patrones para distinguir diferentes casos (en lugar de expresiones booleanas) se llama también definición inductiva.

      Las funciones sobre listas también pueden ser recursivas. Una lista es ‘menor’ que otra si tiene menos elementos.

      Por ej.
      función suma, puede ser definida de diferentes maneras. Una definición recursiva con expresiones booleanas es:

      
         suma lista | lista==[] = 0   (Sume la lista; si la lista esta vacía de por resultado igual a cero)
      
         | otherwise = head lista + suma (tail lista)    (sino sume la cabeza de la lista más la suma de la cola)
      

      Pero también es posible obtener una version inductiva (usando patrones):

      
         suma [] = 0
      
         suma (cabeza:cola) = cabeza + suma cola
      

      Es mas clara una definición con patrones, porque las diferentes partes en el patrón pueden conseguir un nombre directamente (como cabeza y cola en la función suma).

      En la versión recursiva de suma se necesitan las funciones estándar head y tail para distinguir las diferentes partes en lista.

      Volver al principio

    • PATRONES

      • DEFINICIÓN POR ANÁLISIS DE PATRONES

        Se llaman parámetros formales a los parámetros de una función en la definición de la misma,

        por ejemplo

        
           x e y en
           
           f x y = x * y
        

        En una llamada a la función se dan parámetros actuales a la función.

        Por ej:

        
                           f 17 (1+g 6)
        

        • 17 es el parámetro actual que corresponde a x,

        • (1+g 6) es el parámetro actual que corresponde a y. Los parámetros actuales se sustituyen en los lugares de los parámetros formales cuando se llama a una función.

        • El resultado del anterior ejemplo es por tanto 17*(1+g 6).

        Por tanto, los parámetros actuales son expresiones. Los parámetros formales eran hasta ahora solamente nombres.

      • ENCAJE DE PATRONES SIMPLE

        La declaración de una función f está formada por un conjunto de ecuaciones con el formato:

        
           f < pat1> < pat2> . . . < patn> = < expresion>
        

        Si f fuese un operador sería

        
           < pat1> f < pat2> = < expresion>
        

        Donde cada una de las expresiones < pat1> < pat2> . . . < patn> representa un argumento de la función y se denominado un patrón. El número n de argumentos se denomina aridad.

        Cuando una función está definida mediante más de una ecuación, será necesario evaluar una o más argumentos de la función para determinar cuál de las ecuaciones aplicar.

        Este proceso se denomina encaje de patrones. En los ejemplos anteriores se utilizó el patrón más simple: una variable.

        Ej.

        considérese la definición de factorial:

        
           fact n = product [1..n]
        

        Si se desea evaluar la expresión "fact 6" es necesario:

        • - Encajar la expresión "6" con el patrón "n" y
        • - Luego evaluar la expresión obtenida a partir de "product [1..n]" substituyendo la "n" con el "6".

      • OTROS TIPOS DE PATRONES ÚTILES SERÍAN:

        • ANÓNIMOS:
          Se representan por el caracter (_) y encajan con cualquier valor, pero no es posible referirse posteriormente a dicho valor.

          Ejemplo:

          
              cabeza (x:_) = x
              
              cola (_:xs) = xs
          

        • PATRONES CON NOMBRE:
          Para poder referirnos al valor que está encajando, por ejemplo, en lugar de definir f como:
          
             f (x:xs) = x:x:xs
          

          Podría darse un nombre a x:xs mediante un patrón con nombre:

          
              f p@(x:xs) = x:p
          

        • PATRONES n+k:
          Encajan con un valor entero mayor o igual que k. El valor referido por la variable n es el valor encajado menos k.

          Ejemplo:

          
             x ^ 0 = 1
             
             x ^ (n+1) = x * (x ^ n)
          

      • FUNCIONES DE ORDEN SUPERIOR SOBRE LISTAS

        Las funciones pueden ser más flexibles utilizando funciones como parámetros. Muchas funciones sobre listas tienen una función como parámetro.

        A estas se les llama funciones de orden superior: map, filter y foldr

        • map
          : Es un ejemplo de una función de orden superior. Esta función esta basada en el principio general ‘recorrer todos los elementos de una lista’.

          La función parámetro de map se aplica a cada elemento de la lista. La función map aplica su parámetro función a todos los elementos de una lista:

          Ej.1:

          
              xs = [ 1 , 2 , 3 , 4 , 5 ]
          

          Ej. 2:

          
                Prelude>map (1+) [1..10]
                
                [2,3,4,5,6,7,8,9,10,11]      
          

        • filter
          : (filtro). Esta función devuelve los elementos de una lista que cumplen alguna condición. Esta condición se da a la función filter en forma de una función booleana.

          Ej.1:

          
              xs = [ 1 , 2 , 3 , 4 , 5 ]
          

          Ej. 2:

          
               Prelude> filter even [1..10]
          
               [2, 4, 6, 8, 10]
          

        • foldr
          : ‘pliega’ la lista a un valor colocando un operador (uno de los dos parámetros), entre los elementos de la lista. La función empieza por la derecha con el valor inicial (el otro parámetro).

          Existe también una función foldl, que empieza por la izquierda.

          La función foldr inserta un operador entre todos los elementos de una lista, empezando a la derecha con un valor dado:

          
              xs = [ 1 , 2 , 3 , 4 , 5 ]
          

    PARADIGMA
    El joven conoce las reglas pero el viejo las excepciones..!!
    Wilucha

    Finalmante recuerda:

          
             SI BUSCAS                          APLICA EL PARADIGMA                  
    
       Que la programación sea simple
       segura y aproxime a tu forma 
       de ver el mundo.                       Orientación a Objetos  
    
       Resolver problemas deductivos 
       del tipo de las demostraciones 
       matemáticas                             Lógico                           
    
       Resolver problemas intratables 
       por algoritmos clásicos que 
       implican búsqueda en grandes 
       espacios del problema.                  Heurístico 
    

    BONUS:
    En este ámbito paradigmático ademas te ofrezco:

    1. LENGUAJES DE PROGRAMACIÓN:

      A S P
      Basic
      Builder
      C
      Delphi
      Fox
      Haskell
      HTML
      Java
      PHP
      Small
      UML

    2. PARADIGMAS IMPRESOS:

      Apuntes de clasesLenguaje Apuntes de clasesGramática Apuntes de clasesAutómata Apuntes de clasesLaplace Apuntes de clasesSeries Apuntes de clasesEcuación Apuntes de clasesOperador

    PARADIGMA
    Las computadoras no son fiables
    .. pero los hombres menos aún..!!
    Wilucha

    PARADIGMA DE LA ETERNIDAD ES ..

    • Esperar el resultado de la prueba de embarazo.
    • Conservar la sonrisa hasta que tomen la foto.
    • Escuchar el sonido de una llave en la cerradura a las 2 de la madrugada
    • Esperar la luz verde cuando hay un espacio para estacionarse del otro lado de la calle.
    • Tratar de encontrar un error insignificante en el estado de nuestra cuenta bancaria.
    • Escuchar a un niño de seis años cuando trata de explicar la trama de una película emocionante.
    • Buscar una salida de la autopista cuando conducimos en dirección equivocada.
    • Educar a un cachorro.

    Sofy Carpio Amor Yo..!! Sano Pity..!! Asado Cayo..!! Alegria Wilin..!! Extasis

    Te espero en: wilucha@gmail.com

    Esta page está en: www.wilocarpio.com.ar

    13/05/2014

    Volver al principio