PARADIGMA: Es mas facil desintegrar un atomo que un preconcepto..!! (Albert Einstein)
Bienvenido al mundo paradigmático..!!

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.

Cuando un mono subía la escalera para agarrar las bananas, el científico lanzaba un chorro de agua fría sobre los monos que quedaban en el suelo.

Después de algún tiempo, cuando un mono iba a subir la escalera, los restantes le propinaban una paliza.
Motivo por lo cual, pasado un tiempo, a pesar de la tentación de las bananas, ningún mono optaba por subir la escalera.

Luego, el científico sustituyó uno de los monos y este, la primero que hizo fue subir la escalera, siendo rápidamente bajado a palos por los otros.
Después de algunas palizas, el nuevo integrante del grupo ya no subió más la escalera.

Un segundo mono fue sustituido, y ocurrió lo mismo. Pero, además, el primer sustituto participó con entusiasmo de la paliza al novato.

Un tercero fue cambiado, y se repitió el hecho . . El cuarto y, finalmente, el último de los veteranos fue sustituido.

Así el científico quedó, con un grupo de 5 monos que, aún cuando nunca recibieron un baño del chorro de agua fría, continuaban golpeando al que intentase llegar a las bananas.

Si fuese posible preguntar a alguno de los monos por qué le pegaban al que intentase subir la escalera, con certeza la respuesta sería:


"No se, aqui las cosas siempre se han hecho así ..!!"

Te suena conocido ? . . . pero, así nació un paradigma..!!
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 . . ! !

Teoria de Paradigmas:
Sistémico
Lingüístico
Matemático
de Vida

Dedico esta mi page a los padres de los paradigmas:
Bernstein, Kunh, Mac Carthy, Minsky, Moore, Newell,
Rochester, Samuel, Selfrige, Solomonoff, Simon, Von Neumann, ...

El término paradigma de la historia anterior, significaria una suerte de "modelo de comportamiento a imitar", concepto que se remonta a la época de los griegos, quienes le denominaban "Parâdeima". Hoy, ya existen varias Clases de Paradigmas, a partir de que Paradigma es:

Estos conceptos se potencian con

  1. "La Estructura de las Revoluciones Científicas" de Thomas Kuhn que revolucionó el ámbito de filósofos de la ciencia, destacando los siguientes aspectos:
    • Contra la oposición del positivismo lógico, que hasta los 60 era la filosofía oficial de la ciencia, impone el actual concepto de paradigma: "Modelo ejemplar que guía las investigaciones en áreas determinadas del conocimiento y que son sustituidos por otros nuevos mediante verdaderas revoluciones científicas".
    • Genera la nueva concepción del desarrollo científico, destacando el rol protagónico de la historia en el establecimiento de una nueva filosofía de la ciencia, forzando la necesidad de revisar los conceptos sobre la ciencia, su producción, su impacto social, sus conexiones con la filosofía y la compleja teoría-observación.

    • Critica la postura tradicional de la filosofía de la ciencia que considera a la investigación científica como una larga marcha hacia la verdad a través de un método que garantiza la objetividad y la neutralidad en la producción científica.

    • Establece la estructura actual del paradigma como: El marco conceptual dentro del cual se desarrollará la investigación en un área determinada.

  2. Paradigma de la Simplicidad, dotado de explicaciones simplistas, desarrollos expresadas en leyes deterministas y fundamentos basadas en modelos ideales.

    Reinó desde el nacimiento de la ciencia moderna hasta casi nuestro siglo, siendo su 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.

  3. "Teoría General de Sistemas" creada en 1945 por el biologo Ludwig Von Bertalanffy, para explicar el comportamiento del organismo como un todo.
    Adopta los "Sistemas Abiertos" que intercambian materia, energía e información con el medio, como modelo general y la investigación.
    Para el, tales sistemas poseen 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.

  4. 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.
    Produce un acercamiento a los sistémicos, con un intercambio que madurará en el siguiente período evolutivo de la teoría de sistemas.

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

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

  7. 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 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.
    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 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.

  8. LLEGA LA CIBERNETICA..!!
    La investigación busca comprender el equilibrio dinámico del enigma biológico respecto del mantenimiento de nuestra estructura corporal, donde nuestras células se recambian permanentemente y pese a ello somos 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".

    Los aportes de Prigogine fueron relevantes, pues 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".
    Desde una perspectiva centrada en la complejidad, se orienta hacia una concepción bio-antro-cosmológica, donde los niveles físico, viviente y social no sean compartimentos estancos sino que se articulen e integren.

  9. TAMBIEN LA RECURSIVIDAD..Y LOS BUCLES..!!
    La epistemología positivista se corresponde 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.

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

    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 del proceso de reflexión del conocimiento del conocimiento, donde para:
    - Para conocer el cerebro usamos...: el cerebro
    - Para conocer el lenguaje usamos...: el lenguaje

    Así, la recursividad es la norma, donde no hay linealidad posible, sólo bucles.

  10. INTERDISCIPLINARIEDAD y la TRANSDISCIPLINARIEDAD
    La "Teoría General de Sistemas" que 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.

    El quiebre del paradigma newtoniano, el surgimiento de distintas perspectivas y alternativas hacen 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)

  11. 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.

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

Clases de PARADIGMAS de PROGRAMACIÓN
Declarativo
Demostrativo
Funcional
Heuristico
Imperativo
Logico
Orientado 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:

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

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.

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
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: Sustentada 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)

Paradigma Demostrativo

Describe soluciones de problemas similares y 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
    		

    Así, 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 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: : Errar es humano, pero para enrredar las cosas en grande
..hace falta una computadora..!! ( Wilucha )

Paradigma Funcional

PARADIGMA FUNCIONAL: Funciones + Estructura de datos = Programa

Antecedentes:
- 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 de los lenguajes propios desarrollados por cada investigador, un grupo de investigadores notables propone como estándar a Haskell 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

CARACTERISTICAS del PARADIGMA FUNCIONAL: El paradigma funcional basado en el concepto matemático de función:

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

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.

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 indica a través del comando: 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:

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

Volver al principio

TIPOS de HASKELL:
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:

FUNCIONES de HASKELL
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:

LISTAS de HASKELL
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 de HASKELL
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. Ejemplo:


    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, Ejemplo:


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

TUPLAS de HASKELL
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. Ejemplo: f x = f x

Las funciones recursivas tienen sentido bajo las condiciones:
1 - 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);
2 - 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. 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. Ejemplo:
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.

PATRONES

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

Paradigma Heurístico

Si consultas un diccionario, encontraras que el término heurístico:

  • Es el arte de inventar

  • Es la parte de la historia que se ocupa de le búsqueda e investigación de fuentes, especialmente documentos.

  • Etc.

Para nosotros los sistémicos el concepto inicial de la palabra heurística, conviene que lo interpretes como una especie de algorítmo inteligente de búsqueda.
El paradigma heurístico nace como necesidad de encontrar programas de capaces de resolver los típicos problemas de búsqueda de la mejor solución cuando las alternativas son numerosas, tales como:

  • Cuál es el mejor medio para transportar, desde diversos orígenes hacia diferentes destinos..??
  • Determinar los mejores postulantes para asignarles determinadas tareas entre varias posibles.
  • Detectar dentro de las múltiples posibilidades, todos los posibles casos de cierta característica.

Para resolver este tipo de planteos se recurre a la Programación Heurística asociada a la INTELIGENCIA ARTIFICIAL, que es la rama de la ciencia que, simulando la operativa de su razonamiento intenta emular en el ordenador los procesos mentales inteligentes del hombre.

Con tal fin, es necesario aplicar HUEURISTICAS, que son elementos operativos que resultan de agregarles conocimiento a los métodos de búsqueda para hacerlos más eficientes.

EJEMPLOS:

  • Utilizando solo dos cubos sin marcas, uno de 6 litros y otro para 8 litros de capacidad; llenar un cubo con cuatro litros de agua.

  • Determinar la mejor asignación de 50 puestos de trabajo, con cada uno de los 30 operarios de una empresa.

A priori podemos ver que no existe ningún procedimiento o algoritmo matemático que capaz de resuelver estos problemas, por ello será necesario probar diversas alternativas de acciones hasta hallar la solución óptima, dentro de todas las combinaciones posibles y cuya evaluación puede requerir largos lapsos de tiempo.

Para explorar tales combinaciones, la Inteligencia Artificial desarrolló técnicas como la búsqueda en profundidad, en amplitud, etc. de manera que algunos problemas pueden tratarse con métodos de búsqueda convencionales.

Para restringir restringir la búsqueda a solo un subconjunto de combinaciones posibles, conviene podar los caminos superfluos, aplicando heurísticas del tipo atajos dependientes del problema a tratar que la búsqueda insuma menor tiempo.

El éxito de una heurística dependerá de su calidad, pues en tarea de minimizar el tiempo de respuesta, puede ocurrir que determinadas heurísticas aplicadas no sean eficientes, que no lleven la solución del problema, por haber desechado caminos potencialmente válidos y por evaluar alternativas inútiles.

Por todo lo anterior, podemos deducir que en este paradigma, promueve aquel tipo de programación que aplica para la resolución de problemas reglas de buena lógica o heurísticas, proporcionando entre varios cursos de acción uno que presenta características de ser el más eficiente, pero que aún así, no garantiza necesariamente la solución cierta.

La Programación Heurística implica la aplicación del conocimiento específico integral de la naturaleza del problema a resolver, que comprende además de su operatoria, la manera cómo se genera y que efectos produce. Solo así podrá minimizarse el tiempo de búsqueda de las alternativas más eficaces.

Ahora bien, si una búsqueda heurística exhaustiva maximiza la posibilidad de alcanzar la solución óptima del problema, es necesario prever que el insumo de tiempo de esta tarea, puede ser demasiado extenso, con guarismos en años que superan una vida y aún así queda la posibilidad de no arribar a una solución final.

Las creaciones heurísticas por ser reglas de sentido común, pueden codificarse en cualquier lenguaje de programación, por ello el paradigma heurístico al contrario que otros, no deviene en un lenguaje de programación específico. Aunque sus conceptos están soportados en entornos de Inteligencia Artificial como KC, KEE o ART y encuentran su mayor campo de aplicación dentro de esta disciplina.

En la siguiente nómina que es incompleta, la idea es solo proporcionar formatos de problemas donde la programación heurística puede dar mejores resultados que la programación clásica.

  • Cuando exista un problema sin solución algorítmica, o cuando la cantidad de alternativas de solución sea muy importante.-

  • Cuando exista más de una solución válida para un problema dado, donde la calidad de estas soluciones sea medida en términos de tiempo de respuesta del sistema.

  • Cuando exista la alternativa de minimizar las opciones tratadas como algoritmo clásico, dotándolo de un subconjunto potencialmente destacado entre todas las alternativas posibles.

Además de la Inteligencia Artificial la INGENIERIA DEL CONOCIMIENTO, también se apoya puntual y genéricamente del paradigma heurístico, porque utiliza sus conceptos de forma instrumental cuando resuelve los problemas de naturaleza completa no algorítmica.

En rigor, la programación heurística más que un modo de programación, es un método de guía para búscar soluciones a problemas computacionalmente complejos y aunque su ingente cantidad de alternativas factibles no aseguran el encontrar una solución óptima, sino solo una adecuada a determinadas circunstancias.

PROGRAMACION HEURÍSTICA
La Programación Heurística es el tipo de programación computarizada que resuelve problemas, aplicando reglas de buena lógica, denominadas heurísticas, que proporcionan entre varias alternativas de acción, la más optimista a pesar de no garantizar necesariamente la más efectiva.

La Programación Heurística constituye una forma de modelizar la representación de la estructura, estrategias de búsqueda y métodos de resolución de problemas.

La Programación Heurística es aplicada frecuentemente en el campo de la Inteligencia Artificial, especialmente en la Ingeniería del Conocimiento, dado que el hombre opera generalmente aplicando heurísticas, que constituyen conclusiones del razonamiento humano sobre un tema específico, apoyado en la experiencia, utilizando reglas de buena lógica.

La programación heurística permite procesar..
... por computadora los siguientes tipos de problemas:

  • a) ¿Cuál es el mejor camino?

  • b) Listar todos los casos posibles.

  • c) ¿Existe una asignación de elementos que satisfaga ?.

El común denominador de estos problemas es la necesidad de buscar exhaustivamente entre las posibles, un conjunto finito de alternativas, cuya cantidad de elementos esté controlada, de manera de evitar un crecimiento exponencial del espacio de búsqueda, que sería imposible de procesar.

El algoritmo heurístico
Usa procedimientos de búsqueda de soluciones casi óptimas a razonables costos operativos, sin garantizar la optimización de las soluciones generadas ni determinar la distancia a la solución óptima. Así, el Paradigma Heurístico definirá modelos de resolución de problemas que incorporan alguna componente basada en:

  • a.- Apropiada representación de la estructura para resolver el problema con técnicas heurísticas.

  • b.- Uso de métodos de resolución de problemas aplicando funciones de evaluación con procedimientos específicos de búsqueda heurística para alcanzar las metas.

Programación Heurística se presenta
Como:

  • Técnica de búsqueda para obtener metas en problemas no algorítmicos, o con algoritmos que generan como en el caso del juego damas ó ajedrez, múltiples alternativas de acción.

  • Método aproximado de resolución de problemas usando funciones de evaluación heurísticas.

  • Método de poda para estrategias de programas que juegan.

Conviene aplicar Programación Heurística, cuando . .

  • Existen datos limitados e inexactos, que serán usados para estimar parámetros, de modo que pueden contener errores superiores a los proporcionados con la solución de una buena heurística.

  • El modelo se simplifica, hasta transformarla en una representación teórica y aproximada del problema real, de manera que la solución óptima lograda solo tendrá valor de referencia académica.

  • No existe un método exacto confiable para ser aplicado al modelo del problema; y si existe, no es procesable en computadora.

  • Se quiere optimizar el algoritmo, dotándole buenas soluciones de inicio, guiando la búsqueda y reduciendo el número de soluciones posibles, aplicadas al modelo.

  • Frecuentemente se debe resolver el mismo problema y el tratamiento heurístico significa un ahorro operativo.

  • Si puede generar resultados superiores a los del modelo actual.

PARADIGMA: Las computadoras no causan problemas
..hasta que las enciendes..!! (Wilucha)

Especificaciones del tratamiento heurístico
Las principales especificaciones del tratamiento heurístico tienen en cuenta sus características de información y de las especificaciones del problema, destacando los siguientes aspectos:

  • Heurística simple, de consumo razonable de memoria, con velocidad de búsqueda sin saltos exponenciales de alternativas, precisa, robusta, que proporcione soluciones múltiples, y provista de buen criterio de parada que incorpore el conocimiento obtenido durante la búsqueda.

  • La información a tratar es simbólica, inexacta o limitada, incremental y basada en el conocimiento.

  • Las especificaciones del problema pueden ser de optimización o de satisfacción; que generan una o múltiples soluciones; con tratamiento en tiempo real o no; con decisión interactiva o no.

  • Las heurísticas como reglas de sentido común, pueden codificarse con cualquiera de los lenguajes de programación, pues la programación heurística no ha producido su propio lenguaje específico.

Si hubiera un lenguaje heurístico
Si definiéramos un lenguaje heurístico, dado que la programación heurística aplicada al campo de la I.A, y que posee heurísticas diseñadas con herramientas de esta área, sus características más destacables serían:

  • Sería un lenguaje conversacional, que permitiera la interacción directa con el programador para la definición y procesamiento del problema.

  • Tratamiento de estructuras crecientes, con programas que vayan ampliando el volumen de conocimiento, que en base a la experiencia configure el modelo heurístico.

  • Tratamiento simbólico, para ser compatibles con problemas que precisan tratamiento heurístico y que tienen estructura simbólica.

  • Autonomía de sus funciones para modelar la heurística y su mecanismo de ejecución, definiendo módulos independientes.

  • Estructuras de datos para describir estados de problemas y relaciones entre estados.

  • Estructuras de procedimientos de control y proceso para ejecutar coherentemente el modelo heurístico, y permitir lograr y utilizar el conocimiento adquirido en el proceso de resolución del problema.

EJEMPLO: Se desea optimizar la provisión de la caña de azúcar, usada como materia prima en los ingenios azucareros.

En este problema, entre muchos otros, intervienen como factores de decisión aspectos, como la distancia y estado de los caminos que unen los cargaderos de caña con los ingenios; el costo unitario del medio de transporte; el precio de venta de la caña de cada proveedor; el precio de compra que paga cada ingenio, etc. La cantidad de alternativas de solución a evaluar serían:


   1    alternativa     para 1 ingenio  y 1 cargadero
   2    alternativas    para 2 ingenios y 2 cargaderos
   6    alternativas    para 3 ingenios y 3 cargaderos
   24   alternativas    para 4 ingenios y 4 cargaderos
   120  alternativas    para 5 ingenios y 5 cargaderos
   720  alternativas    para 6 ingenios y 6 cargaderos
Y si la cantidad correspondiera a la Provincia de Tucumán que tiene 14 ingenios azucareros, la cantidad, suponiendo solo 14 cargaderos sería el factorial de 14, que es un número demasiado grande..!!! que prácticamente no podríamos evaluar uno a uno.

En la realidad el problema se agrava, porque la provincia tiene cientos de cargaderos y si no contamos con una buena heurística estamos fritos..!!!, pero por suerte podemos probar con alguno de los algoritmos heurísticos siguientes:

  • Recocido simulado

  • Búsqueda Tabú

  • Algoritmos evolutivos:
    • Algoritmos Genéticos

    • Programación evolutiva

    • Estrategias evolutivas

    • Programación genética

  • Redes Neuronales Artificiales

  • Relajación lagrangiana

  • Algoritmos fractales /Alienor-Gabriel

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

CARACTERISTICAS del PARADIGMA HEURISTICO
Como se ha señalado inicialmente, un paradigma de programación es un modelo básico de diseño e implementación de programas. Un modelo que permite producir programas de acuerdo con una metodología específica. Así, el paradigma de programación estructurada se basa en estructuras modulares, con fuerte cohesión en el módulo y bajo acoplamiento entre ellos, desarrollo "top-down", utilización de diagramas privilegiados, etc.

El Paradigma Heurístico define, pues, un modelo de resolución de problemas en el que se incorpora alguna componente heurística sobre la base de:

  • Una representación más apropiada de la estructura del problema para su resolución con técnicas heurísticas
  • La utilización de métodos de resolución de problemas aplicando funciones de evaluación con procedimientos específicos de búsqueda heurística para la consecución de las metas.

PROGRAMACION HEURISTICA
Se puede definir como "aquel tipo de programación computacional que aplica para la resolución de problemas reglas de buena lógica (reglas del pulgar),denominadas heurísticas, las cuales proporcionan entre varios cursos de acción uno que presenta visos de ser el más prometedor, pero no garantiza necesariamente el curso de acción más efectivo."

Muchas de las más interesantes y difíciles tareas de programación implican utilizar el ordenador para resolver problemas del tipo: "¿Cuál es el camino más corto ?" "Listar todos los casos posibles ", "¿Existe una disposición de elementos que satisfaga ?. Las características de tales problemas implica potencialmente una búsqueda exhaustiva de todas las posibles combinaciones de algún conjunto finito, que si no está controlado puede producir una "explosión combinatoria" (incremento exponencial del espacio de búsqueda con la dimensión del problema) imposible de tratar.

La Programación Heurística ha venido a significar el uso del conocimiento específico del dominio para cubrir esta explosión de posibilidades guiando la búsqueda por las direcciones más prometedoras.

La Programación Heurística implica una forma de modelizar el problema en lo que respecta a la representación de su estructura, estrategias de búsqueda y métodos de resolución, que configuran el Paradigma Heurístico.

Este tipo de programación se aplica con mayor intensidad en el campo de la Inteligencia Artificial (I.A.), y en especial, en el de la Ingeniería del Conocimiento, dado que el ser humano opera la mayor parte de las veces utilizando heurísticas, un hecho cierto que una heurística es la conclusión del razonamiento humano en un dominio específico, por lo que es normal que este tipo de programación que encuadrado en el área de la I.A, ya que implementa el conocimiento humano, dado por la experiencia, utilizando reglas de buena lógica.

Por otra parte, la Programación Heurística se presenta y utiliza desde diferentes puntos de vista:

  • Como técnica de búsqueda para la obtención de metas en problemas no algorítmicos, o con algoritmos que generan explosión combinatoria (ej. damas. ajedrez, etc.)
  • Como un método aproximado de resolución de problemas utilizando funciones de evaluación de tipo heurístico (ej. algoritmos A*, AO*)
  • Como método de poda para estrategias de programas que juegan, aunque estos métodos no son realmente heurísticos (ej. poda alfa-beta).

En general, un modelo heurístico es aconsejable si puede proporcionar resultados superiores a los del modelo actual.

Un paradigma que corresponde a los lenguajes de cuarta generación es la inteligencia artificial, que se ha resuelto con lenguajes de programación como PROLOG y LISP; el primero, desarrollado en 1956-1962 por J. McArthy y el segundo por A. Colmerauer en 1972, para el desarrollo de inteligencia artificial, que corresponden ambos a la definición de lenguajes funcionales o aplicativos.

Ejemplo: Problema de las jarras de agua:

Se tienen dos jarras de agua, una de 4l y otra de 3l sin escala de medición.

Se desea tener 2l de agua en la jarra de 4l. Las siguientes operaciones son válidas: llenar las jarras, tirar agua de las jarras, pasar agua de una jarra a otra.

Solución:

  • El espacio de estados se define como { (X,Y)/ X son los litros en la jarra de 4l con 0<=X<=4 AND Y son los litros de la jarra de 3l con 0<=Y<=3 }
  • El estado inicial es (0,0)
  • El estado final es (2,0). El estado final podría ser (2,N) en caso de que no importen los litros de la segunda jarra.
  • Las reglas que se pueden aplicar son:
    • 1- Llenar la jarra de 4l: Si (X,Y) AND X<4 => (4,Y)
    • 2- Llenar la jarra de 3l: Si (X,Y) AND Y<3 => (X,3)
    • 3- Vaciar la jarra de 4l: Si (X,Y) AND X>0 => (0, Y)
    • 4- Vaciar la jarra de 3l: Si (X,Y) AND Y>0 => (X, 0)
    • 5- Pasar agua de la jarra de 4l a la jarra de 3l hasta llenarla: Si (X,Y) AND X>0 AND X+Y>=3 => (X-(3-Y),3)
    • 6- Pasar agua de la jarra de 3l a la jarra de 4l hasta llenarla: Si (X,Y) AND Y>0 AND X+Y>=4 => (4, Y-(4-X))
    • 7- Pasar toda el agua de la jarra de 4l a la jarra de 3l: Si (X,Y) AND X>0 AND X+Y<3 => (0,X+Y)
    • 8- Pasar toda el agua de la jarra de 3l a la jarra de 4l: Si (X,Y) AND Y>0 AND X+Y<4 => (X+Y,0)

El programa debería encontrar un pasaje de estados para ir del estado (0,0) al estado (2,0). Puede existir más de un pasaje de estados hacia la solución, por ejemplo:

(0,0) => (0,3) => (3,0) => (3,3) => (4,2) => (0,2) => (2,0)

en la cual, a partir del estado inicial, se aplicaron las reglas 2, 8, 2, 6, 3 y 8, hasta conseguir el estado objetivo.

Otro pasaje de estados hacia la solución es la siguiente

(0,0) => (4,0) => (1,3) => (1,0) => (0,1) => (4,1) => (2,3) => (2,0)

en la cual se aplicaron las reglas 1, 5, 4, 7, 1, 5 y 4

Con respecto a las reglas se puede concluir que:

  • Las condiciones que se establecen en la parte izquierda a veces no son altamente necesarias pero restringen la aplicación de la regla a estados más adecuados. Esto incrementa la eficiencia del programa que utiliza las reglas. En el ejemplo anterior, la regla

    Llenar la jarra de 4l: Si (X,Y) AND X<4 => (4,Y)
    contiene la condición (X<4), especificando que la jarra no se encuentra llena. Si esta condición no se incluye, se puede aplicar la regla aún cuando la jarra está llena. Dado que en este caso el estado del problema no cambia la aplicación de la regla se considera inútil

  • Las reglas no sólo deben describir el problema sino también algún tipo de conocimiento sobre su solución. Si en el ejemplo anterior se considera la siguiente nueva regla:

    Vaciar "un poco" la jarra de 4l: Si (X,Y) AND X>0 => (X-Q, Y)
    es decir, tirar agua sin cuantificar, intuitivamente se concluye que la aplicación de esta regla nunca nos acercará a la solución del problema.

  • A veces, cuando se alcanzan algunos estados resulta obvio cómo se debe continuar hacia la solución. Es posible agregar reglas de propósito especial que capturen el conocimiento sobre casos especiales que conducen a la resolución del problema. En el ejemplo anterior, se pueden agregar las siguientes reglas de propósito especial:

    Si (X,2) => (2,0)

    Si (2,Y) AND Y>0 => (2,0)

    Estas reglas no añaden más potencia al sistema ya que las operaciones que describen las proporcionan otras reglas más generales. En el ejemplo, la primera regla agregada es equivalente a la aplicación de las reglas generales 3 y 8; y la segunda regla agregada es equivalente a la aplicación de la regla general 4. Dependiendo de la estrategia de control que se utilice para seleccionar reglas durante la resolución del problema se puede mejorar el rendimiento si se les da preferencia a las reglas de casos especiales.

METODOS DE BUSQUEDA
  1. Búsqueda Breadth-First Search (primero en ancho) Este algoritmo de búsqueda visita cada nodo del árbol por niveles, es decir, visita todos los nodos de un nivel antes de visitar los del siguiente. A continuación se detalla un pseudo-código de este algoritmo:

    Lista_nodos = [estado_inicial];
    Mientras Not Vacia(lista_nodos)
    estado_actual = lista_nodos.primero;
    Si EstadoFinal(estado_actual) entonces
    Terminar;
    Sino
    lista_reglas = ReglasAplicables (estado_actual);
    Mientras NOT Vacia(lista_reglas)
    estado_sucesor = AplicarRegla (lista_reglas);
    lista_nodos = lista_nodos + [estado_sucesor];
    Fin Mientras;
    Fin Sino;
    Fin Mientras;

    Con la búsqueda a lo ancho se asegura que una vez alcanzada una solución no existe otra ruta hacia la solución que tenga menor cantidad de pasos. Una desventaja de este algoritmo es que para alcanzar una solución de n pasos, debe haber explorado todo el espacio de estados hasta ese nivel.

  2. Búsqueda Depth-First Search (primero en profundidad)
    Este algoritmo de búsqueda continúa por una rama del árbol hasta encontrar la solución o decidir terminar la búsqueda por esa dirección (por llegar al estado final, por tener un largo de ruta que supera una cota máxima determina, por haber llega a un estado ya visitado, etc.). Al fracasar una ruta, se realiza un backtracking o vuelta atrás, continuando la exploración en el paso inmediatamente anterior. A continuación se detalla un pseudo-código de este algoritmo recursivo que incialmente es llamado con el estado_inicial:

    Función Buscar (estado_actual) devuelve Boolean
    Comienzo
    Si EstadoFinal(estado_actual) entonces
    Devolver TRUE;
    Sino
    exito = FALSE;
    lista_reglas = ReglasAplicables (estado_actual);
    Mientras NOT exito AND NOT Vacia(lista_reglas)
    estado_sucesor = AplicarRegla (lista_reglas);
    exito = Buscar (estado_sucesor);
    Fin Mientras;
    Devolver exito;
    Fin Sino;
    Fin Buscar;

    Como desventajas de este algoritmo se señala que puede seguir una ruta infructuosa durante muchos pasos, y además la primera solución que encuentra puede distar mucho de ser la solución de mínima cantidad de pasos.

PARADIGMA: La experiencia no tiene valor ético..
..solo es el nombre que le damos a nuestros errores..!!! (Wilucha)

Paradigma Imperativo

Llamado también PARADIGMA ALGORITMICO: Encuentra soluciones a problemas basándose en la operativa de la máquina de VON NEWMAN, que está provista de un programa en su memoria, el cual se va ejecutando secuencialmente, alimentándose de datos de tal memoria, con los que efectúa sus cálculos, para luego actualizar esta memoria.

La programación en el entorno del paradigma imperativo determina los datos que son requeridos para el cálculo, asocia a esos datos a variables que son direcciones de memoria, para luego efectuar paso a paso, las transformaciones de los datos almacenados, de forma que el valor final de la variable sea el resultado buscado.

En el lenguaje común, a la serie de transformaciones realizadas sobre los datos originales les llamamos cálculos, que son generados por los algoritmos que transforman los datos de entrada en la solución al problema en cuestión.

Para guiar estos cálculos, el paradigma imperativo proporciona en su versión básica las siguientes estructuras de control de flujos de datos:

  • SECUENCIAL:
    Típica de la propia naturaleza de la máquina, donde se ejecutan una a continuación de otra cada una de las instrucciones del programa almacenado en su memoria.

  • SELECCION CONDICIONAL:
    Produce una bifurcación del flujo de datos, cuando se cumple cierta condición préviamente definida, caso contrario, seguiría el curso secuencial del programa.

  • SELECCION INCONDICIONAL:
    Bifurca imperativamente la estructura secuencial del flujo de datos, obligando a ejecutar una instrucción distinta a la siguiente en el orden específicado por el programador.

Estas estructuras básicas existen en cualquier programa construido bajo el paradigma imperativo, cuya evolución ha generado otros nuevos tipos de estructuras de control de flujo, tales como while, do, if..then..else, etc que simplifican la tarea del programador.

Además, la naturaleza primaria de las celdas de memoria ha sido sustituida progresivamente por abstracciones como las variables, registros, array y otros tipos de datos complejos que simplifican el diseño de los algoritmos del programa.

Independiente de tales modificaciones, el rasgo característico del paradigma imperativo es la presencia de EFECTOS LATERALES, porque maneja el concepto de celda de memoria o las abstracciones surgidas sobre él, donde los cálculos intermedios siempre modificaran tales celdas, variables o estructuras de datos que representan el estado actual del problema en la computadora.-

Por otra parte, la existencia de estructuras de control es inevitable ya que la implementación de un algoritmo implica la existencia de una serie de pasos precisos, en forma de secuencias de instrucciones, bifurcaciones, repeticiones definidos por el programador.

En este ámbito, un error en la secuencia será un error lógico que implicará un resultado erróneo, y un error en la asignación de un valor a una variable implicará un error de cálculo que distorsionará los cálculos subsiguientes.

CARACTERISTICAS del PARADIGMA IMPERATIVO:
Opera comandos que actualizan variables que estan en almacenamiento. Basado en el modelo de computador del modelo de Von Neumann, que es una máquina capaz de ejecutar una serie de instrucciones secuencialmente, una tras de otra. Estas instrucciones deben estar almacenadas en memoria principal para poder ser leídas y ejecutadas por la unidad de control. Los dispositivos periféricos nos permiten obtener los resultados e introducir datos que queremos procesar en el sistema.

Como un Algoritmo, es un método preciso para resolver automáticamente un problema. Consta de una representación de los datos que se manejan y un conjunto de pasos tales que cada uno de ellos resuelve un problema menor. Es necesario describir el orden en el que se deben ejecutar estos pasos para poder introducirse en el ordenador y para esto,el paradigma imperativo tiene su límite natural en dos de sus características intrínsecas:

  1. EFECTOS LATERALES: La existencia de estos efectos por una aparte, hacen que los programas no sean seguros puesto que cualquier posición de memoria puede ser actualizada de forma no adecuada, y otra parte, el concepto de una única memoria global actualizada de forma repetida por las instrucciones del programa dificulta la portabilidad y reusabilidad de código.-

    Por tal razón, para minimizar los problemas por la existencia de variables en memoria compartida aparece el paradigma funcional, donde la ausencia de efectos laterales es su rasgo definitorio fundamental.

  2. LIMITACION de APLICACION: Su operativa se ajusta únicamente a aquellos problemas de naturaleza algorítmica clásica, similares en ejecución al de los cálculos matemáticos que no abordan con solvencia muchos problemas interesantes para resolver con la computadora.

En resumen, el paradigma imperativo propicia un entorno de programación procedimental, donde la secuencia de control y el concepto de variable son sus componentes fundamentales, que destacan las siguientes características:

EL ALGORITMO: Puede ser entendido como la estructura que guía la definición de las acciones que debe realizar un programa, como también sus estructuras de datos de tipo de variable, tales como el array, registro, fichero, etc., sobre los que acturá el algoritmo.

Por ello, este paradigma llamado también ALGORITMICO, es de tipo procedimental de efecto lateral, que insume mucha memoria para almacenar salidas codificadas de procesos y efectua secuencias de instrucciones para modificar tal memoria.

Este paradigma, asocia datos necesarios para cálculos con direcciones de memoria, para luego efectuar secuencias de transformaciones en los datos almacenados, hasta lograr el resultado final. Se caracteríza por aplicar:

  1. CONCEPTO DE CELDA DE MEMORIA ( variable ):
    Posee almacenamiento de datos en una memoria provista de muchas celdas donde guarda los valores de cada variable usada. Este componente principal de la arquitectura es la memoria, compuesto por un gran número de celdas donde se almacenan los datos. Las celdas tienen nombre (concepto de variable) que las referencian, y sobre los que se producen efectos de lado y definiciones de alias.

  2. OPERACIONES DE ASIGNACION
    Cada valor calculado es almacenado o asignado a la celda, de manera de actualizar el valor grabado. Está ligado a la arquitectura de la memoria, se encuentra la idea de que cada valor calculado debe ser "almacenado", es decir asignado a una celda. Esta es la razón de la importancia de la sentencia de asignación en el paradigma imperativo. Las nociones de celda de memoria y asignación en bajo nivel, se tienden a todos los lenguajes de programación y fuerzan en los programadores un estilo de pensamiento basado en la arquitectura de Von Neumann. Las asignaciones poseen la forma siguiente:

    expresión1:=expresión2
    donde: 1: denota la localidad de memoria y 2 : denota un valor.

  3. REPETICION
    El programa imperativo efectua su tarea iterando secuencias de pasos elementales o sea, realiza su tarea ejecutando repetidamente una secuencia de pasos elementales, ya que en este modelo computacional la única forma de ejecutar algo complejo es repitiendo una secuencia de instrucciones.

PROGRAMACION IMPERATIVA
Debido a su relación cerrada con las arquitecturas de las máquinas, los lenguajes de Programación Imperativa pueden ser implementados eficientemente.

La base de la programación imperativa es la completa especificación y manipulación controlada de datos con nombre de una manera secuencial. Esta programación se cree que se ajusta a la mente humana. Sus características son:

  1. Los Datos. Cada dato tiene una representación y un número de propiedades conocidas como tipo.
  2. El Estado De Los Programas. Una actividad importante de un programa en un lenguaje imperativo es el cambio del estado interno de la computadora representado por los valores de las variables y del estado externo representado por las entradas y salidas a dispositivos.
  3. El Flujo De Control. Los lenguajes imperativos dan al programador un control extensivo sobre el orden en el cual se ejecutan los enunciados en el programa. Los mecanismos usuales son: secuencia, selección, repetición e invocación de rutinas.
  4. La Composicion De Los Programas. Se pueden distinguir cuatro niveles de jerarquía: bloques, rutinas, paquetes (módulo o tareas) y programas.
  5. Efectos de una Asignación: Una propiedad característica de una asignación es que cambia el valor almacenado (estado actual) en una dirección (localidad) de memoria en un computador. Los conceptos de "estado" y "localidad" vienen directamente del modelo del computador para el lenguaje imperativo.

    Ejemplo 1:

    	Programa:	 a:=b+c
    		 b:=b+1
    
    	Estado 0:	a=2
    		b=3
    		c=4
    
    	 Modificacion:	a:=b+c
    	 Estado 1:	a=7
    			b=3
    			c=4
    
    	 Modificacion:	 b:=b+1
    	 Estado 2:	 a=7
    			 b=4
    			 c=4

    Ejemplo 2: Cálculo del modulo entre 2 números

    	función mod (x, y: enteros) : entero
    	inicio
    	z := x
    	mientras z >= y hacer
    	z := z - y
    	finmientras
    	devolver z
    	fin
    

    Resultan las siguientes caraceristicas:

    • Asignación de memoria almacenamos el valor del argumento en una variable z

      z:=x

    • Todos los calculos efectuados son almacenados en alguna direccion de memoria(variable):

      z := z - y

    • Repeticion , se ejecuta una instruccion en forma repetida mientras cumpla con una condición (z >= y):

      mientras

      z >= y hacer

      z := z - y

      finmientras

Paradigma: La lógica es un método sistemático
que puede generar con confianza..
... la conclución erronea..!!
( Wilucha )

Paradigma Lógico

Resuelve problemas descriptos como las relaciones de un conjunto de datos, sobre las que aplica reglas de deducción y a partir de tales premisas genera conclusiones aceptadas como validas. Usa la lógica de predicados, o aserciones lógicas que representan el conocimiento sobre un ambito.

El programador especifica hechos y propiedades del problema, no como debe resolverse; es el sistema quién debe buscar la solución, usando:

  • Hechos o asertos y reglas para representar la información
  • Deducciones para responder consultas, y generar nuevos hechos, a partir de sus componentes lógicos y secuencias de control del sistema, automatizando así la corrección del programa.
  • Verificación de las transformaciones, evaluadas partiendo de metas. Si se prueba que se ajustan a hechos o se deducen de alguna regla, entonces sus antecedentes se convierten en nuevas metas.
  • La solución final resulta de aplicar resultados intermedios de las variables de la meta inicial, usando un proceso iterativo, que concluye cuando las sub-metas son probadas.

Robert Kowalski crea el paradigma lógico, basado en las cláusulas de Horn, registradas en formato restrictivo, como un subconjunto de la Lógica de Predicados de primer orden. Desde el Imperial College de Londres uso tal formato restrictivo, provisto de una conclusión por cláusula, expresando mediante notación causal, proposiciones condicionales que combinan variables, constantes y expresiones de la forma:


   Casado( x, y )   
   SI esposo( y , x )  o  
   esposa( x , y )

  • ESTRUCTURA DEL PARADIGMA LOGICO
    Estructurado como conjunto de asertos o proposiciones o hechos de reglas lógicas establecidas apriori, que generan conclusiones ya sea a partir de una serie de preguntas o por cuestiones lógicas, de modo que tales conjunto de hechos o asertos y reglas permitirán deducir nuevos hechos. Ejemplo
    
        Para el aserto Pity es padre: 
        Para todo y,  Si y es padre,  y es masculino,     
        
        Se puede deducir que Pity es masculino. 
    

    La programación lógica además de ser técnica que expresa adecuadamente hechos y reglas que definen un problema; es una estructura de componentes lógicos de un algoritmo, donde el sistema provee la secuencia de control y que al separarse de la lógica, el programa migra a un conjunto de declaraciones formales de especificaciones correctas por definición, así la eficiencia del programa queda probada automáticamente.

    La evaluación empieza definiendo una meta, luego probando que esta se ajusta a un hecho o se deduce de alguna regla. Si la transformación existente es verificada por sus antecedentes, entonces estos se convierten en nuevas metas a equipararse con hechos o bien, resolverse vía otras reglas.

    Y así, el proceso termina cuando todas las sub-metas han sido probadas y la solución final se determina aplicando a las variables de la meta inicial, los resultados intermedios obtenidos.

    Si se selecciona una regla, existirá tal regla para alcanzar la solución, que se logrará si existe un conjunto apropiado de reglas y sustituciones que aplicadas, generaran un conjunto de reglas base que permitiran deducir las metas desde hechos conocidos.

    El problema es definir el mecanismo de búsqueda adecuado para seleccionar las reglas, para ello:

    • Busca primero en profundidad con un algoritmo de BackTracking ó Método de resolución, el cual, cuando requiere elegir una regla, selecciona la primera que encuentra.
    • Si la regla elegida conduce a un punto muerto, selecciona la segunda y así hasta que hayan sido probadas todas las alternativas.

    El Paradigma Lógico se basa en la creación de reglas por parte del programador, que luego serán aplicadas para resolver ciertos problemas dados y en los que se pueden destacar los siguientes aspectos:

    • Ejecución: Meta que intenta probarse a partir de los hechos y reglas.

    • Aplicación de reglas por backtracking: Método de resolución.

    • Soporte de la información Lista.

    • Lógica: Asertos y reglas.

    • Control: Mecanismo de resolución.

    • Estructuras de datos: Constantes, variables y listas.

    La programación lógica implica el uso de Hechos y reglas para representar la información y luego deducciones para responder consultas; por su parte los programadores proporcionan los hechos y las reglas, mientras que el lenguaje usa la deducción para calcular respuestas a consultas.

    Un programa lógico se configura como un conjunto de hechos( asertos o proposiciones ) y de reglas lógicas previamente establecidas, que generan conclusiones ya sea a partir de una serie de preguntas o cuestiones lógicas, de modo que tales conjuntos de hechos o asertos y reglas permitirán deducir nuevos hechos. Por ejemplo: Lógica + Control + Estructuras de datos = Programa

    Donde :

    • LOGICA:
      Constituida por

      • HECHOS: Que permiten establecer relaciones entre objetos.
        
            Ejemplo:
                    Chita es amiga de Tarzan
                       OBJETOS: Chita y Tarzan
                       RELACION: amiga
            

      • REGLAS LOGICAS: Expresan que un hecho depende de un grupo de otros hechos.
        
            Ejemplo:
                    X es el abuelo paterno de Y si
                    X es el padre de Z
                    Z es el padre de Y  
            

    • CONTROL: Inherente al sistema, son las estrategias a seguir para investigar las cuestiones lógicas.

      Ejemplo:
      estrategia de búsqueda “ primero en profundidad”

    • ESTRUCTURA DE DATOS: Son los elementos que soportan la base de conocimiento y cuestiones lógicas.

      Ejemplo:
      variables, listas, constantes, etc.

  • DESCRIPCION DEL PARADIGMA LOGICO
    La representación en el Paradigma Lógico abarca los siguientes aspectos:
    • TERMINOS:
      • Variables (A, B, X),
      • Constantes (Cayo, 2, Moto) y
      • Funciones cuyos argumentos son términos (f(x), padre(Cayo)).

    • PREDICADOS: Símbolos de n argumentos (que son términos) que toman el valor verdadero o falso.

      Moto(X), Valioso(veloz), Es-padre(veloz, padre(cometa)).

    • CLAUSULAS DE HORN: Hechos o reglas formadas por varios antecedentes (conjunción) y un consecuente.
      Consecuente: antecedente1, antecedente2, . . .

      La disyunción se representa añadiendo reglas.

    • UNIFICACION DE PREDICADOS: No siempre es posible realizar tal unificación que es un proceso por el cual se transforman dos expresiones lógicas para hacerlas idénticas. El algoritmo para unificación de dos predicados usa:

      Los símbolos de los predicados deben ser iguales y con el mismo número de argumentos. Si no, se termina con fallo, por cada término de ambos predicados puede suceder:

      • Si un término es una variable y el otro es cualquier término que no contenga a esa variable, se sustituye la variable por el término.

      • Si los dos términos son constantes con el mismo valor, ya están unificados. Si el valor es distinto se termina con fallo.

      • Si los términos son funciones, deberán llamarse igual y tener el mismo número de argumentos. Se aplica recursivamente el algoritmo a los argumentos de la función.

      • Si no se cumple ningún caso, se termina con fallo.

    • ENCADENAMIENTO DE REGLAS
      1. Se parte de una lista L de objetivos O1 O2 ... On . . .

      2. Selección

        • Seleccionar un objetivo Oi por orden de aparición

        • Seleccionar una cláusula Rj por orden de aparición.

          Renombrar sus variables.

          Si el consecuente de Rj puede unificarse con Oi, se crea una nueva rama realizando las sustituciones necesarias; si no se puede unificar Ë la rama termina en fracaso.

      3. Resolución:
        Oi se sustituye en L por el antecedente de Rj . A todas las cláusulas de L se les aplica las sustituciones de la unificación.

      4. Si L vacía -> la rama termina en éxito; si no, volver al paso 2.

      El algoritmo termina cuando se han recorrido todas las ramas

  • LENGUAJE PROLOG
    Creado por Alain Colmenauer en la Universidad de Marsella en 1972, PROLOG es un lenguaje declarativo afin al Paradigma Lógico, estructurado sobre la descripción de hechos conocidos y las relaciones existentes entre ellos, para luego a partir de los cuales, deduce nuevos hechos para resolver automáticamente el problema.

    Lenguaje poco comercial, que solo tuvo su auge en los ochentas, cuando Japón propone el proyecto destinado a la quinta generación de ordenadores de máquinas de inteligencia artificial, con PROLOG como lenguaje nativo capaces de pensar, sacar conclusiones, emitir juicios e incluso comprender las palabras escritas y orales.

    PROLOG dotado de un motor de inferencia que realiza búsquedas en su base de hechos, es un lenguaje de programación declarativa; donde:

    • El programador declara los objetos del dominio.
    • El programador declara en forma de lógica formal las relaciones entre tales objetos.
    • A partir de esos datos, PROLOG aplicando la lógica de primer orden, infiere consecuencias.

    ELEMENTOS DE PROLOG:
    El lenguaje Prolog consta de dos tipos de elementos: Hechos y Reglas. Con estos opera predicados, constantes, variables, cuyos nombres de variables comienzan con mayúsculas.

    Los tipos de datos básicos de PROLOG son:

    • Atomos,
    • Números y
    • Cadenas de caracteres.

    Describamos estos elementos:

    • HECHOS:
      O sentencias mediante las cuales, se expresan las relaciones que existen entre los objetos que conforman el ambiente de nuestro sistema; tienen el siguiente formato:

      nombre-de-predicado(constante...)

      Ejemplo que establece la relación o el hecho de que Cayo y Pity son hermanos:

      Hermano (Cayo, Pity).

      Con la definición de todos los hechos, o la base de hechos, se constituye la información que puede ser explotada, para encontrar soluciones.

    • VARIABLES:
      Usadas para la definición de reglas, cuyo ámbito se reduce a la regla en la que aparecen, por tanto no existen variables globales. Comienzan con una letra mayúscula.

      Ejemplo: Pity

      Como un caso particular existe la variable anónima, identificada con el guión bajo ("_"), y que sirve para almacenar valores temporales dado que su referencia posterior no será necesaria.

    • ESTRUCTURAS DE DATOS:
      PROLOG como lenguaje declarativo posee listas que permiten gran flexibilidad de uso, estan representadas por series de elementos entre corchetes y separadas por comas.

    • REGLAS:
      Permiten establecer sentencias para determinar la relación entre hechos, en forma de implicaciones del tipo p®q, aunque en PROLOG deberíamos leer en el sentido contrario, es decir qp.

      Las reglas tienen la forma:

      nombre-de-predicado(constante o variable...) :- nombre-de-predicado(constante o variable...)...

      Ejemplo: Hermano_de(X,Y):-hombre(X), padres(X,M,P), padres (Y,M,P).

      La cual se lee como:
      Si X es hombre y los padres de X (MP) son los mismos que los de Y (MP), entonces establece el hecho de que X es hermano de Y.

    • OPERADORES:
      Para la definición de reglas es posible hacer uso de la mayoría de los operadores relacionales y aritméticos básicos, cuya precedencia y asociativa es la misma a la que estamos acostumbrados en la mayoría de los lenguajes de programación.

      Además existe el operador "is", el cual puede decirse que representa al operador de asignación, aunque en algunos casos puede ser interpretado como el operador relacional igual.

      Velocidad (X,V): distancia_recorrida(X.D), tiempo_utilizado(X,T), V is D7T.

      Leído como:
      Si la distancia recorrida por X es D, y el tiempo utilizado por X es T, se calcula y almacena en V, la velocidad, por medio de la división de la distancia entre el tiempo, y se concluye que X tiene una velocidad V.

      PROLOG posee operadores para lectura y escritura de información como el "read" y "write" y otros operadores como el "½" que facilitan el manejo de listas.

    Veamos los siguientes ejemplos en PROLOG:

    EJEMPLO 1 PROLOG:
    Que destaca la estructura del programa utilizando el Paradigma Lógico: Predicados, Cláusulas, y Resultados (goal).

    
         database - tmp
                    hijo(STRING, STRING)
                    hermana(STRING, STRING)
                    hermano(STRING, STRING)
                    casado(STRING, STRING)
    
         clauses
                    hijo("Paco","Cacho").
                    hermana("Mary","Carola").
                    hermano("Tomas","Lucas").
                    casado("Paco","Mary").
                    casado("Lucas","Graciela").
    
         predicates
                    padre(STRING padre, STRING chico)
                    abuelo(STRING abuelo, STRING nieto)
                    cuñada(STRING, STRING)
    
         clauses
                    padre(A,B):-
                           hijo(B,A).
                    abuelo(A,B):-
                           padre(A,C),
                           padre(C,B).
                    cuñada(A,B):-
                           casado(A,C),
                           hermano(C,B).
    
         goal
                    cuñada("Paco",Z),
                    format(Msg,"cuñada(\"Paco\",%)",Z),
                    write(Msg).
    

    EJEMPLO 2 EN PROLOG:

    
       Domains
         Wilo = symbol
       
       Predicates
         Wilo(symbol)
         juegan(Wilo,Wilo)
    
       Clauses
         Wilo(a).
         Wilo(b).
         Wilo(c).
    
        juegan(X,Y):-   Wilo(X),Wilo(Y),
    
        X<>Y,write(X," juega vs. ",Y),
                                nl, fail.
    
      Goal
        juegan(S,T).
    

    EJEMPLO: de paradigma lógico en C++ BUILDER La empresa "Encuentros" dedicada a la búsqueda de formar parejas, cuenta con una base de datos Prolog de todas las personas que desean encontrar una pareja. La Base de Datos se estructura por una serie de hechos de la forma:

    
      Hombre(ApellidoyNombre,dni) Mujer(ApellidoyNombre,dni) Datos(dni,prov,edad,desc)
      Hombre(ApellidoyNombre,dni) Mujer(ApellidoyNombre,dni) Datos(dni,prov,edad,desc)
      . . . . . .                   . 
      Hombre(ApellidoyNombre,dni) Mujer(ApellidoyNombre,dni) Datos(dni,prov,edad,desc)
    

    Los argumentos del predicado "datos" tienen la siguiente interpretación:

    
       dni 	    : es el número de documento de la persona.
       provincia: lugar de residencia de la persona.
       edad 	: describe la edad de la persona.
       desc 	: características de la persona.
    

    Definiremos el nuevo hecho “armar pareja” con los siguientes argumentos ( dni,provincia, salida) en donde dni es el documento de identidad de la persona que busca pareja, provincia es el nombre de la provincia donde vive y salida es una lista de los posibles candidatos.

    Para describir este nuevo hecho se necesitan un conjunto de reglas:

    • Se deberá tener en cuenta que solo se podrán armar parejas de una misma provincia.
    • Que la diferencia de edad no sea mayor a 5 o 10 años, según la eleccion de la persona.

    Luego de una consulta lógica ( se pedirá el dni y la provincia de la persona a buscar pareja) obtendremos como resultado los posibles candidatos.

    Registro de datos de personas a buscar parejas EN LA BASE DE DATOS en C++ BUILDER El siguiente código corresponde al ejemplo descripto anteriormente,

    
    void __fastcall TForm1::BguardarClick(TObject *Sender)
    {
    int cont,n=0,r=0,t=0;
    
      if((Enombre->Text=="") ||(Edni->Text=="") || (Eciudad->Text=="")||(Eedad->Text=="")||(Esexo->Text=="")|| (Mdesc->Text==""))
         {
         Application->MessageBox("Campos vacios","INGRESE DATOS POR FAVOR",MB_OK);
          n=1; }
     
     if(n==0)
         {  DMparejas->Tdatos->First();
          for ( cont =0; cont < DMparejas - >Tdatos->RecordCount; cont++)
            {  if(t==0)
               { if( StrToInt(Edni->Text)== DMparejas->Tdatos->FieldValues["DNI"])
                { Application->MessageBox("DNI EXISTENTE","ATENCION",MB_OK);
                        r=1;t=1;
                        Edni->Clear();
                        Enombre->Clear();
                        Eciudad->Clear();
                        Eedad->Clear();
                        Esexo->Clear();
                        Mdesc->Clear();
                 } }
                         DMparejas->Tdatos->Next();
              }
    
          }
    
       if((n==0)&&(r==0))
         {
            if( Esexo->Text=="F" )
             {
            DMparejas->Tmujer->Append();
            DMparejas->Tmujer->FieldValues["DNI"] = StrToInt(Edni->Text);
    
            DMparejas->Tmujer->FieldValues["NOM_APELL"] = Enombre->Text;
            DMparejas->Tmujer->Post();
            DMparejas->Tdatos->Append();
            DMparejas->Tdatos->FieldValues["DNI"] = StrToInt(Edni->Text);
            DMparejas->Tdatos->FieldValues["CIUDAD"] = Eciudad->Text;
            DMparejas->Tdatos->FieldValues["SEXO"] = Esexo->Text;
            DMparejas->Tdatos->FieldValues["EDAD"] = Eedad->Text;
            DMparejas->Tdatos->FieldByName("DESC")->AsString =Mdesc->Text.c_str();
            DMparejas->Tdatos->Post();
              }
            if( Esexo->Text=="M")
             {
            DMparejas->Thombre->Append();
            DMparejas->Thombre->FieldValues["DNI"] = StrToInt(Edni->Text);
            DMparejas->Thombre->FieldValues["NOM_APELL"] = Enombre->Text;
            DMparejas->Thombre->Post();
            DMparejas->Tdatos->Append();
            DMparejas->Tdatos->FieldValues["DNI"] = StrToInt(Edni->Text);
            DMparejas->Tdatos->FieldValues["CIUDAD"] = Eciudad->Text;
            DMparejas->Tdatos->FieldValues["SEXO"] = Esexo->Text;
            DMparejas->Tdatos->FieldValues["EDAD"] = Eedad->Text;
            DMparejas->Tdatos->FieldByName("DESC")->AsString =Mdesc->Text.c_str();
            DMparejas->Tdatos->Post();
              }
                        
          }
    }
    
    void __fastcall TForm1::BmodiClick(TObject *Sender)
    {
    F_modi->ShowModal();
     
    }
    void __fastcall TForm1::BconsClick(TObject *Sender)
    {
    GBrestriccion->Visible=true;
    comboedad->Text;
    }
    
    void __fastcall TForm1::BaceptarClick(TObject *Sender)
    {int cont;
    
    if(comboedad->Text=="")
      ShowMessage("Eliga edad");
      
    else
     {
      Pconsulta->Visible=true;
      Lsalir->Visible=true;
      Linfo->Visible=true;
      comboedad->Text="5";
      GBrestriccion->Visible=false;
     
    Max = DMparejas->Tdatos->RecordCount;
        combodni->Clear();
        DMparejas->Tdatos->First();
    
    for ( cont =0; cont < Max; cont++ )
      {  combodni->Items->Add(DMparejas->Tdatos->FieldValues["DNI"]);
         DMparejas->Tdatos->Next();
    
       }
        DMparejas->Tdatos->First();
         combodni->ItemIndex = 0 ;
      }
    }
    
    ---------MUESTRA LOS POSIBLES CANDIDATOS DE UNA PERSONA -------
    
    void __fastcall TForm1::BcandidatosClick(TObject *Sender)
    {
     int i,b,dni,Max,Maxi,edad1,edad2,dif,ban;
        ban=0;
         Mcandidatos->Clear();
      Max = DMparejas->Tdatos->RecordCount;
      b=0;
      DMparejas->Tdatos->First();
      for ( i =0; i < Max; i++ )
      {
        if( (StrToInt(combodni->Text)==DMparejas->Tdatos->FieldValues["DNI"]&& comboprov->Text==DMparejas->Tdatos->FieldValues["CIUDAD"]))
          {  ban=1;
             edad1= DMparejas->Tdatos->FieldValues["EDAD"];
             Esexo->Text=DMparejas->Tdatos->FieldValues["SEXO"];
          }
    
          DMparejas->Tdatos->Next();
      }
     if(ban==0)
       ShowMessage("Datos incorrectos");
    
    else
      {
        if( ban==1)
        { GBcandidatos->Visible=true;
          Pconsulta->Visible=false;
    
    if( Esexo->Text=="F")
    {     Esexo->Text="M";
          Max = DMparejas->Tmujer->RecordCount;
          DMparejas->Tmujer->First();
          for ( i =0; i < Max; i++ )
           {
             if( StrToInt(combodni->Text)==DMparejas->Tmujer->FieldValues["DNI"])
             {
             Lnombre->Caption=DMparejas->Tmujer->FieldValues["NOM_APELL"];
             }
    
            DMparejas->Tmujer->Next();
            }
          Max = DMparejas->Tdatos->RecordCount;
          DMparejas->Tdatos->First();
    
          for ( i =0; i < Max; i++ )
           {
             if((comboprov->Text==DMparejas->Tdatos->FieldValues["CIUDAD"])&&(Esexo->Text==DMparejas->Tdatos->FieldValues["SEXO"]))
             {
               edad2=DMparejas->Tdatos->FieldValues["EDAD"] ;
               dif=edad2 - edad1;
               edad->Text=IntToStr(edad2);
               dni=DMparejas->Tdatos->FieldValues["DNI"];
               E_desc->Text=DMparejas->Tdatos->FieldValues["DESC"] ;
    
               if((dif>=0)&&(dif<=diferencia))
               {
                Maxi =DMparejas->Thombre->RecordCount;
    
                DMparejas->Thombre->First();
    
               for ( b=0; b< Maxi; b++ )
                {
                   if(dni==DMparejas->Thombre->FieldValues["DNI"])
                     {
                    Mcandidatos->Lines->Add( DMparejas->Thombre->FieldValues["NOM_APELL"] +edad->Text) ;
                    Mcandidatos->Lines->Add(E_desc->Text) ;
                    Mcandidatos->Lines->Add("************");
    
                     }
                     DMparejas->Thombre->Next();
                 }
               }
             }
             DMparejas->Tdatos->Next();
            }
    }
    else
    {
     if( Esexo->Text=="M")
    {     Esexo->Text="F";
          Max = DMparejas->Thombre->RecordCount;
          DMparejas->Thombre->First();
          for ( i =0; i < Max; i++ )
           {
             if( StrToInt(combodni->Text)==DMparejas->Thombre->FieldValues["DNI"])
             {
             Lnombre->Caption=DMparejas->Thombre->FieldValues["NOM_APELL"];
             }
    
            DMparejas->Thombre->Next();
            }
    
    
          Max = DMparejas->Tdatos->RecordCount;
    
          DMparejas->Tdatos->First();
          Mcandidatos->Clear();
          for ( i =0; i < Max; i++ )
           {
             if((comboprov->Text==DMparejas->Tdatos->FieldValues["CIUDAD"])&&
                 (Esexo->Text==DMparejas->Tdatos->FieldValues["SEXO"]))
             {
               edad2=DMparejas->Tdatos->FieldValues["EDAD"] ;
               dif=edad1 - edad2;
               edad->Text=IntToStr(edad2);
    
               E_desc->Text=DMparejas->Tdatos->FieldValues["DESC"] ;
    
               dni=DMparejas->Tdatos->FieldValues["DNI"];
               if((dif>=0)&&(dif<=diferencia))
               {
                Maxi =DMparejas->Tmujer->RecordCount;
    
                DMparejas->Tmujer->First();
    
               for ( b=0; b < Maxi; b++ )
                {
                   if(dni==DMparejas->Tmujer->FieldValues["DNI"])
                     {
                   Mcandidatos->Lines->Add( DMparejas->Tmujer->FieldValues["NOM_APELL"]+edad->Text) ;
                    Mcandidatos->Lines->Add(E_desc->Text) ;
                    Mcandidatos->Lines->Add("***************");
    
                      }
                     DMparejas->Tmujer->Next();
                 }}}
             DMparejas->Tdatos->Next();
            }}}}}}
    

  • RECURSIVIDAD
    La recursividad opera iterativamente sobre las cláusulas; basado en el concepto matemático de inducción planteado de dos maneras:

    • Forma procedural:
      Partimos de un caso genérico hasta llegar a la cláusula de corte de recursividad (así probamos que un hecho o regla se cumple n veces).

    • Forma declarativa:
      Si concebimos el caso inicial (P0), inferimos el caso general (Pn) y vemos que se cumple para n+1.

    Ejemplo de recursividad: el factorial. En pseudocódigo esta función, nos quedaría algo así como:

    
    Factorial (N)
       Si N = 0 entonces Factorial = 1
       Si N > 0 entonces Factorial = N * Factorial (N-1)
    

    Destacaremos que:

    • PROLOG no tiene funciones, por lo tanto, si factorial recibe un argumento y devuelve el factorial de ese número, necesita 2 argumentos: uno de entrada y otro de salida. (Factorial será un hecho o una regla que podrá estar en la base de conocimientos como verdadera o falsa). Siempre que se quiera trasladar una función a este paradigma se debe agregar un argumento más, que será el valor "devuelto" por el predicado.

    • No es posible generar una sentencia N = N -1 que sea válida. Por lo tanto, debemos armar variables temporales (N1 = N - 1) y luego pasarlas como argumentos a las sucesivas llamadas recursivas.

    • No se puede llamar a una regla: factorial (N-1), porque no se permiten expresiones en el envío de parámetros, sólo puedo utilizar variables. Conceptualmente la regla pide valores para determinar si se cumple o no.

    El factorial en Prolog será:

    
    domains
    predicates
       factorial (int, int)
    clauses
       factorial (0, 1):-!.
       factorial (N, FN):- N1 = N - 1, 
                           factorial(N1, FN1),
                           FN = N * FN1.
    

    La primera línea de la sección clauses asocio que factorial de 0 devuelve 1 (esta asociación la hago en forma arbitraria y yo le doy el sentido, PROLOG me permite simplemente armar una relación que llamo factorial entre dos números). El cut evita posteriores ingresos a la cláusula de abajo (también podría haber modificado la segunda regla para que pregunte por N distinto de cero): factorial (N, FN):- N > 0, N1 = N - 1, (etc.)

    En la segunda, utilizo dos argumentos: el primero es un contador, y el segundo un acumulador. Pero como no puedo llamar a factorial (N-1), primero debo guardarlo en una variable auxiliar, a la que unifico con N - 1 y la llamo N1. N1 = N - 1

    Para comprobar que la regla factorial se cumpla para N - 1 y recibiré además un valor para FN1, que está aún sin ligar, es una incógnita que debo resolver. factorial(N1, FN1)

    y finalmente, con el valor devuelto de FN1, aplico FN = N * FN1, y resuelvo la identidad para FN, que indicará el valor de esta "función".

  • L I S T A S
    El primer argumento de una lista es un elemento, el segundo argumento es recursivamente el resto de la lista.

    Para las listas, igual que en los naturales, es necesario un símbolo constante para terminar la recursividad, ésta es la lista vacía que se denomina "nil" y se denota [].

    También se necesita un functor binario que en el caso de Prolog se escribe así:

    [X|Y], donde:
    - X es la cabeza de lista.
    - Y es la cola.
    - El símbolo "|" es el operador de concatenación.

    Las listas son útiles para tratar con una cantidad de elementos desconocida a la hora de implementar una solución. La lista compuesta por los símbolos a, b y c se escribe: [a, b, c], y se representa

    
                lista
                /  \ 
              a     lista
                    /  \
                   b   lista
                       /  \
                      c    []
    

    Una lista compuesta por un solo elemento (el 1) se escribe [1], que no es lo mismo que el elemento que contiene, ya que es una estructura compuesta por:

    
                      lista
                       /  \
                      1    []
    

    De esta manera, podemos descomponer una lista en forma recursiva en cabeza y cola, hasta llegar a la lista vacía, que es indivisible.

    
      [a, b, c] equivale a [a|[b,c]],    y en consecuencia
      [a|[b,c]] equivale a [a|[b|[c]]]   que equivale a    
      [a|[b|[c|[]]]]
    

    La siguiente es una definición del tipo de dato lista:

    
       lista([]).
       lista([Cabeza|Cola]):- lista(Cola).
    

    De esto se deduce que una lista es una lista vacía o la construcción de un par donde la primera parte es un elemento y la segunda es una lista. Ejemplo: cláusula member

    
      domains
    	lista= elemento*
    	elemento= integer
      predicates
    	miembro(elemento,lista)
      clauses		
    	miembro(X, [X|_]).
    	miembro(X, [_|Z]):- miembro(X, Z).
    

    Visión procedural: Si se le hiciera la consulta (goal): miembro(1 ,[2, 1, 8]).

    Prolog:

    • Primero aparea miembro(1, [2, 1, 8]) con miembro(X, [X|_]),
    • Unifica X con 1 y realiza la comparación de X con el primer elemento de la lista, y como este es distinto de 1 la unificación falla.
    • Luego Prolog aparea miembro(1, [2, 1, 8]) con miembro(X, [_|Z]), en este caso la unificación es exitosa, quedando X unificada con 1 y Z con la cola de la lista, o sea [1, 8].
    • La cabeza de la lista no queda unificada a ninguna variable puesto que no es necesario conocer su valor. La manera de lograr esto es usr "_" en lugar de una variable, porque Prolog no permite utilizar variables que luego no van a ser usadas.
    • Como miembro(X, [_|Z]) es la cabeza de una regla, Prolog procederá a verificar la subconsulta miembro(X, Z).
    • Prolog iterará los pasos arriba mencionados, pero con un elemento menos en la lista, que es la cabeza que ha sido descartada, en este caso Prolog si logra la unificación porque X coincide con la cabeza de la lista, y entonces como miembro(X,[X|_]) es un hecho Prolog nos devuelve como respuesta True.

    Este programa, además de verificar si un elemento está en una lista, permite hallar los elementos de una lista: miembro(X, [1, 3]), que devolverá X=1; X=3.

    Visión declarativa:
    Un elemento está en la lista si está en la cabeza o en la cola.

    
    Observación: Si se define la cláusula miembro de la siguiente manera
                 miembro(X, [X|_]):-!.
                 miembro(X, [_|Z]):- miembro(X, Z).
    ¿Cómo impacta el cut en las consultas miembro(X, [1, 2, 3])?
    

  • En el paradigma lógico

    • Proponer problemas en términos del paradigma lógico, implica poder en primer lugar plantearlos en términos de reglas lógicas.

      La aplicación de la lógica a la resolución de problemas se puede ver desde este punto de vista como la modelización a través de un conjunto de fórmulas. Si la representación es buena hay al menos una interpretación que es modelo de dichas fórmulas, es la especificación del problema.

      El uso de la lógica por lo tanto en la resolución de problemas, tiene que ver con pensar el problema como una teoría, expresarla en el lenguaje de la lógica e intentar alcanzar una solución como una demostración de un teorema a partir de dicha teoría

    • El paradigma lógico asume la definición de un conjunto asertos o hechos (Ej: Pity es padre) y un conjunto de reglas que permiten deducir nuevos hechos ( Ej: para todo y, Si y es padre, y es masculino. Con el aserto anterior se puede deducir que Pity es masculino).

    • La evaluación empieza definiéndose una meta e intentando probar que ella se ajusta a un hecho o se deduce de alguna regla.

    • Una meta se deduce de una regla si todos los antecedentes de la regla se verifican con la transformación existente; para lo cual, estos antecedentes se convierten en nuevas metas que deben equipararse con hechos o resolverse vía otras reglas.

    • El proceso termina cuando todas las sub_metas han sido probadas. Y la solución final viene determinada al aplicar los resultados intermedios obtenidos a las variables de la meta inicial.

    • Al seleccionar una regla, existirá tal regla para alcanzar la solución, que se logrará si existe un conjunto apropiado de reglas y sustituciones que aplicadas, generaran un conjunto de reglas base que permitiran deducir las metas desde hechos conocidos.

    • El problema es definir el mecanismo de búsqueda adecuado para seleccionar las reglas, siendo la opción más común, la búsqueda primero en profundidad con un algoritmo de BackTracking o Método de resolución, el cual, cuando necesita elegir una regla, selecciona la primera que encuentra, luego, si ella conduce a un punto muerto, selecciona la segunda y así hasta que hayan sido probadas todas las alternativas.

    • Ordenando cuidadosamente tanto los hechos como las reglas, se puede aumentar la eficiencia de la selección y su terminación, pero esta acción transformaría el paradigma en un pseudo-declarativo.

    • Otra ejecución no declarativa es el uso de cortes, que son dispositivos no lógicos que inhiben el mecanismo de backtracking y fueron introducidos para aumentar la eficiencia de los mecanismos de búsqueda.

    • La programación lógica es una técnica que consiste en expresar adecuadamente todos los hechos y reglas necesarios que definen un problema.

    • La programación lógica además de ser técnica ; es una estructura de componentes lógicos de un algoritmo, donde el sistema provee la secuencia de control y que al separarse de la lógica, el programa migra a un conjunto de declaraciones formales de especificaciones correctas por definición, razón por la cual, automáticamente la corrección del programa quedará probada.

    • El paradigma lógico, permite manejarse de manera declarativa y con la aplicación de las reglas de la lógica. Esto significa que se basa en expresar todas las condiciones del problema y luego buscar un objetivo dentro de las declaraciones realizadas.

    • Esta forma novedosa de tratamiento de la información llevó a pensar en un determinado momento en la revolución que significaría la existencia de “programas inteligentes” que pudieran responder, no por tener en la base de datos determinados conocimientos, sino por poder inferirlos a través de la deducción.

    • El paradigma lógico, es muy usado en las aplicaciones que tienen que ver con la Inteligencia Artificial (sistemas y programas informáticos capaces de realizar tareas complejas, simulando el funcionamiento del pensamiento humano), particularmente en dos campos:
      - Sistemas Expertos
      Un sistema experto es un programa que imita el comportamiento de un experto humano. Por lo tanto contiene información (es decir una base de conocimientos) y una herramienta para comprender las preguntas y encontrar la respuesta correcta examinando la base de datos (un motor de inferencia).
      - Procesamiento de Lenguaje Natural
      En el caso del procesamiento del lenguaje humano se trata de dividir el lenguaje en partes y relaciones y tratar de comprender su significado.

Paradigma: Cuando veas un hombre bueno
..trata de imitarlo..!!
..cuando veas un hombre malo, examinate a ti mismo..!!
( Confucio )

Paradigma Procedimental

Siguen una secuencia, paso a paso para obtener la solución al problema, pero su mayor dificultad reside en determinar si el valor computado es una solución correcta del problema, por lo que se han desarrollo una multitud de técnicas de depuración y verificación para probar la corrección de los problemas desarrollados basándose en este tipo de paradigmas.

Si un procedimiento es correcto, cada vez que sea ejecutado producirá, en principio, resultados correctos. Por el contrario, en caso de que el procedimiento contenga errores, se puede agilizar la búsqueda de éstos últimos y repararlos rápidamente.

Un programa puede verse como una secuencia de llamadas a procedimientos. El programa principal es el responsable de pasar los datos individuales en cada llamada, los datos son procesados y una vez que el programa finaliza, se presentan se obtienen los resultados finales.

Los paradigmas procedimentales definen la secuencia explícitamente, pero esta secuencia se puede procesar en serie o en paralelo. En este segundo caso el procesamiento paralelo puede ser asincronico (cooperación de procesos paralelos) o sincrónico (proceso simples aplicados simultáneamente a muchos objetos).

Ejemplo: En lenguaje C, veamos como se implementaría una pila:

  • una pila simple con FILO (First-In/Last-Out):
  • los elementos son adicionados y quitados sólo en el tope
  • los elementos se adicionan usando una función mete()
  • los elementos se eliminan con la función saca()

Una pila tiene aplicaciones en distintas áreas, desde compiladores hasta algoritmos numéricos y es una de las estructuras de datos más simples.


			typedef struct {
			float v[20];
			int tope;
					  } Pila;
		 
			void mete(Pila *P, float val) {
			P->v[(P->tope)++] = val;
						}
		 
			float saca(Pila *P) {
			return( P->v[--(P->tope)] );
					}
		 
			void inicializa(Pila *P) {
			 P->tope = 0;
					}
		 
			int llena(Pila *P) {
			  return(P->tope >= 20);
					}
		
		

Para usar la estructura anterior en C se tiene que hacer lo siguiente: Pila P; inicializa(&P); /* inicializa la Pila */ mete(&P, 2.31); /* se meten algunos */ mete(&P, 1.19); /* elementos a la Pila*/ printf(''%g\n'', saca(&P)); /* se saca un elemento */ /* y se imprime */ mete(&P, 6.7); /* se pueden hacer operaciones */ mete(&P, saca(&P) + saca(&P); /* mas complejas */.

Los procedimientos son una secuencia de instrucciones que pueden ser llamados en forma repetida en distintas partes del programa, reduciendo el código y la complejidad de un programa .

  • Su acción operacional hasta resolver el problema, requiere de una secuencia definida explicitamente en forma procedimental o computacional, ejecutada paso a paso, procesadas en:
    • Serie: o en . .
    • Paralelo: Cuyo proceso puede ser:
      • Asíncrono: Por interaccion de procesos paralelos
      • Síncrono: Procesos simples aplicados simultáneamente a muchos objetos.

  • Como el valor computado no siempre es la solución correcta al problema, se desarrollan técnicas de depuración y verificación para probar la calidad de tales soluciones.

  • El programador instruye explícitamente a la computadora la naturaleza de la acción, datos y orden que debe realizar, ajustándose a los dos siguientes tipos básicos de paradigmas procedimentales:

    1. PARADIGMA QUE MODIFICA REPETIDAMENTE EL VALOR DE SUS DATOS
      Funciona basado en el criterio de la máquina de Von Newmann, modelo que adoptan las computadoras actuales que constan de:
      • Celdas de memoria global, dividida en posiciones, capaces de almacenar indistintamente, valores ó  instrucciones.

      • Procesador para ejecutar las instrucciones del programa paso a paso, utilizando por una parte el contenedor del programa para saber cuál es la siguiente instrucción a ejecutar y luego una unidad aritmética-lógica, destinada a realizar los cálculos.

      • Unidades de entrada-salida.

      Las instrucciones de cálculo de estas máquinas recogen datos de la memoria global y luego de realizar una serie de cálculos intermedios, escriben los resultados en dicha memoria, la cual será accedida y actualizada de forma continua, de modo que, cuando la computación finaliza, el resultado queda definido por los valores finales de las variables. Dentro de este enfoque existen dos tipos de paradigmas:

      • PARADIGMA ORIENTADO a OBJETO.

      • PARADIGMA IMPERATIVO.

    2. PARADIGMA QUE GENERA CONTINUAMENTE NUEVOS DATOS (sin efectos laterales).
      Los paradigmas sin efectos laterales incluyen a los que tradicionalmente son denominados paradigmas funcionales.
      • PARADIGMA FUNCIONAL
        Que define de forma explícita la secuencia operativa a realizar, utilizando la abstracción matemática de función y la operación de composición.

        Una ventaja de este paradigma consiste es que no requiere definir para la máquina, la manera cómo debe ejecutar tales instrucciones, que pueden ser en serie o en paralelo.-

      • PARADIGMA DEMOSTRATIVO
        En este modelo, denominado también como PARADIGMA POR EJEMPLO, el programador en lugar de especificar procedimentalmente como lograr una solución, propone soluciones de problemas similares y permite al sistema que GENERALICE una solución procedimental a partir de tales demostraciones.

        Las alternativas para generalizar tales soluciones abarcan desde simular una secuencia procedimental hasta inferir intenciones, de manera que los sistemas que infieren, intentarán generalizaciones basadas en el razonamiento del conocimiento.

        En este modelo, una solución basada en la inferencia tratará de determinar por una parte los aspectos similares, un grupo de datos u objetos y a partir de estos generalizar estas similitudes.

      • PARADIGMA DE DEFINICION
        Bajo este paradigma, un programa se diseña señalando hechos, reglas, restricciones, ecuaciones, transformaciones y otras propiedades del conjunto de valores que con figuran la solución.

        A partir de tal información, el sistema proporcionará un esquema que incluya el orden de evaluación que genere una solución, sin requerir para lograrla, la descripción de etapas a seguir como en el caso procedimental.-

        Dado que estos paradigmas especifican la solución sin indicar cómo construirla, en principio eliminan la necesidad de comprobar que el valor generado es la solución, ya que el programador adopta solo aquellas verdades, hechos, restricciones o reglas que definen el problema a resolver, por lo que, si la especificación fué realizada meticulosamente, cualquier solución obtenida será necesariamente válida.

        Dentro de este tipo paradigmático se encuentra entre otros, el PARADIGMA LOGICO

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

Paradigma Orientado a Objeto

El origen del Paradigma Orientado a Objeto ( POO para los amigos..!!), se remonta a los años sesenta, cuando es concebido como un método que trata de emular en el ordenador, el funcionamiento del mundo real. Así, parte del hecho, que para resolver tus problemas cotidianos no necesitas recurrir a la aplicación de algoritmos o heurísticas estructuradas con listas, colas, pilas, árboles, registros, etc; pues solo recurres a utilizar algunas acciones con los objetos que tienes a tu alcance..!!

Como nuestro ámbito cotidiano está constituido por objetos, estamos rodeados de ellos, convivimos con ellos; ineludiblemente los usamos para encarar nuestros problemas y por ello, no te parece genial adoptar esta realidad, como modelo para diseñar nuestras heurísticas informáticas..!!
El POO, que implica ser codificada mediante la
Programacion orientada a objetos, representa el "Antes y el despues de la programación informática", que factiblemente te acompañará por mucho tiempo y para ello, cuenta con las siguientes características:

Esta filosofía de diseño avanzado de software, se remonta al lenguaje SmallTalk, quién guiado por las pautas del paradigma orientado a objetos, propone soluciones a los típicos problemas de la programación, tales como:
- La falta de reusabilidad del código, en desmedro de la rentabilidad.

- La dificultad de modificar, actualizar o efectuar reingenieria de sistemas, minimizando así su vida útil.

- Los laboriosos, traumáticos y extensos procesos de desarrollo, carentes de codificación no intuitiva.

- La falta de portabilidad.

La Orientación a objetos es una metodología de análisis, diseño e implementación que configuran las fases fundamentales del ciclo de vida de un sistema informático, permitiendo una representación mas directa del mundo real, considerando un sistema como un conjunto de objetos, que sufren cambios en su comportamiento debido a la ocurrencia de eventos en su ambiente.

Una objeto, o ente, o entidad es todo aquello que existe; que puede ser percibido, representado mentalmente o conceptualizado por una persona; y puede ser:
- Objeto real o concreto: Ejemplo, una PC, un alumno, una webpage.

- Objeto ideal o abstracto: Ejemplo, un amor, una relación, un símbolo.

Las entidades se conocen a través de sus propiedades.
- Una propiedad es una característica que posee una entidad.

- Una entidad tiene un número ilimitado de propiedades.

- Aquellas propiedades de una entidad que son conocidas por un sujeto se denominan atributos.

- El conjunto de valores asignados a los atributos de una entidad, en un instante de tiempo dado, recibe el nombre de estado de la entidad.

- Las entidades pueden cambiar su estado con el tiempo.

- Un cambio de estado implica un cambio en uno o varios de los valores de los atributos de una entidad.

- Los cambios de estado son ocasionados por eventos que acontecen en un momento dado y que modifica o altera en modo alguno el estado de una entidad.

Todo evento dá inicio a un proceso que a su vez es un evento complejo, compuesto por una secuencia de uno o más eventos simples o complejos.

El término orientación a objetos (OO) es utilizado para referirse a un conjunto creciente de tecnologías de sofware que van desde los lenguajes de programación OO, pasando por los sistemas de bases de datos OO, las interfaces gráficas OO y los sistemas operativos OO, hasta llegar a la Ingeniería de Software OO y su aplicación a los sistemas de información OO. Tales tecnologías proveen conceptos, métodos, técnicas y herramientas para:

- Modelar el mundo real en una forma lo más cercana posible a la perspectiva del usuario.

- Interactuar facilmente con un entorno computacional utilizando metáforas familiares al usuario.

- Construir componentes de software reutilizables, asi como librerías de módulos de software facilmente extensibles.

- Modificar y extender facilmente las implementaciones de los componentes sin tener que recodificar los programas desde el inicio.

El POO, enfrenta estos inconvenientes adoptando la idea natural tomada de la existencia de nuestro mundo conformado de objetos reales, con los cuales podemos resolver tales problemas. Así, emulando tal realidad cotidiana del hombre, recurre al concepto de OBJETO, como una estructura compleja que pretende representar otra similar del mundo real, basada en las siguientes características que definen su propia naturaleza:

  1. Abstracción de Datos
  2. Encapsulación
  3. Polimorfismo
  4. Herencia
  5. ¿Qué es un Objeto?
  6. Operación Secuencial
  7. Método
  8. Datos del Objeto
  9. Soluciones con POO
  10. Reutilización
  11. SMALLTALK

  1. ABSTRACCION DE DATOS
    Permite diferenciar entre el comportamiento de un objeto o, la acción que es capaz de realizar y cómo lleva a cabo este comportamiento. Esta abstracción de datos se implementa a través de una interface de objeto, que permite a un objeto emisor comunicarse con otro objeto receptor, pero el objeto emisor desconoce la forma en que se lleva a cabo la acción solicitada (mensaje).

    Es la propiedad que destaca las características esenciales del objeto, distinguiéndola de otros tipos de objetos y según la perspectiva del que efectúa la abstracción, muestra su límite, así, los principales elementos del Diseño Orientado a Objetos consiste en componer niveles y conjuntos adecuados de abstracciones.

    El planteo de una correcta abstracción genera la amigabilidad del sistema, así por ejemplo, cuando decimos “soporte expeditivo de información interactiva para evaluativos” estamos planteando un nivel de abstracción elevada del “machete de examen”.

  2. ENCAPSULACION
    Esta propiedad denominada también ocultación de la información, se refiere a la arquitectura compleja del objeto, que integra en una unidad o cápsula, datos y programas relacionados entre sí; haciéndolo inaccesible e impide que otros objetos, usuarios, u otros programadores conozcan cómo está organizada la información disponible.

    Sin embargo, no es imposible conocer lo necesario respecto del objeto y su contenido, puesto que, para un programador autorizado, las peticiones de información al objeto podrán efectuarse recurriendo a mensajes dirigidos a él, con la orden de realizar la operación pertinente, de modo que la respuesta será la información buscada.

    El encapsulamiento hace que la OOP sea apta para la reutilizar programas; pues, su estructura de cápsula facilita enormemente que el objeto sea transportado a cualquier ubicación diferente que precise de él y si su diseño fue eficiente, sus métodos seguirán funcionando normalmente en su nuevo destino.

    Es la forma en que tanto los atributos, como los métodos se encuentran encerrados dentro de la estructura del objeto, con apariencia no visibles desde el exterior. Y así al estar ocultos, resultará que:

    -| Una clase contiene un numero de variables que son interdependientes y deben tener un estado consistente, luego, si un programador manipular esas variables directamente la clase puede entrar en un estado inconsistente y funcionar inapropiadamente.

    -| Cuando todas las variables de la clase estan ocultas y los métodos son la única posibilidad para cambiar los valores de las variables -ocultas- en objetos de la clase todo funciona bien.

    -| Si mediante un método tratamos de cambiar un valor para una variable y el valor no es correcto el método tiene la facultad para rechazarlo.

    -| Si las variables son directamente manipuladas, sin intervención de los métodos de la clase, el numero de posibilidades que tienes que comprobar se vuelve inmanejable.

    Tal estructura encapsula los tres siguientes componentes, cada uno de los cuales poseen sus propias funciones específicas:

  3. POLIMORFISMO
    Una analogía que permite conceptualizar el polimorfismo, es observar en la vida diaria cómo los alumnos responden al timbre de la escuela. Todos los alumnos conocen el significado del timbre. Cuando el timbre (mensaje) suena, sin embargo, tiene su propio significado para cada alumno (objeto). Algunos alumnos irán a casa, otros a la biblioteca, y otros irán a clases. Cada alumno responde al timbre, pero su respuesta puede ser diferente.

    En la POO, esta característica que permite diseñar métodos para que las clases derivadas, adquieran comportamientos distintos; así, una misma operación puede cambiar entre las distintas clases derivadas de una clase base, de modo que, dos objetos que sean instancias de distintas clases, generarán resultados diferentes a pesar de que la operación requerida por ambos tenga la misma denominación.

    El polimorfismo permite que un mismo mensaje global enviado a objetos de clases diferentes, estos, actúen de formas diferentes; así por ejemplo, un mensaje "+" a un objeto entero producirá una suma de dígitos, mientras que para un objeto cadena, generaría una concatenación.

    Este beneficio que surge al separar la implementanción del comportamiento permite a dos o más objetos responder al mismo mensaje. Un método llamado nombre también podría ser implementado en un objeto de la clase Curso.

    Aunque la implementación de este mensaje nombre devolvería el número de curso y su nombre, su protocolo es el mismo que el mensaje nombre del objeto Alumno. El polimorfismo permite a un objeto emisor comunicarse con diferentes objetos de una manera consistente sin tener que preocuparse sobre las diferentes implementaciones de un mensaje.

    Otro ejemplo del polimorfismo es la función de imprimir. Cada objeto que puede ser impreso debe conocer como imprimirse. El mensaje es el mismo a todos los diferentes objetos: print, pero la implementación sobre qué deben hacer para imprimirse a sí mismos varía.

    El objeto emisor no necesita conocer cómo el objeto receptor implementa el mensaje. Sólo el objeto receptor se preocupa de ello. Suponga que existe un método printPage en un objeto Documento que tiene la responsabilidad de imprimir una página. Para imprimir una página, el método printPage envía el mensaje print a cada objeto de página. El objeto Documento no necesita conocer qué tipos de objetos están en la página, sólo que cada uno soporta el comportamiento de la impresión.

    Nuevos objetos pueden ser agregados a la página sin afectar el método printPage. Este método sigue enviando el mensaje print y el nuevo objeto provee su propio método print en respuesta a ese mensaje.

    El polimorfismo permite al objeto emisor comunicarse con los objetos receptores sin tener que comprender qué tipo de objeto es, siempre y cuando el objeto receptor soporte los mensajes.

  4. HERENCIA
    Este concepto muy vinculado con el anterior, consiste en esa ventaja en que la clase derivada, hereda características de los atributos y métodos de su clase primigenia; potenciando así su capacidad de simplificar la correspondiente codificación.

    Por ejemplo, gracias a la herencia, tanto motocicletas como automóviles, poseerán automáticamente los mismos atributos y métodos de la clase automotor, razón por la cual al codificar la esta última clase, luego solo será necesario codificar las características particulares de las subclases motocicletas y automoviles.

    El grado de dividir una clase en subclases, más la característica de la herencia permite extender con simplicidad y seguridad la definición primigenia de una clase, hasta cualquier nivel de detalle requerido para un sistema en particular

    Cada objeto creado por un programador puede ser reaprovechado por otro, sin agregar modificaciones y si tal objeto no se ajuste a sus necesidades, podrá aprovechar la alternativa de generar una subclase del objeto con las características requerida, aprovechando las heredadas por el objeto original.

    La herencia permite a una clase tener el mismo comportamiento que otra y extender o limitar ese comportamiento para proveer una acción especial a una necesidad específica.

    Suponga la siguiente aplicación. La clase Graduado y la clase SinGraduar tienen comportamiento similar, como por ejemplo, el manejo de nombre, dirección, carrera, promedio, etc. En vez de colocar este comportamiento en ambas clases, el comportamiento es colocado en una nueva clase llamada Alumno. Ambas clases Graduado y SinGraduar se vuelven subclases de la clase Alumno, y ambas heredan el comportamiento de Alumno.

    Ambas clases Graduado y SinGraduar pueden agregar comportamiento adicional que sea único a ellas. Por ejemplo, Graduado puede ser tanto para un doctorado o una carrera de postgrado. Por otro lado, la clase SinGraduar puede querer conocer cómo un cierto alumno va en la carrera.

    Las clases que heredan de otras clases se llaman subclases. La clase, de la que una subclase hereda, es llamada superclase. En el ejemplo, Alumno es una superclase de Graduado y SinGraduar. Graduado y SinGraduar son subclases de Alumno.

  5. RELACIONES
    Que permiten que el objeto se inserte dinámicamente en el programa y están formadas esencialmente por punteros a otros objetos, que actúan como enlaces que permiten a cada objeto relacionarse con los demás componentes de la misma organización. Se agrupan en dos tipos fundamentales:

    • RELACIONES JERARQUICAS:
      Son relaciones bidireccionales, que hacen que un objeto que se encuentra situado inmediatamente encima, es padre de otro objeto de la organización de la que ambos forman parte; por esta relación si un objeto es padre de otro, este último es hijo del primero

      Según este vínculo relacional, la organización jerárquica simple será aquella donde un objeto tiene un solo padre, mientras que la organización jerárquica compleja puede existir un hijo con varios padres.

    • RELACIONES SEMANTICAS:
      Estas relaciones no tienen vinculación con la organización de los objetos que las establecen, porque sus propiedades y consecuencia solo dependen del significado los objetos en sí mismos y no de su posición en la organización.

      Supongamos para conceptuar esta relación, que redactaremos un diccionario informatizado para que su lector obtenga la definición de una palabra cualquiera. Si en tal diccionario, las palabras son objetos y que la organización jerárquica proviene de forma natural de la estructura de nuestros conocimientos sobre el mundo. Por ejemplo

                     
      				   /
      				   |  VIDA:   Ciencias biológicas:   Biología y 
      				   |                                 Medicina.  
      				   |                                           
      			 TEMAS   <  MUNDO:  Ciencias de la:        Matemáticas, 
      				   |          naturaleza             Física, 
      				   |          inerte                 Química y  
      				   |                                 Geología  
      				   | 
      				   |  HOMBRE. Ciencias humanas:      Geografía, 
      				   \                                Historia.
      		 

  6. PROPIEDADES: Son elementos que cualifican y cuantifican las características físicas del objeto, para diferenciarlo de los demás, por ello, cada objeto tiene cierto número de propiedades, cada una de las cuales tendrá a su vez, uno o varios valores, como ocurren con variables de la programación estructurada y que además pueden heredarlas a sus objetos descendientes.

    Las propiedades junto con los métodos y las relaciones, son datos encapsulados dentro del objeto, quién puede tener un único o un conjunto de valores estructurados en formatos matriciales, vectoriales, listas, etc, con valores del tipo numérico, alfabético, etc.

    En el POO, las propiedades se pueden heredar de unos objetos a otros, esta ventaja lo diferencia con las variables tradicionales y por ello, el objeto puede adquirir una propiedad de las siguientes maneras:

    - PROPIEDADES PROPIAS: Están formadas dentro de la cápsula del objeto.
    - PROPIEDADES HEREDADAS: Definidas en un objeto antepasado de éste, tal como padre, abuelo y que por lo tanto le otorgan el carácter de propiedades miembro, porque el objeto las posee simplemente por ser miembro de una clase.

  7. METODOS:
    Especifican la misión de cada objeto, codificadas en formato de programas de acciones que el objeto debe ejecutar y heredar a sus descendientes; tienen acceso a los datos y constituyen verdaderos códigos de programas procedimentales o procedurales, asociados a un objeto determinado y cuya acción se desencadenan mediante mensajes.

    El tradicional procedimiento, función, rutina, etc, del programa procedural, son sinónimos de método, aunque este posee propiedades específicas referidas tanto a la forma de invocar al objeto, mediante mensajes y a su campo de acción, limitado a un objeto y a sus descendientes.

    Los métodos pueden heredarse de unos objetos a otros y puden adquirirse de las siguientes formas:

    - MÉTODOS PROPIOS: Están incluidos dentro de la cápsula del objeto.

    - MÉTODOS HEREDADOS: Definidos en un objeto diferente, antepasado de éste, razón por la que estos métodos se llaman métodos miembro porque el objeto los adquiere por ser miembro de una clase.

    - DEMONIOS: Poco frecuente en POO, este tipo especial de métodos no heredable, se activa no con un mensaje, sino cuando sucede un evento especial, que se desencadena automáticamente al ocurrir un suceso determinado, tal como la asignación de un valor a una propiedad de un objeto, etc.

    En la programación orientada a objeto, los objetos interactúan entre ellos a través de los mensajes. Lo único que un objeto conoce de otro es su interface. Los datos y lógica de un objeto está oculta a los otros objetos.

    O sea, la interface encapsula los datos y código de un objeto. Esto permite al programador separar la implementación de un objeto, de su comportamiento. Tal separación crea una "caja negra" en donde el usuario está alejado de los cambios de la implementación.

    Mientras la interface permanezca igual, cualquier cambio interno a la implementación es transparente al usuario.

    Por ejemplo, si el mensaje nombre es enviado al objeto Alumno, al usuario no le importa cómo el programador implementó el código que maneja este mensaje. El programador puede cambiar la implementación en cualquier momento, pero el mensaje nombre aún debería trabajar ya que la interface es la misma.

    Tales especificaciones de la tarea que debe desarrollar el objeto, expresadas en formato de procedimientos o funciones que usan los atributos del objeto para efectuar altas, bajas, modificaciones, búsqueda, etc. A tal fin, cada mensaje posee un código asociado a él. Cuando un objeto recibe un mensaje, su código es ejecutado. En otras palabras, estos mensajes determinan el comportamiento de un objeto y el código determina cómo, el objeto, lleva a cabo cada mensaje. El código que está asociado a cada mensaje se llama método. El nombre del mensaje, también suele llamarse el nombre del método debido a su asociación con el método.

    Cuando un objeto recibe un mensaje, determina qué método es el solicitado y pasa el control al método. Un objeto tiene tantos métodos como acciones se desea que tenga.

    Observe el siguiente diagrama, nombre, nombre:, direccion y nombre:direccion: son nombres de métodos para el objeto Alumno. Cuando el objeto Alumno recibe el mensaje nombre, el mensaje nombre pasa el control al método nombre definido en Alumno.

    Los métodos que operan sobre objetos específicos son los métodos de instancias, y los mensajes que invocan métodos de instancia se llaman mensajes de instancia. Los métodos que operan sobre clases de objetos específicas son los métodos de clase.

  8. OBJETO
    Es el ente tangible o instancia de la clase, es la parte dinámica y operable que interactua con los métodos del programa para obtener la solución de un problema. Emulando la caja negra de una nave, el objeto está dotado interiormente de la funcionalidad necesaria para actuar frente a los mensajes de otros objetos, para luego devolver una acción, proporcionando así el servicio que justifica su propia existencia dentro del sistema.

    Con tal arquitectura, este paradigma promueve una adecuada reutilización o reaprovechamiento del código de cada parte del sistema, aceptando necesariamente los siguientes aspectos del objeto:

    Cada objeto necesita guardar la información sobre cómo realizar su comportamiento definido. Algunos objetos también contienen variables que soportan su comportamiento. Estas variables son llamadas variables de instancia. Sólo el método de instancia de un objeto puede referirse y modificar los valores guardados en las variables de instancia. Los métodos de instancia de los objetos no pueden referirse a los datos de otros objetos. Un objeto sólo puede acceder a los datos de otro objeto enviándole mensajes. A esto se lo llama encapsulación y asegura que el proceso para obtener los datos de un objeto sea seguro.

    Observe el siguiente diagrama, las variables de instancia variableUno hasta variableX sólo pueden ser accesadas por el emisor a través de los métodos de instancia métodoUno hasta métodoN. El emisor no puede referirse a las variables, directamente, por sí mismo.

    A diferencia de la programación procedural, donde las áreas de datos de uso común son utilizadas para compartir información, la programación orientada a objetos no aprueba el acceso directo a los datos de uso común (exceptuando el uso de las variables globales) por otros programas. Sólo el objeto que "posee" los datos puede cambiar su contenido. Otros objetos pueden ver o cambiar estos datos enviando mensajes al "dueño".

    Los nombres de variables de instancia pueden ser idénticos a los nombres de los métodos que están asociados a ellos. Por ejemplo, el objeto Alumno tiene los métodos nombre, dirección, y carrera así como también las variables de instancia nombre, dirección, y carrera. Smalltalk distingue entre los identificadores de variables y los identificadores de métodos a través de la posición que ocupan en la expresión.

    Un objeto puede ser considerado una "cosa" que puede realizar un conjunto de actividades que definen su comportamiento. Por ejemplo, un objeto "EstadoAlumno" puede informarle su promedio, año de escuela, etc.; o puede agregar una lista de las materias cursadas.
    Un objeto "Alumno" puede informarle su nombre o su dirección.

    La interfase del objeto consiste en un conjunto de comandos, cada comando desarrolla un acción específica. Un objeto puede pedirle a otro objeto que realice una acción, enviándole un mensaje. El objeto que envía el mensaje es designado emisor; y el objeto que recibe el mensaje es designado receptor. El control le es dado al objeto receptor hasta que complete la acción; luego el control regresa al objeto emisor.

    Por Ejemplo, un objeto Escuela le pide al objeto Alumno su nombre enviándole un mensaje preguntándole por su nombre. El objeto receptor Alumno devuelve su nombre al objeto emisor.

    Un mensaje también puede contener información que los objetos emisores necesitan pasar al objeto receptor, a esta información se la llama argumento de un mensaje. Un objeto receptor siempre devuelve un valor al objeto emisor. Este valor devuelto puede ser, o no, útil al objeto emisor.

    Por ejemplo, el objeto Escuela ahora desea cambiar el nombre del alumno. Esto lo hace enviando al objeto Alumno un mensaje para cambiar su nombre a uno nuevo. El nuevo nombre es pasado como un argumento en el mensaje. En este caso, al objeto Escuela no le interesa el valor que devuelva el mensaje.

  9. REUTILIZACION
    Una de las características más importantes de la programación orientada a objetos es la habilidad para modificar las soluciones existentes para resolver nuevos problemas. Si un tipo particular de problema ha sido resuelto utilizando la POO, un problema similar, aunque diferente, puede ser resuelto haciendo algunos cambios en el protocolo del objeto-mensaje ya existente. La mayoría del tiempo, esto requiere agregar nuevos mensajes. En otros casos puede requerir agregar nuevos objetos y nuevos mensajes a los que responden los nuevos objetos.

    La reutilización es, probablemente, la más importante característica de Smalltalk. Aunque los lenguajes procedurales también pueden ser reutilizados, Smalltalk hace la programación de la reutilización mucho más fácil.

  10. PARAMETROS DEL POO

    • ATRIBUTOS:
      Son las cuantificaciones de cada propiedad física del objeto, por ejemplo sus dimensiones, ubicación, apariencia, disponibilidad, etc.

    • METODOS:
      Son las especificaciones de la tarea que debe desarrollar el objeto, expresadas en formato de procedimientos o funciones que usan los atributos del objeto para efectuar altas, bajas, modificaciones, búsqueda, etc.

    • OBJETO:
      Es el ente tangible o instancia de la clase, es la parte dinámica y operable que interactua con los métodos del programa para obtener la solución de un problema. Emulando la caja negra de una nave, el objeto está dotado interiormente de la funcionalidad necesaria para actuar frente a los mensajes de otros objetos, para luego devolver una acción, proporcionando así el servicio que justifica su propia existencia dentro del sistema.

      Con tal arquitectura, este paradigma promueve una adecuada reutilización o reaprovechamiento del código de cada parte del sistema, aceptando necesariamente los siguientes aspectos del objeto:

      • CONDICIONES DEL OBJETO:

        - TODO LO EXISTENTE ES UN OBJETO: Globalmente podemos tomar cualquier ente y luego representarlo como objeto del programa.

        - EL PROGRAMA ES UN CONJUNTO DE OBJETOS: Los cuales indican que hacer entre ellos, mediante el envío adecuado de mensajes.

        - CADA OBJETO ESTÁ COMPUESTO POR OTROS OBJETOS: De manera que se puede simplificar la complejidad manipulando piezas simples componentes.

        - TODO OBJETO TIENE UN TIPO: Esto implica aceptar que todo objeto es una instancia de una clase en particular.

        - IGUAL TIPO DE OBJETOS PUEDEN CAPTAR EL MISMO MENSAJE: Todos los objetos de un mismo tipo particular pueden percibir el mismo mensaje.

      • ESTRUCTURA DEL OBJETO:
        A diferencia de una clase que es un tipo predefinido de estructura de datos intangible, el objeto es una instancia de una clase; así por ejemplo la clase es el plano de la casa, mientras que el objeto es la propia casa, construida en base de tal plano.

        Como ente tangible que tiene un estado, una identidad y un comportamiento predefinidos por su clase, el objeto se caracteriza por:
        - No ser un dato simple, porque contiene componentes estructurados.
        - No estar aislado, porque forma parte de una organización jerárquica.

      • ORGANIZACION DE LOS OBJETOS:
        Al igual que los objetos reales, también los objetos de este paradigma poseen una organización jerárquica, haciendo que ciertos objetos son superiores jerárquicamente a otros, agrupándolos como:

        - Objetos simples: Cuando su estructura pueda ser representada por medio de un árbol.
        - Objetos complejos: En caso contrario.

        En ambos casos existen tres niveles de objetos.

        1. LA RAÍZ DE LA JERARQUÍA:
          Se trata de un objeto único y especial, ubicado en el nivel más alto de la estructura y suele recibir un nombre genérico, que indica su categoría especial, como por ejemplo Raíz o Entidad u Objeto madre,.

        2. LOS OBJETOS INTERMEDIOS:
          Están ubicados después de la raíz y que a su vez tienen descendientes y constituyen conjuntos o clases de objetos, que pueden ser generales o especializados, según la aplicación.

          Los objetos intermedios reciben nombres genéricos que denotan al conjunto de objetos que representan, por ejemplo, contenedor, buscador, etc.

        3. LOS OBJETOS TERMINALES:
          Son objetos que descienden de una clase o subclase y no tienen descendientes y en casos particulares, pueden constituir instancias o ítems porque representan los elementos del conjunto representado por la clase o subclase a la que pertenecen.

      • MENSAJE: Denominado por algunos autores como EVENTO, es una comunicación del requerimiento de un objeto dirigida a otro objeto, para que este último concrete una acción.

      • ENCAPSULADO: Es la forma en que tanto los atributos, como los métodos se encuentran encerrados dentro de la estructura del objeto, con apariencia no visibles desde el exterior. Y así al estar ocultos, resultará que:

        - Una clase contiene un numero de variables que son interdependientes y deben tener un estado consistente, luego, si un programador manipular esas variables directamente la clase puede entrar en un estado inconsistente y funcionar inapropiadamente.

        - Cuando todas las variables de la clase estan ocultas y los métodos son la única posibilidad para cambiar los valores de las variables -ocultas- en objetos de la clase todo funciona bien. Si mediante un método tratamos de cambiar un valor para una variable y el valor no es correcto el método tiene la facultad para rechazarlo.

        - Si las variables son directamente manipuladas, sin intervención de los métodos de la clase, el numero de posibilidades que tienes que comprobar se vuelve inmanejable.

        Tal estructura encapsula las siguientes componentes, cada uno de los cuales poseen sus propias funciones específicas:

        1. PROPIEDADES:
          Son elementos que cualifican y cuantifican las características físicas del objeto, para diferenciarlo de los demás, por ello, cada objeto tiene cierto número de propiedades, cada una de las cuales tendrá a su vez, uno o varios valores, como ocurren con variables de la programación estructurada y que además pueden heredarlas a sus objetos descendientes.

          Las propiedades junto con los métodos y las relaciones, son datos encapsulados dentro del objeto, quién puede tener un único o un conjunto de valores estructurados en formatos matriciales, vectoriales, listas, etc, con valores del tipo numérico, alfabético, etc.

          En el POO, las propiedades se pueden heredar de unos objetos a otros, esta ventaja lo diferencia con las variables tradicionales y por ello, el objeto puede adquirir una propiedad de las siguientes maneras:

          - PROPIEDADES PROPIAS: Están formadas dentro de la cápsula del objeto.
          - PROPIEDADES HEREDADAS: Definidas en un objeto antepasado de éste, tal como padre, abuelo y que por lo tanto le otorgan el carácter de propiedades miembro, porque el objeto las posee simplemente por ser miembro de una clase.

        2. METODOS:
          Especifican la misión de cada objeto, codificadas en formato de programas de acciones que el objeto debe ejecutar y heredar a sus descendientes; tienen acceso a los datos y constituyen verdaderos códigos de programas procedimentales o procedurales, asociados a un objeto determinado y cuya acción se desencadenan mediante mensajes.

          El tradicional procedimiento, función, rutina, etc, del programa procedural, son sinónimos de método, aunque este posee propiedades específicas referidas tanto a la forma de invocar al objeto, mediante mensajes y a su campo de acción, limitado a un objeto y a sus descendientes.

          Los métodos pueden heredarse de unos objetos a otros y puden adquirirse de las siguientes formas:

          - MÉTODOS PROPIOS: Están incluidos dentro de la cápsula del objeto.

          - MÉTODOS HEREDADOS: Definidos en un objeto diferente, antepasado de éste, razón por la que estos métodos se llaman métodos miembro porque el objeto los adquiere por ser miembro de una clase.

          - DEMONIOS: Poco frecuente en POO, este tipo especial de métodos no heredable, se activa no con un mensaje, sino cuando sucede un evento especial, que se desencadena automáticamente al ocurrir un suceso determinado, tal como la asignación de un valor a una propiedad de un objeto, etc.

      • CLASE:
        Es la abstracción del objeto, algo así como los planos básicos de las características con los que se puede construir toda una familia de objetos, todos ellos con detalles comunes. Así, de la clase automotor, pueden construirse motocicletas, motos, coches, furgonetas, camiones, etc. Todos con elementos similares y con una característica común: sirven para transportar personas.

      • SUBCLASE:
        Es la extensibilidad que permite generar una clase, a partir de otra ya existente clase, por lo que ambas, a pesar de tener aspectos similares, tendrán partes propias a cada una que definirá su propia estructura particular.

        Tal concepto de la arquitectura de la clase derivada llamada subclase, implica una tremenda economía a la hora diseñar, mantener o rediseñar un sistema generado bajo esta filosofía de extensibilidad.

      • HERENCIA:
        Este concepto muy vinculado con el anterior, consiste en esa ventaja en que la clase derivada, hereda características de los atributos y métodos de su clase primigenia; potenciando así su capacidad de simplificar la correspondiente codificación.

        Por ejemplo, gracias a la herencia, tanto motocicletas como automóviles, poseerán automáticamente los mismos atributos y métodos de la clase automotor, razón por la cual al codificar la esta última clase, luego solo será necesario codificar las características particulares de las subclases motocicletas y automoviles.

        El grado de dividir una clase en subclases, más la característica de la herencia permite extender con simplicidad y seguridad la definición primigenia de una clase, hasta cualquier nivel de detalle requerido para un sistema en particular

        Cada objeto creado por un programador puede ser reaprovechado por otro, sin agregar modificaciones y si tal objeto no se ajuste a sus necesidades, podrá aprovechar la alternativa de generar una subclase del objeto con las características requerida, aprovechando las heredadas por el objeto original.

    • CARACTERÍSTICAS DEL LENGUAJE DE POO:
      • ABSTRACCIÓN:
        Es la propiedad que destaca las características esenciales del objeto, distinguiéndola de otros tipos de objetos y según la perspectiva del que efectúa la abstracción, muestra su límite, así, los principales elementos del Diseño Orientado a Objetos consiste en componer niveles y conjuntos adecuados de abstracciones.

        El planteo de una correcta abstracción genera la amigabilidad del sistema, así por ejemplo, cuando decimos “soporte expeditivo de información interactiva para evaluativos” estamos planteando un nivel de abstracción elevada del “machete de examen”.

      • ENCAPSULAMIENTO: 
        Esta propiedad denominada también ocultación de la información, se refiere a la arquitectura compleja del objeto, que integra en una unidad o cápsula, datos y programas relacionados entre sí; haciéndolo inaccesible e impide que otros objetos, usuarios, u otros programadores conozcan cómo está organizada la información disponible.

        Sin embargo, no es imposible conocer lo necesario respecto del objeto y su contenido, puesto que, para un programador autorizado, las peticiones de información al objeto podrán efectuarse recurriendo a mensajes dirigidos a él, con la orden de realizar la operación pertinente, de modo que la respuesta será la información buscada.

        El encapsulamiento hace que la OOP sea apta para la reutilizar programas; pues, su estructura de cápsula facilita enormemente que el objeto sea transportado a cualquier ubicación diferente que precise de él y si su diseño fue eficiente, sus métodos seguirán funcionando normalmente en su nuevo destino.

      • MODULARIDAD:
        La modularidad es la característica que hace factible la simplificación de la complejidad inherente al sistema, que habrá sido descompuesto en conjuntos de módulos operativos, cohesivos y casi independientes o débilmente acoplados, diseñados para ejecutar una tarea específica.

      • JERARQUÍA:
        La creación de una jerarquía permite clasificarlas u ordenarlas de alguna manera simplificando la comprensión del conjunto de abstracciones, las cuales no se pueden comprender en forma simultánea.

        En todo sistema complejo existen dos tipos de jerarquías:

        • Jerarquía de clases: Cuya semántica es "es un": Herencia que puede ser.

          - Herencia Simple: Define una relación entre clases, donde una clase comparte la estructura de comportamiento definida en otra clase antecesora.

          - Herencia Múltiple: Dicha estructura es compartida con varias clases definidas anteriormente.

          La herencia implica una jerarquía de generalización/especialización donde las clases antecesoras representan abstracciones generalizadas y las subclases especializan el comportamiento o estructura de sus superclases.

        • Jerarquía de partes:
          Cuya semántica es "parte de": Agregación que es aquella asociación donde clases de objetos llamadas partes, pertenecen a clases de objetos llamadas todo, pero que la existencia de cada parte es independiente de la existencia del todo, asi, si eliminamos el todo, no necesariamente desaparecen sus partes y tampoco la ausencia de una de sus partes no implica la ausencia del todo.

      • COMPOSICIÓN:
        La composición es la inclusión de tipos de objetos definidos por el usuario como partes de otros tipos de objetos, produciendo con esto, un efecto inverso a la herencia; de esto modo la composición es un tipo de agregación donde las clases de objetos llamadas partes pertenecen a una única clase de objetos llamada todo, de manera que si no está el todo, no están las partes.

      • POLIMORFISMO:
        Característica que permite diseñar métodos para que las clases derivadas, adquieran comportamientos distintos; así, una misma operación puede cambiar entre las distintas clases derivadas de una clase base, de modo que, dos objetos que sean instancias de distintas clases, generarán resultados diferentes a pesar de que la operación requerida por ambos tenga la misma denominación.

        El polimorfismo permite que un mismo mensaje global enviado a objetos de clases diferentes, estos, actúen de formas diferentes; así por ejemplo, un mensaje "+" a un objeto entero producirá una suma de dígitos, mientras que para un objeto cadena, generaría una concatenación.

      • TIPIFICACIÓN:
        Es una aplicación del concepto de clases, por el que objetos de distinto tipo solo pueden intercambiarse bajo grandes restricciones, porque cada tipo es una caracterización exacta de las propiedades estructurales de una serie de entidades, así por ejemplo no funcionaran regularmente los objetos impresora y mouse si los enchufamos en conectores de distinto tipo.

      • PERSISTENCIA:
        Este aspecto secundario del modelo de programación orientada a objetos se refiere a la característica por la cual un objeto conserva su estado a través del tiempo y en el espacio.

    • VENTAJAS DEL POO
      Por una parte, la necesidad de optimizar el desarrollo de nuevas áreas de software de aplicación, tales como el tratamiento de imágenes, sonido, bases de datos multimediales, automatización de oficinas; cada día se impone la necesidad de lograr la interacción intuitiva, amigable y segura entre el usuario y la máquina, tarea que se simplifica en sumo grado, trabajando dentro del entorno del POO

      Por otra parte, los costos de producción, mantenimiento, conservación y actualización de software existente son considerablemente onerosos, además de insumir tareas muy laboriosas, tediosas y complejas, especialmente si no se aplicó el desarrollo con las pautas del POO.

      • EMULA EL MUNDO REAL: El modo natural de pensar del ser humano es pensar en objetos, por ello este método le resulta más intuitivo que el estructurado, así se promueve llevar al límite la capacidad operacional de los lenguajes de programación modernos.

        Divide y Vencerás..!!, se cumple plenamente en la POO, pues la naturaleza de separar el todo en pequeñas partes, para luego construir con piezas simples, otras más complejas, incentiva a la creación de aplicaciones reutilizables.

      • REHUSABILIDAD: Resolver tales problemas promovió la necesidad de trabajar con objetos portables, dotados de la capacidad de la herencia, que permite la reusabilidad del código orientado a objetos, de manera de simplificar la modificación de código existente, logrando así, aplicaciones más modificables, fácilmente extendibles y con componentes reusables.

        La reusabilidad del código minimiza el tiempo destinado al desarrollo del software, haciéndolo mas intuitivo porque el programador piensa naturalmente en términos de objetos físicos, más que en términos de algoritmos de software.

        Esta mayor reutilización de los componentes de software implica la posibilidad de un producto de software , módulo, clase u otro para ser reutilizado total o parcialmente en una nueva aplicación

        Asi, puede disminuirse la laboriosidad al programar una aplicación y lograr mayor fiabilidad, por simplificar las múltiples pruebas operativas del sistema antes de su entrega a sus usuarios.

      • PROGRAMAAR EN LENGUAJE ORIENTADO A OBJETOS:
        La programación orientada a objetos usa un lenguaje orientado a objetos puede ser tanto imperativo como declarativo, cuyas ventajas en el desarrollo de software son:

        • MANEJO SIMPLE: De la complejidad inherente al software usando los tres mecanismos básicos para operar la complejidad:

          1. DESCOMPOSICION:
            Orientada a objetos, mediante la cual el dominio de aplicación de un sistema se descompone en base a los tipos o clases de objetos que están presentes o relacionados con dicho dominio.

          2. ABSTRACCION:
            Mecanismo cognoscitivo que permite manejar la complejidad para representar la totalidad de propiedades de un objeto complejo, ignorando aquellas propiedades del objeto que son poco relevantes o muy detalladas.

          3. JERARQUIZACION:
            De clases y objetos, a través de las cuales se establecen las relaciones de generalizacion entre clases (jerarquías es_un) y de composición entre objetos (jerarquías parte_de).

            En las jerarquías se habla de subtipo o especialización de un supertipo o generalización.

          Usar mejores mecanismos para manejar la complejidad contribuye a que el grupo de desarrollo logre una mejor compresión de los dominio de aplicación, así como de los requerimientos de usuarios, lo cual implica reducción de tiempo y costos.

          Simplificar el manejo de la complejidad, implica para los:

          - Usuarios, desarrollo más simple y mantenimiento más económico y ágil de los sistemas.

          - Analistas y diseñadores, proceso menos laborioso, mas claro e intuitivo de diseño.

          - Programadores, la claridad del modelo y el poder de las herramientas orientadas a objetos, que transforman en placentero y productivo la tediosa tarea de programar.

        • UN SOLO PARADIGMA PARA TODO: Uso del paradigma único de desarrollo, porque en los otros métodos de desarrollo de sistemas se emplean, los cuatro paradigmas diferentes para el análisis, diseño y programación de un sistema:

          - En el desarrollo de los programas de aplicación se utiliza el enfoque estructurado:

          Análisis Estructurado + Diseño Estructurado + Programación Estructurada

          - En el diseño conceptual de la base de datos se emplea el Modelo Entidad-Interrelación

          - En la implementación y uso de la base de datos se acude al Modelo Relacional.

          - En el diseño de la interfaz usuario-sistema se rige por metáforas basadas en objetos.

          El uso de un unico paradigma disminuye los costos de adiestramiento del personal que desarrolla sistemas, pues este personal no requiere ser formado en una diversidad de métodos, técnicas y herramientas basadas en paradigmas diferentes.

        • COSTOS MENORES: Reducción de los costos y tiempos de desarrollo. Esta ventaja es una consecuencia de las tres anteriores. La reutilización de componentes reduce los costos y tiempo de desarrollo, pues aprovecha la existencia de diseños y programas OO ya probados.

        • HERRAMIENTAS FLEXIBLES:Permite a los desarrolladores de sistemas diseñar con herramientas más flexibles, logrando así una óptima adaptación al cambio, actualización y a la evolución.

          El incremento de nuevas componentes durante el ciclo de vida del sistema, la orientación a objetos permite afrontar sistemas de gran complejidad sin colapsar como lo haría un sistema diseñado con el método estructurado.

      • NO TODO LO QUE BRILLA ES ORO..!!
        A pesar de las bondades enumeradas precedentemente, el programador debe evaluar los siguientes aspectos que hace el sistema orientado a objetos requiere invertir recursos para imponer una nueva cultura distinta a programadores procedurales, destacándose los siguientes temas:

        -| CURVAS DE APRENDIZAJE LARGAS: El sistema orientado a objetos enfoca de una sola manera al mundo, involucrando la conceptualización de todos los elementos de un programa, desde subsistemas a los datos, en la forma de objetos.

        La comunicación entre objetos se realiza por mensajes, forma en que no están escritos los programas orientados a objetos actualmente; de manera que inevitablemente al hacer la transición a un sistema orientado a objetos los programadores requieren capacitarse nuevamente.

        -| DEPENDENCIA DEL LENGUAJE: En la práctica existen muchas dependencias del programador y el proveedor, tanto que a pesar de la portabilidad conceptual de los objetos en un sistema orientado a objetos, actualmente en el mercado del soft, se ofrecen muchos lenguajes orientados a objetos están compitiendo para dominar el mercado.

        Migrar el lenguaje de implementación de un sistema orientado a objetos no es tarea sencilla; por ejemplo cambiar de C++ que soporta el concepto de herencia múltiple, a SmallTalk que no lo soporta; implica una decisión de elección cuya factibilidad debe ser evaluada.

        -| DETERMINACIÓN DE LAS CLASES: Como cada clase es un molde para crear nuevos objetos, será importante crear el conjunto de clases adecuado para un proyecto; pero en la práctica dado que la definición de las clases más que una ciencia es más un arte; si bien existen jerarquías predefinidas de clases, generalmente se deben crear clases específicas para la aplicación específica.

        -| PERFOMANCE: El tráfico de mensajes entre los objetos afecta la perfomance de todo el sistema; y aunque tal desventaja se va desvaneciendo con el avance tecnológico, velocidad de microprocesador, potencia, y capacidad de la memoria; pero aún en la situación actual aquella aplicación orientada a objetos de bajo perfomance, no será rentable.

    VER PARA CREER..!!

    -| EJEMPLO 1: Código para definir una clase y dentro de esta aprecia la manera de incrustar objetos, cuyos métodos son activados por eventos.

    
    	DEFINE CLASS ContainerLeeFecha AS ContainerWilo
    	  HEIGHT = 100
    	  ADD OBJECT RotDia AS Label   WITH TOP=10, LEFT=80,Autosize=.T.,HEIGHT=10, FontBold = .T.,Caption='DIA       MES        AÑO'
    	  ADD OBJECT BoxDia AS SpiDia 
    	  ADD OBJECT BoxMes AS ComboMes 
    	  ADD OBJECT BoxAno AS SpiAno 
    	  ADD OBJECT DeterminarHoroscopo AS CommandButton WITH TOP=10, LEFT=250, CAPTION='Suerte', HEIGHT=55, WIDTH=50, Picture='Ver.ico',ToolTipText='Aceptar estos datos',BackStyle=0
    	  ADD OBJECT Cancelar AS Image WITH TOP=60, LEFT=80, Picture='Borrar.ico',ToolTipText='Limpiar los datos',BackStyle=0
    	  
    	  PROCEDURE Init
    		ThisForm.LeeFecha.DeterminarHoroscopo.Visible = .F.
    	  ENDPROC  
    	
    	  PROCEDURE BoxDia.LostFocus
    		ThisForm.Caption='Selecciona el mes que naciste, luego ENTER' 
    		FormuWilo.LeeFecha.BoxMes.Visible = .T.
    	  ENDPROC  
    	  PROCEDURE BoxMes.LostFocus
    		ThisForm.Caption='Ahora el año que naciste, luego ENTER' 
    		FormuWilo.LeeFecha.BoxAno.Visible = .T.
    	  ENDPROC  
    	  PROCEDURE BoxAno.LostFocus
    		ThisForm.Caption='Click ..!! sobre el ojo para ver tu horóscopo' 
    		FormuWilo.LeeFecha.DeterminarHoroscopo.Visible = .T.
    		FormuWilo.LeeFecha.DeterminarHoroscopo.SetFocus
    	  ENDPROC  
    	
    	  PROCEDURE DeterminarHoroscopo.Click
    		FormuWilo.LeeFecha.VISIBLE=.F.
    		DO MostrarSuerte 
    	  ENDPROC
    	  PROCEDURE Cancelar.Click
    		FormuWilo.LeeFecha.DeterminarHoroscopo.VISIBLE=.F.
    		FormuWilo.LeeFecha.BoxDia.Value=1
    		FormuWilo.LeeFecha.BoxMes.Value='Ene'
    		FormuWilo.LeeFecha.BoxAno.Value=1970
    		FormuWilo.LeeFecha.BoxDia.SetFocus
    	  ENDPROC
    	ENDDEFINE
    

    -| EJEMPLO 2: Tanto las condiciones del POO, como la estructura del objeto y su encapsulamiento:

    
    	DEFINE CLASS ContainerWilo AS Container
    	  TOP    = 10
    	  LEFT   = 50
    	  WIDTH  = 390
    	  HEIGHT = 240
    	  Picture= 'Fondo7.gif'
    	  VISIBLE=.F.
    	  BorderStyle = 2
    	  BackColor  = 32768 
    	 ADD OBJECT Salir AS Image With Top=50,Left=10,Picture = 'Llave.jpg', ToolTipText='Cerrar esto',BackStyle=0
    	  PROCEDURE Salir.MouseMove
    		PARAMETER a, b, c, d, e
    		DO ActivarPantallaPrincipal
    	  ENDPROC
    	ENDDEFINE
    	 PROCEDURE Volar.MouseMove
    	  PARAMETER a, b, c, d, e
    	   IF (Messagebox('Cerrarás este sistema..??',4+32+256,'DESEAS VOLAR DE ESTE PROGRAMA')=6)
    		  Clear Events
    	   ENDIF
    	 ENDPROC
    	
    	
    	 PROCEDURE BoxesDeDatos.Limpiar.Click
    	  IF ThisForm.Caption = 'PARA BORRAR ESTA FICHA,  Pulsa -> Borrar'
    		 ThisForm.Caption = 'Ficha marcada para borrar:'+Nombre
    		  DELETE  
    		  IF (Messagebox(Amor+'  Salud: '+Salud,4+32+256,'DESEAS ELIMINAR LA FICHA DE')=6)
    			PACK 
    			Wait Window 'Se eliminó la ficha de '+Amor
    		  ENDIF
    		  DO ActivarPantallaPrincipal
    		ELSE
    		  ThisForm.Caption = 'DIGITA LOS NUEVOS DATOS,  luego graba' 
    		  DO LimpiarBoxes
    	   ENDIF   
    	 ENDPROC
    	 PROCEDURE BoxesDeDatos.BoxAmor.LostFocus
    	  PARAMETER a, b, c, d, e
    	  IF NOT(ThisForm.BoxesDeDatos.BoxAmor.Value='        ')
    		 ThisForm.BoxesDeDatos.Grabar.Visible = .T.
    	  ENDIF   
    	 ENDPROC
    	 PROCEDURE LogoUTN.MouseMove
    	  PARAMETER a, b, c, d, e
    		 This.TOP =  130
    		 This.LEFT = 10 
    		 This.Picture = 'Wilin.bmp'
    	 ENDPROC
    	 PROCEDURE LogoUTN.Click
    	  DO ActivarPantallaPrincipal 
    	  ThisForm.Caption = 'WWW.WILUCHA.COM.AR' 
    	  ThisForm.VerSuerte.Visible=.F.
    	  ThisForm.Modificar.Visible=.F.
    	  This.Visible=.F.
    	  ThisForm.VerAutor.Visible=.T.
    	 ENDPROC
    

    -| EJEMPLO 3: Ah.., así que no creias en los demonios..!!!, pero por ahora puedes ver en vivo a los métodos propios y a los heredados de la clase ContainerWilo a las clases ContainerVerDatos y las siguientes..

    
    	DEFINE CLASS ContainerWilo AS Container
    	  TOP    = 10
    	  LEFT   = 50
    	  WIDTH  = 390
    	  HEIGHT = 240
    	  Picture= 'Fondo7.gif'
    	  VISIBLE=.F.
    	  BorderStyle = 2
    	  BackColor  = 32768 
    	 ADD OBJECT Salir AS Image With Top=50,Left=10,Picture = 'Llave.jpg', ToolTipText='Cerrar esto',BackStyle=0
    	  PROCEDURE Salir.MouseMove
    		PARAMETER a, b, c, d, e
    		DO ActivarPantallaPrincipal
    	  ENDPROC
    	ENDDEFINE
    	DEFINE CLASS ContainerVerDatos AS ContainerWilo
    	  WIDTH  = 130
    	  HEIGHT = 120
    	 ADD OBJECT TeclaVerTabla  AS CommandButton With Top=10, Left=50, Width=70,Height=30,Caption = 'Ver Grilla',FontBold=.T.,ToolTipText='Muestra toda la tabla de datos'     
    	 ADD OBJECT BuscarPorCombo AS CommandButton With Top=40, Left=50, Width=70,Height=30,Caption = 'Buscar'    ,FontBold=.T.,ToolTipText='Permite Buscar por ComboBox'     
    	 ADD OBJECT BuscarPorBox   AS CommandButton With Top=70, Left=50, Width=70,Height=30,Caption = 'Una Ficha' ,FontBold=.T.,ToolTipText='Busca ficha por Teclado'
    	ENDDEFINE
    	
    	DEFINE CLASS ContainerBuscar AS ContainerWilo
    	 ADD OBJECT BoxDato     AS TextBox   With Top=10, Left=50, Width=190,Height=25,Visible = .F.,FontBold=.T.      
    	 ADD OBJECT ComboDeWilo AS ComboBox With Top=10, Left=50, Width=190,RowSourceType = 3,Visible=.T.,Value=1,;
    		RowSource="SELECT Amor FROM Suerte ORDER BY Suerte.Amor INTO CURSOR Dato",ToolTipText='Selecciona un dato'  
    	 ADD OBJECT Aceptar     AS CommandButton With Top=10, Left=260, Width=70,Height=30,Caption = 'Aceptar',ToolTipText='Aceptar el dato'
    	ENDDEFINE
    	
    	DEFINE CLASS ContainerGrilla AS ContainerWilo
    	 ADD OBJECT MiGrilla AS Grid  With Top=10,  Left=50, Width=330,Height=220, Visible = .T.,ReadOnly=.T.,FontBold=.T.      
    	ENDDEFINE
    	
    	DEFINE CLASS ContainerAutor AS ContainerWilo
    	 ADD OBJECT Foto AS Image With Top=10, Left=50, Picture = 'Pavaroti.jpg',ToolTipText='Londres Marzo 1998', Visible=.T.
    	ENDDEFINE
    	
    	PROCEDURE Volar.MouseMove
    	  PARAMETER a, b, c, d, e
    	   IF (Messagebox('Cerrarás este sistema..??',4+32+256,'DESEAS VOLAR DE ESTE PROGRAMA')=6)
    		  Clear Events
    	   ENDIF
    	ENDPROC
    

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

    Estructura de las Revoluciones Científicas

    Para Thomas Kuhn (1926 ...) la historia representa el color del cristal con el que debe mirarse toda la filosofía de la ciencia. Pero lo que Kuhn ha visto a través de este cristal ha resultado tener dos características inesperadas, que le han dado a sus ideas la gran prominencia que tuvieron cuando se publicaron y que han conservado a lo largo de más de 25 años; me refiero al relativismo y a la irracionalidad. El significado de estos dos términos revela la relación de las ideas de Kuhn con el método científico.

    La historia de la ciencia muestra, de acuerdo con Kuhn, que a lo largo de su evolución las distintas disciplinas han pasado por uno o más ciclos bifásicos, que él mismo llama "ciencia normal" y "revolución" (ocasionalmente se identifica una tercera fase inicial, llamada "preciencia", que desaparece a partir del segundo ciclo).

    En forma paralela a este concepto cíclico de la evolución de las ciencias, Kuhn introdujo también la famosa idea del "paradigma", que representó la teoría general o conjunto de ideas aprobadas y sostenidas por una generación o un grupo coherente de científicos contemporáneos.

    Kuhn usó el término "paradigma" con otras acepciones distintas lo que contribuyó a hacerlo un poco confuso. En publicaciones posteriores, Kuhn sustituyó el término "paradigma" por otros dos, "matriz disciplinaria" y "ejemplar", con objeto de ganar precisión, pero como para nuestros fines tal precisión no es necesaria, seguiré usando el término paradigma.

    De acuerdo con el esquema de Kuhn, los ciclos a que están sometidas las ciencias a través de la historia se inician por una etapa más o menos prolongada de "preciencia" o periodo "pre-paradigmático", durante el cual se colectan observaciones casi al azar, sin plan definido y sin referencia a un esquema general

    En ese periodo puede haber varias escuelas de pensamiento compitiendo pero sin que alguna de ellas prevalezca sobre las demás. Sin embargo, poco a poco un sistema teórico adquiere aceptación general, con lo que surge el primer paradigma de la disciplina.

    Los ejemplos de Kuhn para ilustrar el sentido de paradigma son la astronomía ptolemaica, la "nueva" química de Lavoisier, la óptica corpuscular de Newton, o la dinámica aristotélica.

    De acuerdo con Kuhn, un paradigma está formado por la amalgama de una teoría y un método, que juntos constituyen casi una forma especial de ver al mundo, sin embargo, el estado ontológico del paradigma kuhniano no es claro, se trata de una entidad curiosa, algo camaleónica y hasta acomodaticia, de la que a veces se oye hablar como si fuera algo real y con existencia independiente.

    "The Structure of Scientific Revolutions"
    "Una vez establecido el paradigma, la etapa de "preciencia" es sustituida por un periodo de "ciencia normal", caracterizado porque la investigación se desarrolla de acuerdo con los dictados del paradigma prevalente, o sea que se siguen los modelos que ya han demostrado tener éxito dentro de las teorías aceptadas...". Los siguientes aspectos son la sintesis de la propuesta de Kuhn:

    • Durante el periodo de "ciencia normal" los investigadores no se dedican a avanzar el conocimiento sino a resolver problemas o "acertijos" dentro de la estructura del paradigma correspondiente.

      Lo que se pone a prueba no es la teoría o hipótesis general, como quiere Popper, sino la habilidad del hombre de ciencia para desempeñar su oficio, en vista de que si sus resultados no son compatibles con el paradigma dominante, lo que está mal no es la teoría sino los resultados del trabajo del investigador.

      Durante el periodo de "ciencia normal" los resultados incompatibles con el paradigma prevalente se acumulan progresivamente en forma de anomalías, en lugar de usarse como argumentos para forzar el cambio de la teoría por otra u otras que las expliquen.

    • Sólo cuando se alcanza un nivel intolerable de anomalías es que el paradigma se abandona y se adopta uno nuevo que satisfaga no sólo los hechos explicados por el paradigma anterior sino también todas las anomalías acumuladas.

      A la ciencia que se realiza durante el periodo en que ocurre este cambio, de un paradigma por otro, Kuhn la llama "ciencia revolucionaria". Pero es precisamente en su análisis de este cambio donde Kuhn introdujo una de sus ideas más revolucionarias

    • Propuso que el rechazo de un paradigma rebasado por las anomalías acumuladas y la adopción de un nuevo paradigma históricamente no ha sido un proceso racional, entre otras razones porque los distintos paradigmas son inconmensurables, lo que no significa que sean incompatibles, sino simplemente que no son comparables entre sí.

      Kuhn comparó al cambio de paradigmas que caracteriza al periodo de "ciencia revolucionaria" con un "cambio de Gestalt", y hasta con una conversión religiosa.

    • La inconmensurabilidad del paradigma antiguo con el nuevo determina que sus respectivos partidarios hablen distintos idiomas, o sea que los mismos términos tengan diferentes significados, lo que dificulta o imposibilita la comunicación entre ellos.

      Frecuentemente, otra diferencia significativa entre los científicos que patrocinan los dos paradigmas en conflicto, el saliente y el entrante, es la edad promedio de cada grupo: muchos de los partidarios del paradigma que se abandona son individuos mayores, mientras que la mayoría de los devotos del nuevo paradigma son jóvenes.

      Esta diferencia generacional no sólo se suma al bloqueo en la comunicación, sino que también contribuye a la irracionalidad del cambio, que culmina cuando fallecen los últimos miembros del grupo de científicos partidarios del paradigma saliente, con lo que se legaliza la hegemonía del paradigma entrante y se inicia un nuevo periodo de "ciencia normal".

      Estas ideas de Kuhn se oponen de manera más o menos frontal al esquema hipotético-deductivo de la ciencia de Popper al mismo tiempo que postulan otro, que podría llamarse histórico-cíclico (Popper lo llama, con toda justicia, relativismo histórico).

    • Obviamente, Kuhn no está hablando de la lógica del descubrimiento científico sino más bien de la psico-sociología de la ciencia. Pero Kuhn y Popper coinciden en pasar por alto los mecanismos de generación de las hipótesis aunque el primero las atribuye a la intuición estimulada por la acumulación progresiva de anomalías y el segundo nada más a la intuición (pero basada en un componente genético, que se menciona en el último capítulo).

      En cambio, mientras Popper postula que el cambio de una teoría científica por otra proviene de la falsificación de la primera y el mayor poder explicativo de la segunda, o sea que se trata de un proceso lógico y racional, Kuhn insiste en que la historia muestra que el rechazo de una teoría científica y su sustitución por otra ha obedecido mucho más a fuerzas irracionales e ilógicas, más relacionadas con factores sociológicos que con principios racionales.

    • El concepto del crecimiento de la ciencia según Kuhn es muy distinto del postulado clásicamente, como puede sospecharse al contemplar el resultado de sus ciclos de ciencia normal acumulación de anomalías, revolución con cambio de paradigmas, ciencia normal, etc.,

      En vista de que la inconmensurabilidad de los paradigmas entrante y saliente impiden que se aproveche toda la información acumulada durante el periodo de ciencia normal anterior a la revolución, que termina por cambiar un paradigma por otro. Kuhn tiene plena conciencia de esto, por lo que el último capítulo de La estructura se titula "El progreso por medio de revoluciones" y en él se pregunta:

      • ¿Por qué es que la empresa detallada antes [la ciencia] avanza continuamente, como no lo hacen, digamos, el arte, la teoría política, o la filosofía?

      • ¿Por qué es el progreso una propiedad reservada casi exclusivamente para las actividades que llamamos ciencia?

      Las respuestas más comunes a estas preguntas han sido refutadas en este ensayo, de modo que conviene concluirlo preguntándonos si podemos encontrar otras que las sustituyen.

    • Quien haya leído a Kuhn sabe que un solo repaso de sus textos es generalmente insuficiente para capturar todas sus ideas y comprender todos sus alcances además de lecturas repetidas.

      Kuhn exige meditación seria sobre lo que dice, con la consecuencia que el lector que medita no siempre llega a la misma conclusión que el autor sobre un mismo párrafo.

      Por lo menos, eso es lo que todavía me pasa a mí con Kuhn (¡y con muchos otros autores!) pero acepto que seguramente se trata de un problema personal. Kuhn propone que en los periodos de ciencia normal, el progreso científico:

    • No es diferente en calidad del progreso en otros campos, pero la ausencia habitual de grupos competitivos que cuestionen mutuamente sus respectivos fines y estándares facilita la percepción del progreso de una comunidad científica normal.

    • Después de examinar el papel de la educación científica en las culturas occidentales, destacando que en las humanidades la consulta de los textos originales es mucho más frecuente que en las ciencias, Kuhn se pregunta:

      ¿Por qué es el progreso una concomitante universal de las revoluciones científicas?

      Una vez más tenemos mucho que ganar si preguntamos qué otra cosa podría provenir de una revolución. Las revoluciones terminan con la victoria total de uno de los dos campos opuestos,

    • ¿podrá tal grupo decir alguna vez que su triunfo no representa un progreso?

      Si lo hubiera sería como aceptar que ellos estaban equivocados y que sus oponentes tenían la razón.

      Por lo menos, para ellos el resultado de la revolución debe ser el progreso, y se encuentran en una posición excelente para asegurarse de que los miembros futuros de su comunidad acepten la historia anterior a ellos de la misma manera.

    • Kuhn examina el papel fundamental que desempeña la comunidad científica como árbitro de lo que es la ciencia y de su calidad, que es lo que caracteriza a las civilizaciones derivadas de la Grecia helénica;

      Kuhn identifica a la Europa de los últimos cuatro siglos como el origen de la mayor parte del conocimiento científico que poseemos actualmente, gracias a su tolerancia y apoyo a grupos de sujetos interesados en resolver problemas específicos del comportamiento de la naturaleza.

      Ofreciéndoles a tales sujetos, soluciones aceptables a la mayor parte de los miembros de los distintos grupos y sin interés primario en reclutar opiniones favorables de las autoridades oficiales de su tiempo (rey, papa, dictador, sultán, primer ministro, sátrapa o presidente), o del pueblo en general.

      La pequeña cofradía de científicos establece sus propias reglas del juego, al margen de intereses ideológicos o políticos, y se da el imperial y legítimo hijo de regirse exclusivamente por ellos.

      Este episodio solamente ha ocurrido una vez en toda la historia universal, y ni siquiera como una corriente ininterrumpida de desarrollo sino más bien como una serie de episodios más o menos breves, a veces infelices y otras veces afortunados, con largos intervalos sujetos a la hegemonía de la sinrazón.

    • En La estructura, Kuhn incluye un párrafo en donde señala con claridad el mecanismo de crecimiento de la ciencia en los periodos de "ciencia revolucionaria"; hablando del cambio de un paradigma por otro, Kuhn dice que el nuevo paradigma:

    • No será aceptado por los científicos a menos que se convenzan de que se cumplen dos importantes condiciones:

      En primer lugar, el nuevo paradigma debe parecer resolver algún problema importante y generalmente reconocido, que no se ha podido resolver de ninguna otra manera

      En segundo lugar, el nuevo paradigma debe garantizar la conservación de una parte relativamente grande de la capacidad para resolver problemas concretos que la ciencia ha alcanzado a través de sus predecesores.

      La novedad por sí misma no es un desideratum de las ciencias, pero sí lo es en muchos otros campos creativos.

      De esto resulta que, aunque los nuevos paradigmas rara vez o nunca poseen todas las capacidades de sus predecesores, generalmente conservan una gran parte de los aspectos más concretos de los triunfos previos y además siempre permiten soluciones adicionales a otros problemas concretos.

    • Finalmente según Kuhn, podemos concluir que a pesar de la inconmensurabilidad de los paradigmas en competencia, y de que el cambio de uno por otro durante las revoluciones científicas se parece más a una conversión religiosa que a una acción racional, el nuevo paradigma está obligado a garantizar la preservación de mucho de lo aprendido en los periodos previos de ciencia normal, lo que permite el crecimiento de la ciencia.

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

    1. LENGUAJES DE PROGRAMACIÓN:

      Lenguajes de Programación:
      A S P
      Basic
      Builder
      C++ 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..!!
    wilocarpio

    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.

    Facu Sofy Yo..!! Pity Cayo Wilin Wilo

    Te espero en: wilocarpio@gmail.com

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

    11/11/2014

    Volver al principio

    Password: