PARADIGMA: Es mas facil desintegrar un atomo
que un preconcepto..!!
(Albert Einstein)

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

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

NACE UN PARADIGMA . . . Bienvenido al mundo paradigmático..!!
Un científico cerró 5 monos en una jaula grande, en cuyo centro ubicó una escalera, en la cima puso bananas.
Si un mono trepaba la escalera para tomar bananas, lanzaba un chorro de agua fría a los que quedaban en el piso.

Así, cuando un mono intentaba a subir la escalera, los restantes le propinaban una paliza.
Por ello, a pesar de tentarse con las bananas, ninguno optaba por subir la escalera.

Luego, el cientifico sustituyó uno de los monos y este, de inmediato trató 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 2do mono fue sustituido, y ocurrió lo mismo. Pero, además, el 1er sustituto participó de la paliza al novato.

Un 3ro fue cambiado, y se repitió el hecho . . El 4to y, finalmente, el último de los veteranos fue sustituido.

Así el científico quedó, con un grupo de 5 monos que:
- Aunque nunca recibieron un baño con el chorro de agua fria,
- Continuaban golpeando al mono que intentase llegar a las bananas.

Si preguntases a algún mono 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í ..!!"

Así nació un paradigma !! . . Ahora, si preguntas . .
Porqué actuamos de una manera, si podemos hacerla de otra.?

Ocurre que, cada acto nuestro, está guiada por un paradigma . . ! !


A partir de esta historia y otros antecedntes, podemos conceptualizar el Paradigma como:

- Comportamiento a imitar.
Como describe el experimento con los monos.

- Ejemplo a seguir.
Si eres ingeniero, es factible que tu paradigma sea tu padre ingeniero.

- Entidad ejemplar entre un conjunto.
Si eres cristiano, tu paradigma es la sociedad cristiana que moras.

- Forma de pensar, formular e interpretar las soluciones de un problema.
Si eres médico, el procedimiento mental del médico es tu paradigma.

- Procedimiento Sistemico de Programación.
Si eres sistémico, el paradigma de programacón, será tu modelo, donde:


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

De este mapa conceptual, surge que PARADIGMA es:

- Modelo de comportamiento computacional para resolver problemas operacionales.

- Guía operativa del proceso de diseño que determina la forma final de un programa.

- Procedimiento algorítmico con heurísticas para automatizar la digitalización de datos

Así, este paradigma es fuerza sinérgica que dinamiza la fascinante sociedad digitalizada, que destaca los conceptos de:

- ALGORITMO:
Secuencia operativa para lograr un resultado predefinido, capáz de resolver problemas.

- HEURÍSTICA:
Acción intelectual desarrollada para generar nuevas creaciones lógicas.

- CIENCIA:
Que analiza el comportamiento de la teoría de inteligencia que explique el comportamiento natural de los seres inteligentes.

- TECNOLOGIA:
Para construir máquinas automáticas, o 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 )

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

Paradigma Declarativo

Describe la solución y destaca sus características, pero no describe como procesarla.
Genera soluciónes sin indicar cómo construirla, ni describir los pasos para lograrla, señala solo reglas, restricciones y expresiones de valores que configuran la solución.

  • Caracteristicas
    • Diseña programas marcando hechos, reglas, restricciones, ecuaciones, transformaciones y propiedades de la solución.

    • El sistema incluye la secuencia u orden de evaluación que genere una solución.
      No describe las diferentes etapas a seguir para lograr la solución.

    • El paradigma declarativo:
      - Usa variables para almacenar valores intermedios, no para actualizar estados de información.
      - Especifica la solución sin indicar cómo construirla,
      - Determina el de orden de evaluación de la solución y sus secuencias de control son sus propias restricciones.
      - No requiere probar que el valor logrado es el resultado esperado.

  • Programaciòn Declarativa
    Se inicia con el lenguaje LISP, desarrollado por John McCarthy, para manejar listas algebraicas en la inteligencia artificial.

    Incorpora recursividad, recolección de basura y una definición formal del lenguaje (escrita en LISP).
    Usa plataformas que agrupan en una misma herramienta al editor, el interprete y el depurador.

    Sus caracteristicas son:

    • Trata la solución del problema, sin importar la forma de llegar a ella.
      El programador busca la lógica del algoritmo, más que controlar la secuencia

    • Los programas son un conjunto de definiciones o ecuaciones, que describen lo que debe ser calculado, no la forma de hacerlo.

    • Como las variables tienen un solo valor en la ejecución del programa, implica que no existe asignación destructiva.
      Por ello, es importante el uso del anidamiento y la recursividad.

    • Las listas son la estructura fundamental de datos.

    • Carece de efectos colaterales, porque el orden de ejecución no importa.
      Calcular un valor no afecta el calculo de otro, luego la secuencia de ejecución conduce al mismo resultado.

    • Las expresiones son usadas como valores que pueden tratarse como argumentos de otras definiciones.

    • La programación declarativa usa funciones de la lógica de predicados y sus ramas son PROGRAMACIóN:
      • FUNCIONAL: Basado en la evaluación de funciones matemáticas.

      • LOGICA: Donde un problema:
        - Es descripto definiendo relaciones sobre un conjunto de datos.
        - Obtiene conclusiones a partir de premisas aceptadas como validas, por aplicación de 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 o Por Ejemplos

  • Caracteristicas
    Describe soluciones de problemas similares, luego el sistema generaliza una solución procedimental a partir de tales demostraciones; aunque no se sabe si es el correcto.
    El algoritmo es representación interna, cuya validez de eficiencia requiere casos 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 tanto 2 pertenece al conjunto de pares

    - Si él numero x pertenece al conjunto de pares, entonces x + 2 es par. Por tanto:

    	
    						2 + 2 = 4
    						2 + 4 = 6
    						2 + 6 = 8
    		

    - La maquina toma el resultado de las sumas y lo incrementa en dos, asi genera los números pares.

  • Programación Demostrativa
    Capta aspectos similares de los objetos y a partir de ellos generaliza similitudes para resolver los nuevos casos.
    Especifica la solución describiendo ejemplos, y permite que el sistema generalice la solución de esos ejemplos para otros casos.
    Este criterio la diferencia de la solución procedimental porque puede 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 donde:

      • 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 conocimiento semántico de la aplicación.

      • DESVENTAJA:
        No se conoce cuándo el programa funciona correctamente.

      • PROGRAMACION ASISTIDA:
        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 falla la comprobación produce programas erróneos que trabajan bién con datos de prueba, pero que fallan con otros.

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

  • Caracteristicas
    Usa a Haskell como lenguaje funcional basado en el modelo matemático funcional, y abarca:

    • El concepto matemático de función es la correspondencia entre dos elementos en un conjunto origen y destino, cuyo resultado es la entrada del siguiente, y así sucesivamente hasta producir el valor deseado.
      Cada función ejecuta las mismas operaciones, como un modulo de programa codificado para procesar distintos datos, produciendo un resultado: "valor de la función".
      Tal valor es el nuevo parámetro operable; usado como nuevo dato de entrada de la siguiente instrucción y así sucesivamente hasta alcanzar el resultado deseado.

      En los parámetros calculados y devueltas como valores normales y mezcladas en el cálculo con otras formas de datos, se cumple que:

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

      • La definición de función proporciona:

        - Un parámetro formal o un nombre, y

        - La llamada a la función proporciona un argumento real o un valor.

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

    • No existe el concepto de celda de memoria asignada o modificada, solo valores intermedios resultados de cálculos anteriores y en entradas a siguientes cálculos.
      Ejemplo: Programa FUNCIONAL en Pseudolenguaje:
      
        siguiente ( x ) : int [ 10 ] -> int [ 10 ] = { xi = xi + 1; i = 0 .. 9 };
        cuadrado ( x ) : int [ 10 ] -> int [ 10 ] = { xi = xi * xi; i = 0 .. 9 };  
      
        cuadrado ( siguiente ( [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 ] ) )
      

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

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

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

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

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

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

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

  • Programación Funcional
    La programación funcional:
    - Está basado en la evaluación de funciones matemáticas,
    - Como mecanismos para aplicar ciertas operaciones sobre algunos valores o argumentos,
    - Para obtener un resultado o valor de la función para tales argumentos.

    Aunque los argumentos y el resultado de una función, sean constantes numéricas. Ejemplo:

    f(x) = x2 + x ,

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

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

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

    Esta programación, se basa en el modelo de computación "cálculo lambda" , de Alonzo Church en 1934. Abarca las operaciones:

    • Define función(es) de un solo argumento y con cuerpo específico, con la siguiente terminología:

      lx.B, en donde:
      - x : Define el parámetro o argumento formal.
      - B : Representa el cuerpo de la función. Por tanto:
      - f(x) = B.

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

      Es decir: (lx.B)

      Ejemplo:
      (lx.(x+5))3, indica que en x + 5, debe sustituirse el valor de x por 3.

      Cuando ya no es posible reducir una función, implica que encontro el valor de la función,
      y tendrá la consistencia de regresar el mismo valor para los mismos argumentos.

Paradigma funcional: LENGUAJE LISP

Creado en 1958 por John McCarthy (ITM), es el lenguaje de programación de alto nivel más viejo y usado hoy en la inteligencia artificial (AI); que fue cambiando hasta sus versiones Common Lisp y Scheme.

LISP "LISt Processing": Se caracterizan por:

- Referirse a lenguajes de programación tipo multiparadigma con sintaxis completamente entre paréntesis.

- Tener listas encadenadas entre paréntesis como estructuras de datos.

- Poseer intercambiabilidad del código y datos.

- Permitir llamar a la función con el nombre del operador y luego los argumentos. Ej: Función f de 3 argumentos: (f x y z).

- Poseer funciones primitivas predefinidas para 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
 
Ejemplo en LISP, para comprobar 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 

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

Paradigma funcional: LENGUAJE HASKELL

Los desarrolladores de este lenguaje que opera funciones, mediante parámetros para que el ordenador calcule resultados, son:
- 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
- Lambda cálculo tipado y Alonzo Church en EEUU .
- En 1950, John McCarthy diseñó el lenguaje LISP (List Processing) usando las listas como tipo básico.
- Haskell 98 es la última versión del lenguaje.
- El lenguaje Haskell puedes consultar en: http://www.haskell.org

En Haskell existen:
- 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

  1. HASKELL: CONCEPTOS
    El entorno HUGS funciona como una calculadora que establece una sesión interactiva entre ordenador y usuario. Para esto:

    - Al inicio el sistema muestra un prompt " Prelude>" y espera que el usuario introduzca una expresión (Expresión inicial y presione la tecla < R E T U R N >.

    - Luego, el sistema evalúa la expresión e imprime su valor antes de volver a mostrar el prompt para esperar la siguiente expresión.
    Ejemplo:

    
       Prelude> (2+3)*8
       40
    

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

    
       Prelude> sum[1..10]
       55
    
    Expresión de la lista de enteros que van de 1 hasta 10, y sum es una función estándar que devuelve la suma de una lista de enteros.
    Es decir:
    
     1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = 55
    

    Se usó funciones estándar, incluidas un fichero denominado "estándar prelude", cargado al arrancar el sistema.
    - El usuario puede definir sus propias funciones y almacenarlas para utilizarlas en el proceso de evaluación.
    - La evaluación consiste en tomar una expresión e ir transformándola aplicando las definiciones de funciones predefinidas, hasta que no pueda transformarse más.
    - La expresión resultante se denomina representación canónica y es mostrada al usuario.
    - En el proceso de evaluación pueden seguirse diversas trayectorias, por ejemplo:

    
        cuadrado (3+4)
        =               { evaluando la suma }
        cuadrado 7
    
        =               { utilizando la definición cuadrado x = x * x }
         7 * 7
    
       =                { evaluando la multiplicación }
                49
    
    En este ejemplo se evaluó primero las expresiones internas antes de la aplicación de la función.
    Se evalua los argumentos antes de llamar a la función, llamada por valor y se asocia con la evaluación ansiosa.

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

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

    Este método se denomina llamada por nombre y está asociado a la evaluación perezosa.

  2. HASKELL: COMANDOS DEL INTERPRETE
    Además de :edit y :load, otros comandos se envían directamente al interprete.
    Todos empiezan por dos puntos. Algunos de comandos son:

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

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

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

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

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

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

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

      Las opciones más importantes son s, t, g en i:
      - s: Información estadística (reducciones y memoria) después de cada computación.
      - t: Da el tipo de cada resultado de una computación
      - g: Se informa sobre Garbage collection.
      - i: Las constantes de enteros se manejan de forma especial.

  3. HASKELL: FUNCIONES y OPERADORES

    Las palabras reservadas que no pueden usarse para definir funciones son:

    
       Case, class, data, else, if, in, infix, infixl, infixr, 
    
       instance, let, of, primitive, then, type, where
    
    Para definir una función se antepone ‘:edit’, luego el nombre del fichero: Prelude> :edit nuevo

    EJ: El fichero ‘nuevo’ de la función factorial: fac n = product [1..n]

    Se usa
    - Notación para ‘lista de números entre dos valores’ y la función estándar product.
    - Se guarda como nuevo.hs y se puede salir del procesador de textos.
    - Para usar la nueva función, se usa el comando: Prelude> : load nuevo
    - 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.
    - Prelude define, 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).
    - El interprete luego indica que fue necesario para el calculo: ‘5 reductions’ (medida del tiempo utilizado) y ‘9 cells’ (medida para memoria utilizada).
    - Prelude> ,indica que el interprete esta listo para el próximo cálculo.

    Los nombres de funciones y parámetros empiezan en letra minúscula, (minúsculas y mayúsculas son diferentes para el interprete).
    Luego pueden seguir letras minúsculas o mayúsculas, números, el símbolo ’ y el símbolo _.
    Ejemplos:

    
        f               sum            x3               g’             
    
        tot_de_macht                 nombreLargo
    

    Símbolos que se pueden usar para formar operadores:
    
      :       #        $    %    
    
      &    *    +    -    =    .    
    
      /    \    <    >    ?    !    
    
      @    ^    |
    
      +      ++      &&      
      
      ||    <=    ==    /=     .    //
    
      @@     -*-        \ /           
    
      / \              ...            
      
      <+>         :->
    
    Si a y b son tipos, luego a->b es tipo de función con argumento de un elemento de tipo a y devuelve un valor de tipo b.

    La función Haskell es objeto de 1ra clase que puede ser argumento de otra funciones o ser componente de estructuras de datos.

    La función suma tiene el tipo:

    - (+) :: Int->(Int->Int) ó Se podría escribir simplemente
    - (+)::Int->Int->Int, puesto que el operador -> es asociativo a la derecha.
    - (+) Función de argumento tipo Int que devuelve una función tipo: Int->Int.

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

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

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

    • HASKELL: FUNCIONES BOOLEANAS
      
         < (menor que),  
         > (mayor que), 
         <= (menor o igual que), 
         >= (mayor o igual que), 
         == (igual a) y 
         /= (distinto de).
      
      El operador < comprueba si un numero es menor que otro numero.
      El resultado es la constante True (si es menor) o la constante False (si no):
      
        Ej.1:
             Prelude>1<2
             True
      
        Ej.2:
             Prelude> 2<1
             False
      

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

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

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

    Una propiedad de Haskell: Es posible asociar un único tipo a toda expresión bien formada.
    Esta propiedad hace que el Haskell sea un lenguaje fuertemente tipado.
    Cualquier expresión que no se asociarse a un tipo es rechazada como incorrecta antes de la evaluación.

    El análisis tiene dos fases:

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

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

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

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

    Por Ej.: cuadrado:: Int -> Int

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

    cuadrado x = x * x

    • TIPOS PREDEFINIDOS
      Los principales tipos predefinidos del sistema Haskell, se podrían clasificar en:
      - Tipos básicos, cuyos valores se toman como primitivos, y los
      - Tipos compuestos.

    • TIPOS BÁSICOS DE DATOS
      Los tipos básicos que deben escribirse con mayúsculas:
      - Int [Int]
      - Float [Float]
      - Bool [Bool]
      - Char [Char]

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

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

      En el standar prelude se incluye un amplio conjunto de operadores y funciones que manipulan enteros:
      - (+): Suma,
      - (*): Multiplicación,
      - (-): Substracción,
      - (^): Potenciación, etc.

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

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

      El standar prelude incluye múltiples funciones para flotantes: pi, exp, log, sqrt, sin, cos, tan, asin, acos, atan, etc.

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

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

      EJ:

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

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

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

    Hay varias formas de escribir expresiones de listas:
    - La lista vacía, se representa mediante [].
    - Las listas no vacías pueden ser construidas:

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

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

    Estas notaciones son equivalentes: [1,3,10] = 1:[3,10] = 1:(3:[10]) = 1:(3:(10:[]))

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

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

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

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

    
       Prelude>length [1,3,10]
      
       3
    

    Notar que todos los elementos de una lista deben ser del mismo tipo.

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

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

    Las cadenas pueden ser secuencias de caracteres encerradas entre comillas dobles.
    Los códigos de escape utilizados para caracteres, pueden utilizarse para cadenas. Ejemplo:

    
        Prelude>"hola" 
        
        hola
    

    Como las cadenas son listas de caracteres, las funciones del prelude para listas pueden utilizarse con cadenas.
    Ejemplo:

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

  7. HASKELL: TUPLAS
    Los elementos de una tupla, cuyo tamaño es fijo; pueden tener tipos diferentes.

    Ej: 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 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 ().

  8. HASKELL: 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 de la función que se quiere definir (Ej: numéricamente menor o 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)
    
    También es posible obtener una version inductiva (usando patrones):
    
       suma [] = 0
    
       suma (cabeza:cola) = cabeza + suma cola
    

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

  9. PATRONES
    • HASKELL: DEFINICIÓN POR ANÁLISIS DE PATRONES:
      Parámetros formales son los parámetros de una función en la definición de la misma. Ejemplo
      
         x e y en
         
         f x y = x * y
      

      En una llamada a la función se dan parámetros actuales a la función. Ejemplo: f 17 (1+g 6)

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

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

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

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

    • HASKELL: ENCAJE DE PATRONES SIMPLE:
      Declaración de una función f está formada por un conjunto de ecuaciones con el formato: f < pat1> < pat2> . . . < patn> = < expresion>

      Si f fuese un operador sería: < pat1> f < pat2> = < expresion>
      Donde cada una de las expresiones < pat1> < pat2> . . . < patn> representa un argumento de la función y se denominado un patrón.
      El número n de argumentos se denomina paridad.

      Si la función se define con más de una ecuación, se evaluan una o más argumentos de la función para determinar cuál ecuacion aplicar.

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

      Ej: En la definición de factorial: fact n = product [1..n]

      Si se desea evaluar la expresión "fact 6" es necesario:
      - Encajar la expresión "6" con el patrón "n" y
      - Luego evaluar la expresión obtenida a partir de "product [1..n]" substituyendo la "n" con el "6".

    • HASKELL: OTROS TIPOS DE PATRONES ÚTILES:
      • ANÓNIMOS:
        Se representan por el caracter (_) y encajan con cualquier valor, pero no es posible referirse posteriormente a dicho valor.
        Ejemplo
        
            cabeza (x:_) = x
            
            cola (_:xs) = xs
        

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

        Podría darse un nombre a x:xs mediante un patrón con nombre: f p@(x:xs) = x:p

      • PATRONES n+k :
        Encajan con un valor entero mayor o igual que k. El valor referido por la variable n es el valor encajado menos k. Ejemplo
        
           x ^ 0 = 1
           
           x ^ (n+1) = x * (x ^ n)
        

  10. HASKELL: FUNCIONES DE ORDEN SUPERIOR SOBRE LISTAS:
    Las funciones pueden ser más flexibles utilizando funciones como parámetros. Ej: map, filter y foldr
    • map: Función de orden superior basada en el principio general ‘recorrer todos los elementos de una lista’.
      La función parámetro de map se aplica a cada elemento de la lista.
      La función map aplica su parámetro función a todos los elementos de una lista. Ejemplo: xs = [ 1 , 2 , 3 , 4 , 5 ]
      
            Ejemplo 2: Prelude>map (1+) [1..10]
            
            [2,3,4,5,6,7,8,9,10,11]      
      

    • filter: (filtro).
      Devuelve los elementos de una lista que cumplen alguna condición.
      Esta condición se da a la función filter en forma de una función booleana. Ejemplo: xs = [ 1 , 2 , 3 , 4 , 5 ]
      
           Ejemplo 2: Prelude> filter even [1..10]
      
           [2, 4, 6, 8, 10]
      

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

      La función foldr inserta un operador entre todos los elementos de una lista, empezando a la derecha con un valor dado: xs = [ 1 , 2 , 3 , 4 , 5 ]

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

Paradigma Heurístico

El diccionario, dice que "heurística" es "El arte de inventar", pero para el sistémico:
- Es un conjunto de elementos operativos
- que resultan de agregarles conocimiento
- a los métodos de búsqueda para hacerlos más eficientes.

- Son una suerte de algorítmos inteligentes de búsqueda
- capaces de resolver problemas con numerosas alternativas de solución, tales como determinar:
- - El mejor medio para transportar, desde diversos orígenes hacia diferentes destinos ?
- - Los mejores postulantes para asignarles determinadas tareas entre varias posibles.
- - Dentro de las múltiples posibilidades, todos los posibles casos de cierta característica.
- - Usando dos cubos sin marcas, uno de 6 litros y otro de 8 litros; llenar un cubo con 4 litros de agua.
- - La mejor asignación de 50 puestos de trabajo, con cada uno de los 30 operarios de una empresa.

Este tipo de planteos se resuelve con la Programación Heurística asociada a la "Inteligencia Artificial", rama de la ciencia que emula en el ordenador los procesos mentales inteligentes del hombre.
A priori notamos que:
- No existe ningún procedimiento o algoritmo matemático que capaz de resolver estos problemas,
- Será necesario probar diversas alternativas de acciones hasta hallar la solución óptima,
- Dentro de todas las combinaciones posibles
- La evaluación puede requerir largos lapsos de tiempo.
- Para que la búsqueda insuma menor tiempo, conviene restringirla a solo un subconjunto de combinaciones posibles,
- Podar los caminos superfluos, aplicando heurísticas del tipo atajos.

Para explorar las 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.

Así, este paradigma, promueve para resolver problemas una programación con:
- Reglas de buena lógica o heurísticas,
- Una acción de características de ser el más eficiente, entre varias alternativas.
- Pero que aún así, no garantiza la solución cierta.

El Paradigma Heurístico es un modelo de solución de problemas con alguna componente heurística sobre la base de:

  • La representación más apropiada de la estructura del problema para su resolución con técnicas heurísticas

  • Utilizar métodos de solución de problemas aplicando funciones de evaluación con procedimientos de búsqueda heurística.

  • Representar la estructura para resolver el problema con técnicas heurísticas.

  • Preveer datos limitados, para estimar parámetros, con errores superiores a los proporcionados con la solución de una buena heurística.

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

  • Optimizar el algoritmo, con buenas soluciones de inicio, guiando la búsqueda y reduciendo el número de soluciones posibles.

  • Generar resultados superiores a los del modelo actual.
  • PROGRAMACION HEURÍSTICA:
    Requiere el conocimiento integral del problema a resolver, de su operatoria, de cómo se genera y que efectos produce el minimizar el tiempo de búsqueda.
    Por ello, más que un modo de programación, es un método para búscar soluciones a problemas computacionalmente complejos, donde:
    • Esta programación se aplica en la Inteligencia Artificial (I.A.), en la Ingeniería del Conocimiento, resuelto con lenguajes:
      - PROLOG: Desarrollado por J. McArthy en 1956-1962
      -
      LISP: Desarrollado por A. Colmerauer en 1972.
      Donde se opera heurísticas, como conclusiónes del razonamiento humano en un dominio específico, dado por la experiencia y mediante "reglas de buena lógica".

      Utilizada como método:
      - De búsqueda para obtener metas en problemas no algorítmicos, o con algoritmos que generan explosión combinatoria (ej. damas. ajedrez)
      - Aproximado de resolución de problemas utilizando funciones de evaluación de tipo heurístico.
      - De poda para estrategias de programas.

      El lenguaje heurístico aplicado al campo de la I.A, se caracteriza por:

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

      • Tratar estructuras crecientes, en programas que amplian el volumen de conocimiento, que basada en 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 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.

      • Procedimientos de proceso para ejecutar el modelo heurístico usando el conocimiento adquirido en la solución del problema.

    • Las alternativas factibles no aseguran encontrar una solución óptima, solo una adecuada a determinadas circunstancias.
      - Resuelven problemas, con reglas de buena lógica o heurísticas, que detectan entre varias acciones, la más optimista pero no garantiza la más efectiva.
      - Se modeliza la representación de la estructura, estrategias de búsqueda y métodos de resolución de problemas.
      - Es usada en la Inteligencia Artificial, de la Ingeniería del Conocimiento, con heurísticas, o conclusiones del razonamiento sobre un tema específico, apoyado en su experiencia, utilizando "reglas de buena lógica".

      En este ámbito, las tareas de programación implican usar 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 ?".
      Estos requieren la búsqueda exhaustiva de posibles combinaciones de algún conjunto finito, tratando de evitar una "explosión combinatoria" o "incremento exponencial del espacio de búsqueda" complejo de tratar.

    • La programación heurística, conviene ser considerada, cuando:
      - El problema no tiene solución algorítmica, o cuando las alternativas de solución sean muchas.
      - La búsqueda de metas en problemas no algorítmicos, como el juego damas ó ajedrez, generen múltiples alternativas de acción.
      - La calidad de las soluciones sea medida en términos de tiempo de respuesta del sistema.
      - La alternativa de minimizar las opciones como algoritmo, sea un subconjunto entre las alternativas posibles.
      - En la resolución de problemas, se usen funciones de evaluación heurísticas.
      - Se aplique estrategias de poda de programas.
      - Se procesen por computadora problemas del tipo:
      - - ¿Cuál es el mejor camino?
      - - Listar todos los casos posibles.
      - - ¿Existe una asignación de elementos que satisfaga ?.

      El algoritmo heurístico usa procedimientos:
      - De búsqueda de soluciones casi óptimas a costos operativos razonables,
      - Sin garantizar la optimización de las soluciones generadas
      - Sin determinar la distancia a la solución óptima.

    • Es una forma de modelizar la configuración del problema por medio de:
      - La representación de su estructura,
      - Estrategias de búsqueda y
      - Métodos de resolución.

    • El tratamiento heurístico considera características de información y especificaciones del problema, que destacan:
      • Heurística simple, bajo consumo de memoria, con alta velocidad de búsqueda, precisa, robusta,
        Parada que incorpore el conocimiento obtenido durante la búsqueda.

      • Especificaciones del problema para generar una o múltiples soluciones;
        con tratamiento en tiempo real o no; con decisión interactiva o no.

      • Las heurísticas que pueden codificarse con cualquier lenguajes de programación, pues la programación heurística no ha producido su propio lenguaje específico.

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

      En este problema, intervienen como factores de decisión,
      - Distancia y estado de caminos entre cargaderos con los ingenios;
      - Costo unitario del medio de transporte;
      - Precio de venta de la caña de cada proveedor;
      - 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
      	

      - Si la cantidad correspondiera a la Provincia de Tucumán que tiene 14 ingenios azucareros,
      - La cantidad, para 14 cargaderos sería el factorial de 14,
      - 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
      - Si no contamos con una buena heurística estamos fritos..!!!,
      - 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

      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 litros en la jarra de 4l con 0<=X<=4 AND Y 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 seía (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 debe encontrar un pasaje 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)
      Desde el 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:
      (0,0) => (4,0) => (1,3) => (1,0) => (0,1) => (4,1) => (2,3) => (2,0)

      Se aplicaron las reglas 1, 5, 4, 7, 1, 5 y 4

      De tales reglas concluimos que:

      • Las condiciones de la izquierda a veces no son 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), especifica que la jarra no esta 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)
        luego, tirar agua sin cuantificar, concluye que la aplicación de esta regla no 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.
        Se agregan reglas que capturen el conocimiento sobre casos especiales para la solución del problema. Ej:

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

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

  • METODOS DE BUSQUEDA En paradigmas heurísticos:
    1. Búsqueda Breadth-First Search (primero en ancho)
      Visita todos los nodos de un nivel antes de visitar los del siguiente.
      El pseudo-código de este algoritmo es:

      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;

      Buscar a lo ancho asegura que una vez alcanzada una solución no existe otra ruta hacia la solución que tenga menor cantidad de pasos.

    2. Búsqueda Depth-First Search (primero en profundidad)
      La búsqueda sigue una rama del árbol hasta encontrar la solución o terminar la búsqueda por esa dirección
      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: Hay ciertos defectos que bién manejados..brillan más que la misma virtud..!! (Rochefocauld)

Paradigma IMPERATIVO o ALGORITMICO

Encuentra soluciones a problemas apoyado en la operativa de la máquina de VON NEWMAN, provista de un programa en memoria, que se ejecuta secuencialmente, alimentándose de datos de tal memoria, para efectúar sus cálculos y luego actualizar esta memoria.

Determina los datos para el cálculo, asociandolos 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 de los datos originales son cálculos generados por algoritmos que transforman los datos de entrada en la solución del problema.
Para estos cálculos, el paradigma imperativo proporciona 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.

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.

Los EFECTOS LATERALES, manejan 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.-

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:

    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 LOGICO

Resuelve problemas estructurados como relaciones de conjunto de datos, sobre las que aplican 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 solo especifica hechos y propiedades del problema, no como debe resolverse; es el sistema quién busca 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,
    Automatiza así la corrección del programa.
  • Verificación de transformaciones, evaluadas partiendo de metas.
    Cuando 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 variables de la meta inicial, usando un proceso iterativo, que concluye cuando las sub-metas son probadas.

Robert Kowalski crea el paradigma lógico, sobre las cláusulas de Horn, en formato restrictivo, como subconjunto de la Lógica de Predicados de primer orden.

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

  • ESTRUCTURA DEL PARADIGMA LOGICO
    Es un conjunto de asertos o proposiciones o hechos de reglas lógicas establecidas apriori, que generan conclusiones que 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 tiene componentes lógicos del algoritmo del programa, luego migra a declaraciones formales correctas por definición, así la eficiencia del programa queda probada.
    Para ello, la evaluación:
    - Empieza definiendo una meta, luego prueba que se ajusta a un hecho o se deduce de alguna regla.
    - Si la transformación es verificada por sus antecedentes, entonces:
    - - Estos se convierten en nuevas metas a equipararse con hechos o bien,
    - - O bién, resolverse por otras reglas.
    El proceso:
    - Termina cuando todas las sub-metas han sido probadas.
    - Para la solución final se aplica a las variables de la meta inicial, los resultados intermedios obtenidos.

    Para definir el mecanismo de búsqueda adecuado para seleccionar las reglas, ocurre:

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

    El Paradigma Lógico se basa en la creación de reglas, que destacan:

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

    En síntesis:
    - Un programa lógico se configura como un conjunto de hechos( asertos o proposiciones ) y
    - De reglas lógicas previamente establecidas,
    - Para generar conclusiones ya sea a partir de una serie de preguntas o cuestiones lógicas,
    - 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 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:
      Los símbolos de 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

    Paradigma Lógico: 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,
    - A partir de ellos, deduce nuevos hechos para resolver automáticamente el problema.
    - Su auge fue en los 80, con Japón en el proyecto para la 5ta generación de ordenadores de inteligencia artificial, con PROLOG como lenguaje nativo capaces de pensar, sacar conclusiones, emitir juicios e incluso comprender las palabras escritas y orales.
    - Dotado de un motor de inferencia que búsca en su base de hechos, es 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:
    - 1) Hechos y Reglas.
    - 2) 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 que expresan las relaciones entre los objetos del ambiente del sistema. Su formato es:
      - - nombre-de-predicado(constante...)

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

      Hermano (Cayo, Pity).

      La definición de los hechos, o base de hechos, constituye la información a ser explotada, para encontrar soluciones.

    • VARIABLES:
      Usadas para definir reglas, cuyo ámbito se reduce a la regla donde aparecen, luego no existen variables globales.
      Comienzan con una letra mayúscula.

      Ejemplo: Pity

      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:
      Como lenguaje declarativo posee listas que permiten 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:
      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:
      Definen reglas mediante operadores relacionales y aritméticos básicos, como en los demas lenguajes de programación.

      El operador "is", es operador de asignación, u operador relacional igual.

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

      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.

      "read" y "write" son operadores para lectura y escritura de información.
      "½" es un operador para manejar listas.

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

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

    Ejemplo de recursividad: Factorial en pseudocódigo esta función:

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

    Destacaremos que:

    • PROLOG no tiene funciones, luego, 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 .
    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    []
    
    Así, descomponemos 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).
    
    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:
                 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 implica 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 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 se determina 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 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: La lógica es un método sistemático
que puede generar con confianza..
... la conclución erronea..!!
( Wilucha )

Paradigma PROCEDIMENTAL

Un programa es una secuencia de llamadas a "procedimientos". Donde:
- Un procedimiento es una secuencia de instrucciones
- Puede llamarse repetidamente en el programa, reduciendo su código y complejidad.
- El programa principal pasa los datos individuales en cada llamada.
- Los datos son procesados y una vez que el programa finaliza, se obtienen los resultados finales.

Siguen la secuencia para obtener la solución al problema, luego:
- Con técnicas de depuración y verificación se prueba su corrección.
- Si un procedimiento es correcto, producirá los mismos resultados correctos.
- Caso contrario se búscan los errores para repararlos.

Estos paradigmas pueden procesarse en serie o en paralelo. Este ultimo puede tener procesamiento:
- Asincronico (cooperación de procesos paralelos) o
- Sincrónico (proceso simples aplicados simultáneamente a muchos objetos).

Ejemplo: En la estructura simple "pila" de datos con FILO (First-In/Last-Out), en lenguaje C:
- Son adicionados y quitados sólo en el tope
- Se adicionan usando una función mete()
- Se eliminan con la función saca()


			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);
					}
La aplicación en C:

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

  1. PARADIGMA QUE MODIFICA REPETIDAMENTE EL VALOR DE SUS DATOS
    Funciona bajo el criterio de la máquina de Von Newmann, que constan de:
    1) Celdas de memoria global, dividida en posiciones, para almacenar, valores ó  instrucciones.
    2) Procesador de instrucciones del programa paso a paso. Usan la:
    - - Parte del contenedor del programa para saber cuál es la siguiente instrucción a ejecutar y
    - - Unidad aritmética-lógica, destinada a realizar los cálculos.
    3) Unidades de entrada-salida.

    Las instrucciones de cálculo recogen datos de la memoria y luego de realizar cálculos intermedios,
    - Escriben los resultados en la memoria, que será actualizada continuamente, hasta que la computación finaliza,
    - El resultado se define 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:
    • 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.

    • PARADIGMA DEMOSTRATIVO o por EJEMPLO
      Propone soluciones de problemas similares en lugar de especificar como lograr una solución.
      Luego el sistema GENERALIZA una solución procedimental a partir de tales demostraciones. Para esto:
      - Simula una secuencia procedimental
      - Infiere intenciones, intentando generalizaciones basadas en el razonamiento del conocimiento.

      La solución por inferencia tratará de determinar:
      - Los aspectos similares.
      - Datos u objetos
      - A partir de estos generalizará las similitudes.

    • PARADIGMA DE DEFINICION
      Señala hechos, reglas, restricciones, ecuaciones, transformaciones, etc. de valores para la solución.
      Con tal información,
      - El sistema proporciona un esquema del orden de evaluación que genere una solución.
      - Especifican la solución sin indicar cómo construirla,
      - Eliminan la necesidad de comprobar que el valor generado es la solución.
      - El programador adopta verdades, hechos, restricciones o reglas que definen el problema a resolver.

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

POO: Paradigma Orientado a Objeto

La filosofía del POO propone soluciones a típicos problemas de la programación, como la:
- Falta de reusabilidad del código, en desmedro de la rentabilidad.
- Dificultad de modificar, actualizar o efectuar reingenieria de sistemas, minimizando así su vida útil.
- Laboriosidad y extensos procesos de desarrollo, carentes de codificación no intuitiva.
- La falta de portabilidad.

La "OO": Orientación a Objetos" se refiere a un conjunto de tecnologías de sofware que abarcan a:
- Los lenguajes de programación OO,
- Los sistemas de bases de datos OO,
- Interfaces gráficas OO
- Los sistemas operativos OO,
- La Ingeniería de Software OO
- 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.
- Construir componentes de software reutilizables.
- Modificar componentes sin tener que recodificar los programas desde el inicio.

En los 60s el POO nace como método que emula en el ordenador el funcionamiento del mundo real.
- Permite una representación mas directa de la realidad.
- Considera al sistema como conjunto de objetos
- Los objetos cambian debido a la ocurrencia de eventos en su ambiente.
- Para resolver problemas descarta heurísticas estructuradas de listas, colas, pilas, árboles, registros, etc.
- Utiliza acciones de objetos para diseñar nuestras heurísticas informáticas.

LOO: Lenguaje Orientada a Objetos

Las heurísticas del LOO, están estructuradas bajo la filosofía del POO, donde se destacan los siguientes elementos:

  1. LOO: C L A S E S:

    La clase que es un tipo predefinido de estructura de datos intangible.
    Ejemplo: La clase es el plano de la casa, mientras que el objeto es la propia casa, construida en base de tal plano.

  2. LOO: O B J E T O S:
    El objeto es una entidad dotada de propiedades. Donde:
    - Una propiedad es una característica que posee una entidad.
    - Una entidad tiene un número ilimitado de propiedades.
    - Las propiedades conocidas, se denominan atributos.
    - El valor asignado al atributo, en un instante de tiempo, es el estado de la entidad.
    - Las entidades pueden cambiar su estado con el tiempo.
    - Un cambio de estado puede cambiar uno o varios valores de atributos de una entidad.
    - Un cambio de estado ocasionado por eventos, modifica o altera el estado de una entidad.
    - Es el ente tangible operable que interactua con los métodos del programa para obtener la solución de un problema.
    - Emulando la caja negra del avión, está dotado interiormente de la funcionalidad para actuar frente a mensajes de otros objetos,
    - Al devolver una acción, proporciona el servicio que justifica su propia existencia dentro del sistema.
    - Promueve una reutilización del código de cada parte del sistema.
    - Contienen variables llamadas variables de instancia.
    - Sólo el método de instancia de un objeto puede referirse y modificar los valores de 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.
    - Esto es la encapsulación y asegura que el proceso para obtener los datos de un objeto sea seguro.
    - Las variables de instancia variable1 hasta variableX se acceden por el emisor mediante métodoUno hasta métodoN.
    - El emisor no puede referirse a las variables, directamente, por sí mismo.

    LOO 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.
    Ejemplo:
    El objeto Alumno tiene los métodos nombre, dirección, y carrera y las variables nombre, dirección, y carrera.

    Un objeto considerado una "cosa" que puede realizar un conjunto de actividades que definen su comportamiento.
    Ejemplo:
    Un objeto "EstadoAlumno" puede informar promedio, curso, 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 es un conjunto de comandos que desarrollan un acción específica. Como:
    - 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.

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

    El OBJETO, como estructura compleja posee las siguientes características que definen su naturaleza:

    • LOO Objetos: 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).

    • LOO Objetos: ENCAPSULACION
      Propiedad de ocultación de la información que integrada en una unidad o cápsula, datos y programas relacionados entre sí; haciéndolo inaccesible e impide que otros objetos, usuarios, o programadores conozcan su organización.

      La estructura de cápsula facilita que el objeto sea transportado a cualquier ubicación diferente.
      Es la forma de encerrar atributos y métodos dentro de la estructura del objeto, con apariencia no visibles desde el exterior.
      Y así al estar ocultos, resultará que:

      -| Como la clase tiene variables interdependientes; si se manipula esas variables directamente la clase puede funcionar mal.

      -| Si las variables estan ocultas, los métodos son la única posibilidad para cambiar los valores de sus variables.

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

      -| Si la variable es directamente manipulada, sin intervención de métodos de la clase, las posibilidades para comprobar son inmanejable.

    • LOO Objetos: POLIMORFISMO
      Una analogía que permite conceptualizar el polimorfismo, es observar 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 permite diseñar métodos para que las clases derivadas, adquieran comportamientos distintos;
      Una misma operación puede cambiar entre las distintas clases derivadas de una clase base.
      Dos objetos con instancias de distintas clases, generan resultados diferentes aunque la operación requerida tenga la misma denominación.

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

      Esto 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 al objeto emisor comunicarse con otros objetos sin 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.
      Supon 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.

    • LOO Objetos: HERENCIA
      Permite a una clase tener el mismo comportamiento que otra y extender o limitar ese comportamiento de una acción a una necesidad específica.
      Consiste en que la clase derivada, hereda los atributos y métodos de su clase primigenia. Simplifica su codificación.

      Ejemplo, por la herencia, tanto motocicletas como automóviles, poseerán automáticamente los mismos atributos y métodos de la clase automotor.
      Al codificar solo será necesario codificar las características particulares de las subclases motocicletas y automoviles.

      Dividir una clase en subclases, más la herencia permite extender la definición primigenia de una clase, hasta cualquier nivel de detalle.

      Ejemplo: La clase Graduado y la clase SinGraduar tienen comportamiento similar, como 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
      Ambas heredan el comportamiento de Alumno.

      Ambas clases Graduado y SinGraduar pueden agregar comportamiento adicional que sea único a ellas.
      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.
      Ejemplo, Alumno es superclase de Graduado y SinGraduar.
      Graduado y SinGraduar son subclases de Alumno.

    • LOO Objetos: REUTILIZACION
      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.

    • LOO Objetos: RELACIONES
      Permiten que el objeto se inserte dinámicamente en el programa mediante punteros a otros objetos, como enlaces con los demás componentes.
      Se agrupan en dos tipos fundamentales:

      -| LOO Objetos: RELACIONES JERARQUICAS:
      Son relaciones bidireccionales, donde un objeto situado encima, es padre de otro objeto.
      Si un objeto es padre de otro, este último es hijo del primero.

      Un objeto tiene un solo padre, mientras que puede existir un hijo con varios padres.

      -| LOO Objetos: RELACIONES SEMANTICAS:
      Estas relaciones no tienen vinculación con la organización de los objetos que las establecen.
      Sus propiedades y consecuencia solo dependen del significado los objetos en sí mismos y no de su posición en la organización.

      Así al redactare un diccionario informatizado para que su lector obtenga la definición de una palabra cualquiera.
      En tal diccionario, las palabras son objetos y la jerárquia proviene de la estructura de 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.
      		 

    • LOO Objetos: PROPIEDADES:
      Son elementos que cualifican y cuantifican las características físicas del objeto.
      Cada objeto tiene cierto número de propiedades, cada una de ellas tendrá a su vez, uno o varios valores.

      Las propiedades junto con los métodos y las relaciones, son datos encapsulados dentro del objeto.
      El objeto puede tener valores estructurados en formatos matriciales, vectoriales, listas, etc, con valores numérico, alfabético, etc.
      El objeto puede adquirir:

      -| PROPIEDADES PROPIAS: Están formadas dentro de la cápsula del objeto.

      -| PROPIEDADES HEREDADAS: Definidas en un objeto antepasado tal como padre, abuelo.

    • LOO Objetos: CONDICIONES:

      - TODO LO EXISTENTE ES UN OBJETO:
      Cualquier ente puede representarse como objeto del programa.

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

      - CADA OBJETO ESTÁ COMPUESTO POR OTROS OBJETOS:
      Asi, se simplifica la complejidad manipulando piezas simples componentes.

      - TODO OBJETO TIENE UN TIPO:
      Todo objeto es una instancia de una clase en particular.

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

    • LOO Objetos: ESTRUCTURA
      El objeto es una instancia de una clase, que tiene un estado, una identidad y un comportamiento predefinidos por su clase:
      Se caracteriza por NO:
      - Ser un dato simple, porque contiene componentes estructurados.
      - Estar aislado, porque forma parte de una organización jerárquica.

    • LOO Objetos: ORGANIZACION Los objetos poseen una organización jerárquica, donde ciertos objetos son superiores jerárquicamente a otros, agrupados como objetos:

      -| Simples: Cuando su estructura pueda ser representada por medio de un árbol.

      -| Complejos: En caso contrario.
      En ambos casos existen tres niveles de objetos.

      - - 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.
      Ejemplo Raíz o Entidad u Objeto madre,.

      - - OBJETOS INTERMEDIOS:
      Ubicados después de la raíz y que a su vez tienen descendientes y constituyen conjuntos o clases de objetos.
      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.
      Ejemplo, contenedor, buscador, etc.

      - - OBJETOS TERMINALES:
      Son objetos que descienden de una clase o subclase y no tienen descendientes

    • LOO Objetos: OPERACION SECUENCIAL:
      Un mensaje puede provocar el envío de otros mensajes, ya sea al mismo u otros objetos, para completar su tarea.
      A esto se lo llama operación secuencial.
      El control no le será devuelto al objeto emisor original hasta que todos los otros mensajes hayan sido completados.
      Ejemplo: El Objeto A envía un mensaje al Objeto B. Para que el Objeto B procese este mensaje, envía otro mensaje al Objeto C.
      Asimismo el Objeto C envía otro mensaje al Objeto D.

      El Objeto D devuelve el control al Objeto C, asimismo el Objeto C devuelve el control al Objeto B que, a su vez, lo devuelve al Objeto A.
      El control no es devuelto al Objeto A hasta que todos los otros mensajes se han completado.

  3. LOO: METODOS:
    Especifican la misión del objeto, mediante programas de acciones que debe ejecutar y heredar a sus descendientes.
    Son códigos de programas procedurales, asociados a un objeto determinado para desencadenar mediante mensajes.

    Posee propiedades de la forma de invocar al objeto, mediante mensajes y a su campo de acción, limitado al objeto y sus descendientes.

    Pueden adquirirse mediante metodos:
    -| PROPIOS: Incluidos dentro de la cápsula del objeto.
    -| HEREDADOS: Definidos en un objeto diferente, antepasado de éste.

    -| DEMONIOS: Se activa cuando sucede un evento especial.
    Se desencadena automáticamente al ocurrir un suceso determinado, como la asignación de un valor a una propiedad de un objeto, etc.

    Aunque los objetos interactúan entre ellos mediante mensajes, los datos y lógica están ocultos entre objetos.

    La interface encapsula los datos y código de un objeto, asi, puede separarse la implementación y 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.

    Ejemplo: Si el mensaje
    nombre es enviado al objeto Alumno, al usuario no importa cómo el programador implementó el código que maneja este mensaje.

    La tarea del objeto se expresan con procedimientos o funciones que usan los atributos 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.
    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.

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

  4. LOO: SOLUCION DE PROBLEMAS: El método de resolución de problemas con orientación a objetos es muy similar a la forma en que los humanos resuelven los problemas diarios.
    Consiste en la identificación de los objetos y cómo usarlos en una secuencia adecuada para resolver el problema.
    Es decir, resolver un problema con orientación a objetos consiste en el diseño de los objetos cuyo comportamiento resuelva un problema determinado.
    Un mensaje a un objeto causa que realice operaciones que le son propias y que son capaces de resolver, al menos, una parte del problema.

    El método de resolución de problemas con orientación a objetos, en general, puede ser dividido en 4 pasos. Estos son:
    - (1) Identificar el problema,
    - (2) Identificar los objetos necesarios para la solución,
    - (3) Identificar los mensajes a ser enviados a los objetos, y
    - (4) Crear la secuencia necesaria de mensajes, a los objetos, que resuelvan el problema.

    Ejemplo a la solución de un problema utilizando los cuatro pasos.

    Ejemplo 1: Método de Resolución de Problemas con Orientación a Objetos

    Paso 1: Identicación del Problema - Calcule la suma de dos números e imprima el resultado.

    Paso 2: Identificación de los Objetos - Identifique los objetos necesarios para resolver el problema.

    Num1 - primer número (objeto).
    Num2 - segundo número (objeto).
    Suma - resultado de la adición de los dos números (objeto).

    Paso 3: Identificación de los Mensajes - Los mensajes necesarios que se enviarán a los objetos.

    + unNum - Este es el mensaje que se enviará al objeto receptor con un parámetro unNum.
    - El resultado de este mensaje es el valor (un objeto numérico) del total suma del objeto receptor y unNum.

    print - un mensaje que muestra el valor del objeto receptor.

    Paso 4: Secuencias Objeto-Mensaje - La siguiente secuencia Objeto-Mensaje resuelve el problema: (Num1 + Num2)print

    El mensaje + con un parámetro Num2 (un objeto), es enviado al objeto Num1. El resultado de esto es un objeto (Num1 + Num2), al que le es enviado el mensaje print. Se incluyen los paréntesis para evitar cualquier ambigüedad sobre cuál mensaje es activado primero.

    La secuencia de evaluación de Smalltalk es de izquierda a derecha a menos que existan paréntesis ( ). Por ejemplo:

                   2 + 3 * 4               es 20
          y        2 +(3 * 4)              es 14
    

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

    VER PARA CREER..!!

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

    Paradigma ANTECEDENTES

    1. "La Estructura de las Revoluciones Científicas":
      De Thomas Kuhn que cambia el enfoque de la ciencia e impone el actual concepto de paradigma:
      "Modelo que guía las investigaciones en áreas del conocimiento y que son sustituidos
      por otros nuevos mediante verdaderas revoluciones científicas"
      .

      Revisa conceptos de la ciencia, su producción, impacto social, conexiones con la filosofía.

    2. Paradigma de la Simplicidad o Newtoniano:
      Basado en la dinámica de Newton, caracterizada por:
      - Dotado de explicaciones simplistas,
      - Desarrollos de leyes deterministas,
      - Fundamentos en modelos ideales,
      - Usar el método analítico.
      - La búsqueda de unidades fundamentales.
      - Estudio del comportamiento de conjunto, por ensamble de sus partes.

      Sobre estos aspectos se pergenian los grandes paradigmas conceptuales del siglo XX. Así, nace con:

      - DarwinLa Teoría de la Evolución.

      - FourierLa "Entropia" en su "Nueva Ciencia del Calor" y el concepto de "flecha del tiempo".

    3. "Teoría General de Sistemas" :
      • Ludwig Von Bertalanffy:
        Acepta que todo organismo es un sistema que:
        - Actua como un todo.
        - Como "Sistema Abierto" intercambian materia, energía e información con el medio.
        - Tiene conexiones con la "Cinética Química", "Termodinámica de Procesos Irreversibles", fisiología y las ciencias sociales.

        Esta perspectiva transdisciplinaria, no es una disciplina en sí, sino una metadisciplina para desarrollar teorías.

      • Von Neumann y Morgenstern:
        En la "Teoría del Juego" Aplican el postulado aristotélico sobre organismos vivos:
        "El todo es más que las partes", en el comportamiento individual, social, sistemas de comunicación, lenguajes y a todo sistema complejo.

        Asimilan el equilibrio dinámico del enigma biológico del mantenimiento de la estructura corporal, cuyas células se recambian permanentemente y pese a ello somos un organismo más o menos estable.

        Niegan el paradigma newtoniano de simplicidad y analiticidad, para plantear problemas de complejidad e interacción.
        Destacan la naturaleza "Interdisciplinaria", o "Transdisciplinaria", de las teoría de:
        - La Cibernética,
        - Autómatas,
        - La información,
        - Control,
        - Conjuntos,
        - Grafos y redes,
        - Juegos y decisiones,
        - Matemáticas relacionales,
        - Computación, etc.

    4. La CIBERNETICA..!!
      La cibernética es la ciencia creada e impulsada por Norbert Wiener y Arturo Rosenblueth Stearns (1942) para
      - “el control y comunicación en el animal y en la máquina” o
      - “desarrollar un lenguaje y técnicas para abordar el problema del control y la comunicación en general”.
      - Dar gran impulso a la teoría de la información.
      - Impulsar la elaboración de imágenes electrónicas.

      - Ilya Prigogine:
      Propone modelos de estructuras disipativas, con fluctuaciones internas y externas, que a partir de su valor crítico (umbral), generan nuevas estructuras para desarrollar modelos de dinámica de cambio y necesidades de mantenimiento y transformación.

    5. La RECURSIVIDAD y los BUCLES
      Khun y Ian Piaget, Plantean que el sujeto y objeto, no son polos opuestos de una dicotomía, sino que se construyen en el proceso de conocimiento.

      La recursividad carece de linealidad, tiene bucles que usan el proceso de reflexión del conocimiento.
      Así, para conocer el:

      - Cerebro usamos... el cerebro
      - Lenguaje usamos... el lenguaje

    6. El PARADIGMA DE PROGRAMACION
      Según destaca el siguiente mapa conceptual, para el sistemico:
      
                          El PARADIGMA es  
                                 |      
                          MODELO CONCEPTUAL
                                 |
                            que guía un
                                 |
                          PROCESO DE DISEÑO
                                 | 
                           y determina un
                                 |
                         FORMATO DE PROGRAMA         
      

      De manera que el PARADIGMA es:

      - Un modelo de comportamiento computacional para resolver problemas operacionales.

      - Guía operativa del proceso de diseño que determina la forma final de un programa.

      - Procedimiento informático, con algorítmicos de heurísticas para automatizar procesos de digitalización de datos

      Así, este paradigma es la fuerza sinérgica que dinamiza la fascinante sociedad digitalizada, de donde surgen los conceptos de:

      - ALGORITMO:
      Secuencia operativa para lograr un resultado predefinido, capáz de resolver problemas.

      - HEURÍSTICA:
      Acción intelectual desarrollada para generar nuevas creaciones lógicas.

      Que son bases del paradigma del:

      - PODER O HEURISTICO:
      De Von Newmann: Aplicar leyes mentales humanas a la capacidad del computador, para resolver problemas, usando sistemas eficientes de búsqueda de buenas heurísticas.

      - CONOCIMIENTO O EPISTEMOLOGICO:
      Plantea que un problema es solucionable si se comprende integralmente su estructura operativa, proponiendo:

      "Un problema se resuelve según el conocimiento que se tenga de el"

      Todo esto impulsa el desarrollo de la Inteligencia Artificial, planteada como:

      - CIENCIA:
      Que analiza el comportamiento de la teoría de inteligencia que explique el comportamiento natural de los seres inteligentes.

      - TECNOLOGIA:
      Para construir máquinas automáticas, o AUTÓMATAS capaces de resolver problemas, operando de manera similar al de los humanos.

    Los Paradigmas de Programación se agrupan según la subjetividad de criterios que cada autor quiere destacar. Ejemplo:

    1. Clases de paradigmas según: FLOYD
      Para resolver un problema, el paradigma se codifica en lenguaje compatible con él y capaz soportar los mismos conceptos del paradigma.
      Tal compatibilidad que confunde al paradigma y lenguaje de programación, mezcla paradigma con su herramienta de proceso, pero un mismo paradigma puede ser soportado por más de un lenguaje. Por ello, destacamos que:

      Paradigma es concepto o heurística intangible, mientras que lenguaje es su materialización en forma de códigos operacionales.

      Tal confusión llevo, Floyd a clasificar los paradigmas, de acuerdo a la capacidad de expresión, en tres categorías.

      • PARADIGMAS que soportan PROGRAMACION DE BAJO NIVEL:
        Operan como los componentes internos del computador, mediante lenguajes de 2da generación, como BASIC, FORTRAN o COBOL, que emulaban al LENGUAJE ENSAMBLADOR, accediendo a sus componentes del hardware.
        Tales lenguajes no soportaban algoritmos con procedimientos, funciones, variables, ni punteros, listas, pilas, colas o árboles con asignación dinámica de memoria.

      • Paradigmas que soportan DISEÑO DE ALGORITMOS:
        Con lenguajes de 3ra generación manejan procedimientos, funciones, variables y punteros para la asignación dinámica de memoria.

        Con Delphi o C#, o C++, o Basic, etc. puedes generar programas que operan bases de datos sin digitar ni una línea de código.

      • Paradigmas que soportan PROGRAMACION DE ALTO NIVEL:
        Usan lenguajes orientados a objetos, cuyo pionero es PROLOG, superado por la potencia de Delphi o C#.NET, o Basic.NET, o J#.NET, etc.

      PARADIGMA: La computadora puede hacer tantos errores en un segundo . .
      como 100 hombres trabajando un año..!! ( Wilucha )

    2. Clases de paradigmas según: TIPO DE PROGRAMACIÓN
      Pueden asimilarse a los siguientes tipos de PROGRAMACIÓN:

      • BASADO EN REGLAS:
        De aplicación en ingeniería del conocimiento para desarrollar sistemas expertos, con reglas de producción del tipo if then.

      • LÓGICA:
        Entorno de programación conversacional, deductivo, simbólico y no determinista apoyada en asertos y reglas lógicas.

      • FUNCIONAL:
        Entorno de programación interpretativo, funcional y aplicativo, de formato funcional.

      • HEURÍSTICA:
        Aplican heurísticas de visualización, búsqueda y métodos de solución. Pueden ser Programación:
        - Paralela
        - Orientado a Objetos
        - Basado en Restricciones
        - Basado en Flujo de Datos

      PARADIGMA: Mientras más te eleves más pequeño pareceras a los ojos de la envidia
      y nadie tan odiado, como el que vuela..!! (Nietzsche)

    3. Clases de paradigmas según: AMBLER
      De acuerdo al tipo de solución aplicada pueden existir las categorías:
      
      	Solución        =>    Paradigma  
      	 
      	PROCEDIMENTAL    =>   PROCEDIMENTAL
      	 
      	DEMOSTRATIVA     =>   DEMOSTRATIVO
      	 
      	DECLARATIVA      =>   DECLARATIVO
      
      La solución PROCEDIMENTAL U OPERACIONAL: Determina cada etapa para construir la solución y describe cómo obtener un resultado a partir de un estado inicial.
      Usa lenguajes de 1ra a 3ra generación, cuyas variables se relacionan con direcciones de memoria, mediante técnicas:

      • MODIFICADAS: CON EFECTO DE LADO: Actualiza iterando datos y direcciones de memoria de variables, registra múltiples asignaciones hasta lograr el resultado.
        Sus tipos son Paradigma:
        - Imperativo.

        - Orientado a Objetos.

      • NO MODIFICADAS: SIN EFECTO DE LADO: Van creando continuamente nuevos datos.

      Resuelve problemas aplicando PROGRAMACION por EJEMPLO o DEMOSTRATIVA:
      donde el programador resuelve programas similares,
      y generaliza soluciónes, por medio de simulación o por inferencias.

      EJEMPLO:
      Para enseñar a la máquina a dividir, pueden proponerse algunos ejemplos

                              
                     Ejemplo:  2/1 = 2
                     Ejemplo:  2/2 = 1 
          
      La máquina infiere que la división requiere fraccionar el digito anterior a la barra en tantas partes como indica el posterior a dicha barra.
      Ejemplo: Si preguntas: Pregunta: 2/0, las respuestas de la maquina pueden ser:
                              
                      Indefinido: Si se la dota de cierto conocimiento matemático. 
      
                      No se:      Que demostraría el gran sentido común de la máquina
      
                      Dígito 2:    Porque fraccionar algo en ninguna parte, deja a ese algo inalterado.
          

      PARADIGMA: De las cosas que puedes hacer con la computadora . .
      las más inutiles, son las más divertidas..!! ( Wilucha )

    4. Clases de paradigmas según el: EFECTO DE LADO:

      • PARADIGMA IMPERATIVO: Procedimental con efecto de lado, representado por la arquitectura de Von Neumman.

        Algoritmo + Estructura de datos = Programa

      • PARADIGMA FUNCIONAL: Procedimental sin efecto de lado, basado en el modelo matemático de composición de funciones.

        Funciones + Estructura de datos = Programa

      • PARADIGMA LOGICO: Seudo declarativo, basado en conjuntos de hechos y reglas lógicas pre establecidas.

        Lógica + Control de datos = Programa

      • PARADIGMA ORIENTADO A OBJETO: Procedimental con efecto de lado

      • PARADIGMA HEURISTICO: Basado en reglas de buena lógica.

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

    Lenguajes de Programación
    A S P
    Basic
    Builder
    C++ C#
    Delphi
    Fox
    Haskell
    HTML
    Java
    PHP
    Small
    UML

    Paradigmas impresos
    Lenguaje Gramática Autómata Laplace Series Ecuación Operador

    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: