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

Nace un paradigma . .
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é pegan al que intenta subir la escalera, 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 ?

- La respuesta es: Cada acto nuestro, es guiado por un paradigma . . ! !

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


Tal relato y otros antecedentes, indican que PARADIGMA es un:

A - Comportamiento a imitar o seguir: Como describe el experimento con los monos.

B - Modelo ejemplar: En mi caso, mis modelos son . .

Mis Paradigmas

C - Fórmula algoritmica computacional
. . Para el sistémico, cada heurística para procesar datos, es un paradigma.

P a r a d i g m a
Lingüístico
Sistémico
Matemático

D - Modelo para pensar e interpretar soluciones de problemas.
. . Si eres sistémico tu modelo de pensar, estará guiado por este mapa conceptual:


                 PARADIGMA de PROGRAMACIÓN  
                           |      
                    MODELO CONCEPTUAL
                           |
                      que guía un
                           |
                    PROCESO DE DISEÑO
                           | 
                     y determina un
                           |
                   FORMATO DE PROGRAMA         
Así, el "homus digitalis" o morador del mundo globalizado, tiene su fuerza sinérgica, en el paradigma de programación, cuyas clases son:

PARADIGMA de PROGRAMACIÓN
Declarativo Demostrativo Funcional Heurístico
Imperativo Lógico Orientado Objeto Procedimental

PARADIGMA: Si ves un hombre bueno
Ahí tienes un paradigma..!!
Si ves un hombre malo,
comparalo contigo..!!
( Wilucha )

Paradigma Declarativo

Formula las soluciones a los problemas:
Señalando reglas, restricciones, ecuaciones, transformaciones y propiedades de la solución.
- Describiéndo y destacando las características de la solucion.
- No describe cómo construirla, tampoco los pasos necesarios, ni como procesarlas.
Codificando sus programas en lenguajes declarativos:
- A S P (Answer Set Programming)
- Lenguaje HASKELL (Programación funcional)
- Lenguaje LISP (Programación funcional)
- Lenguaje PROLOG (Programación Lógica)

PARADIGMA: Declarado adecuadamente un defecto ..
puede brillar más que una virtud..!!
( Wilucha )

PARADIGMA: Los errores adecuadamente demostrados
pueden llevarnos a conclusiónes correctas
si usamos paradigmas estadísticos ! !
( Wilucha )

Paradigma Demostrativo o por Ejemplos

Formula las soluciones a los problemas:
- Describiendo soluciones de problemas similares.
- Generalizando una solución procedimental a partir de tales descripciones.
- No asegura la eficiencia de la solución encontrada.

PARADIGMA: Más mueven los ejemplos
que las palabras...!! ( Séneca )
  • Paradigma Demostrativo: Caracteristicas

    El algoritmo de la solución es interna y su validez de eficiencia requiere probarse.
    Ejemplo:
    Una maquina generadora de números pares, usa 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 objetos y a partir de ellos generaliza similitudes para resolver los nuevos casos.
    Especifica la solución mediante ejemplos, para que el sistema generalice la solución para otros casos.
    A partir de sus demostraciones, generaliza una o mas soluciones. Para esto, puede:

    1) SIMULAR: La acción operativa que produce una secuencia procedimental.

    2) INFERIR: Las intenciones o inferencias de conocimiento donde:

    - a.- LOS SISTEMAS QUE INFIEREN:
    Determinando la solución, desde similitudes del grupo de datos u objetos, generalizando sus singularidades.

    b.-POR PROGRAMACION ASISTIDA:
    Desde acciones similares o pasadas, pueden inferirse la próxima acción del programa.

    LOS MEJORES RESULTADOS:
    Están en áreas limitadas por el mayor conocimiento semántico del problema.

    DESVENTAJAS:
    No se conoce cuándo el programa funciona correctamente.
    - Pueden producirse programas 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 el proceso.

PARADIGMA: Muchas palabras
no indican mucha sabiduría ..!!!
(Tales de Mileto)

Paradigma Heurístico

Formula las soluciones a los problemas:
- Que tienen múltiples alternativas de solución.
- Agregando conocimiento a los métodos de búsqueda mediante algorítmos inteligentes.
- El conocimiento integral del problema a resolver y de su operatoria.
Aplicando:
- Reglas de buena lógica o heurísticas que detectan acciones optimistas.
- La Inteligencia Artificial, de la Ingeniería del Conocimiento, mediante el:
- - Lenguaje PROLOG.
- - Lenguaje LISP.

PARADIGMA: El talento más valioso ...
es no usar nunca dos palabras
donde una alcanza. ..!!
(Thomas Jefferson)

  • Paradigma Heurístico: Caracteristicas
    Análiza problemas de alternativas múltiple de solución, tales como determinar:
    Mejor:
    - Medio para transportar, desde diversos orígenes hacia diferentes destinos.
    - Postulante para asignarle tareas entre varias posibles.
    - Asignación de n puestos de trabajo de una empresa.
    - Estrategia de poda para minimizar tiempo de proceso de programas.
    Problemas:
    - Que soportan funciones de evaluación heurísticas.
    - Sin solución algorítmica, o alternativas de solución múltiple.
    - No algorítmicos, como juego damas ó ajedrez, de múltiples alternativas de acción.
    ¿Cuál es el mejor camino ? o ¿Cuál es el camino más corto ?

  • Paradigma Heurístico: Programación
    Más que modo de programación, es método de búscar soluciones a problemas computacionales complejos.
    Saber cómo se genera y efectos que produce al minimizar el tiempo de búsqueda.
    Considera información y especificaciones del problema, como:
    - Heurística simple, bajo consumo de memoria, alta velocidad de búsqueda, precisa, robusta.
    - Parada que registra el conocimiento obtenido durante la búsqueda.
    - Especificaciones del problema para generar una o múltiples soluciones.
    - Heurísticas para codificarse con cualquier lenguajes de programación.

    El lenguaje heurístico se caracteriza por:
    Usar heurísticas, como conclusiónes del razonamiento humano y "reglas de buena lógica".
    - Búscar metas a problemas no algorítmicos, o algoritmos que generan explosión combinatoria (Ej: damas, ajedrez)
    - Aproximar soluciones a problemas con funciones de evaluación de tipo heurístico.
    - Podar estrategias de programas.
    - Ser lenguaje conversacional, de interacción con el programador para procesar el problema.
    - Tratamiento simbólico para problemas que precisan tratamiento heurístico y estructura simbólica.
    - Funciones para modelar heurísticas de módulos independientes.
    - Alternativas que no aseguran una solución óptima, solo adecuadas a determinadas circunstancias.

    El algoritmo heurístico usa procedimientos:
    De búsqueda de soluciones óptimas a bajos costos operativos.
    - Sin garantizar la optimización de las soluciones generadas.
    - Sin determinar la distancia a la solución óptima.
    Que dan forma a la configuración del problema mediante:
    - La representación del modelo de su estructura.
    - Estrategias de búsqueda y métodos de resolución.

    Ejemplo 1: Optimizar la provisión de caña de azúcar a ingenios azucareros.
    En este problema, son 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:

    
             Alternativas  Nº Ingenios  Nº Cargaderos
    	       1=1!                1             1 
    	       2=2!                2             2 
    	       6=3!                3             3 
    	      24=4!                4             4 
    	     120=5!                5             5 
    	     720=6!                6             6 
    	
    Tucumán tiene 14 ingenios azucareros, con 14 cargaderos tendríamos factorial de 14.
    Un número muy grande, complejo de evaluar uno a uno. Haría falta algún algoritmo como:
    a|- Recocido simulado
    b|- Búsqueda Tabú
    c|- Algoritmos evolutivos:
    d|- Algoritmos Genéticos
    e|- Programación evolutiva
    f|- Estrategias evolutivas
    g|- Programación genética
    h|- Redes Neuronales Artificiales
    i|- Relajación lagrangiana
    j|- Algoritmos fractales /Alienor-Gabriel

    Ejemplo 2: Se tienen dos jarras de agua, una de 4 lt y otra de 3 lt sin escala de medición.
    Se desea tener 2 lt de agua en la jarra de 4 lt. Las siguientes operaciones son válidas:
    - Llenar las jarras,
    - Tirar agua de las jarras,
    - Pasar agua de una jarra a otra.
    Solución:

    a) 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 }

    b) El estado inicial es (0,0)

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

    d) 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:
    a|- 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 el estado del problema no cambia, la aplicación de la regla se considera inútil

    b|- Las reglas describen 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)
    Tirar agua sin cuantificar, concluye que la aplicación de esta regla no mejora la solución del problema.

    c|- 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)

    Paradigma heurístico: METODOS de BUSQUEDA

    1.- Búsqueda Breadth-First Search (primero en ancho)
    Accede a todos los nodos de un nivel, antes de visitar los del siguiente.
    El pseudo-código de este algoritmo es:

    
    	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; 
    

    Busca a lo ancho, luego de logrado una solución, implica que no existe una ruta con 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, explorando en el paso inmediatamente anterior.

    Pseudo-código de este algoritmo recursivo, 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; 
    

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

Paradigma Imperativo

Formula las soluciones a los problemas:
Aplicando la operativa de la máquina de VON NEWMAN, donde:
- Un programa en memoria, que se ejecuta secuencialmente.
- Efectúa cálculos alimentándose de datos de tal memoria.
- Luego actualiza dicha memoria.
Determina datos para cálculos, asociandolos a variables (direcciones de memoria).
- Efectua paso a paso las transformaciones de tales datos almacenados.
- El resultado buscado es el valor final de la variable.

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

PARADIGMA IMPERATIVO: Algoritmo + Estructura de datos = Programa

  • Paradigma Imperativo: Caracteristicas

    Para los cálculos, usa estructuras de control de flujos de datos:
    - SECUENCIAL:
    Ejecuta una a continuación de otra cada instrucción del programa almacenado en su memoria.

    - SELECCION CONDICIONAL:
    Al cumplirse una condición predefinida, bifurca el flujo de datos, caso contrario, sigue el curso secuencial del programa.

    - SELECCION INCONDICIONAL:
    Bifurca forzadamente la secuencia del flujo de datos, ejecutando una instrucción distinta a la siguiente del orden.

    - ITERACION:
    Itera el flujo de datos controlando la condición de while, do.

    El Algoritmo, contiene datos que se manejan y los pasos para resuelver un problema.
    - Describe el orden en el que se deben ejecutar estos pasos para poder introducirse en el ordenador.
    - Es la estructura que guía las acciones que debe realizar un programa.

    La Celda de memoria: ( variable ):
    Almacena datos en la memoria provista por celdas donde guarda valores de cada variable usada.
    Las celdas tienen nombre (concepto de variable) que las referencian.
    Estos producen efectos de lado y definiciones de alias, que manejan el concepto de celda de memoria.
    Los cálculos intermedios modificaran tales celdas, variables o estructuras de datos del estado actual del problema.
    La celda de memoria, para simplificar se cambió por abstracciones tipo variables, registros, array y otros tipos.
    Con tal fin, opera comandos que actualizan variables del almacenamiento. Usando:
    Instrucciones almacenadas en memoria principal leídas y ejecutadas por la unidad de control.

    Las Asignaciones:
    Cada valor calculado es almacenado o asignado a la celda, de manera de actualizar el valor grabado.
    Segun la arquitectura de la memoria, cada asignacion debe ser registrado en una celda. Con el formato:

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

    REPETICION
    El programa imperativo efectua su tarea iterando secuencias de pasos elementales.
    Realiza su tarea ejecutando repetidamente una secuencia de pasos elementales.
    La única forma de ejecutar algo complejo es repitiendo una secuencia de instrucciones.

  • Paradigma Imperativo: Programacion
    La Programación Imperativa se implementa eficientemente por su relación con arquitectura de máquina.
    Permite la completa manipulación controlada de datos de manera secuencial.
    Sus características son:

    - 1.- El Dato:
    Tiene un "Tipo" que representa sus propiedades.

    2.- Estado de Programa: El cambio del estado
    - Interno del computador es representado por valores de las variables
    - Externo es representado por las entradas y salidas a dispositivos.

    3.- Flujo De Control:
    - Permite control extensivo sobre el orden de ejecución de los enunciados en el programa.
    - Los mecanismos usuales son: secuencia, selección, repetición e invocación de rutinas.

    4.- Composicion de Programas
    - Tiene 4 niveles de jerarquía: bloques, rutinas, paquetes (módulo o tareas) y programas.

    5.- Efectos de Asignación:
    - Cambia el valor almacenado (estado actual) en una dirección (localidad) de memoria del computador.
    - El "estado" y "localidad" vienen 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:
    La memoria almacena el valor del argumento en una variable z: z:=x
    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: Errar es humano, pero para enrredar las cosas en grande
..hace falta una computadora con muchas funciones..!! ( Wilucha )

Paradigma Funcional

Formula las soluciones a los problemas:
Aplicando el modelo matemático funcional. Donde:
Cada función ejecuta las mismas operaciones, como modulo de programa para procesar datos.
- La función es correspondencia entre dos elementos: Origen y Destino.
- Produce un resultado: "valor de la función" que es el nuevo parámetro operable.
- El resultado es entrada del siguiente y así sucesivamente hasta producir el valor deseado.

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

PARADIGMA FUNCIONAL: Funciones + Estructura de datos = Programa

  • Paradigma Funcional: Caracteristicas

    El parámetro calculado y devuelto como valor para calcular otros datos, cumple que:
    a) La función puede tener varios argumentos, incluyendo cero, pero siempre devuelve un valor único.
    b) La definición de función proporciona:
    - - b.1- Un parámetro formal o un nombre y
    - - b.2- La llamada a la función proporciona un argumento real o un valor.
    c) En lugar de secuencias de eventos, existe composición de funciones.

    Existen valores intermedios de cálculos anteriores y entradas a siguientes cálculos.
    La celda de memoria refiere a la lista sucesivamente modificada, por cálculos previos, hasta generar un resultado.
    No existe la celda de memoria asignada o modificada. Ej: 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 ] ) )
    

  • Programación Funcional
    Está basado en la evaluación de funciones matemáticas, para:
    - Aplicar ciertas operaciones sobre algunos valores o argumentos.
    - Obtener un resultado o valor de la función para tales argumentos.
    - Estos argumentos y el resultado, son constantes numéricas. Ejemplo:

    Para: f(x) = x2 + x, con el argumento constante entera 2:
    La función f de potencia cuadrada, y de suma, genera: f(2) = 22 + 2 = 6 como valor de la función.

    Un argumento y resultado la función, pueden ser otra función. O incluso la misma, por recursividad.

    La programació funcional opera como modelo de computación "cálculo lambda", que:
    a) Define función(es) de un solo argumento y con cuerpo específico, con la terminología: lx.B, donde:
    - a.1) x : Define el parámetro o argumento formal.
    - a.2) B : Representa el cuerpo de la función. Por tanto: f(x) = B.

    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.
    Se encontro su valor cuando ya no es posible reducir la función.
    Tendrá la consistencia de regresar el mismo valor para los mismos argumentos.

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

Paradigma Lógico

Formula las soluciones a los problemas:
Aplicando reglas de deducción y a partir de ellas genera conclusiones aceptadas como validas.
Usando lógica de predicados o aserciones lógicas que son el conocimiento sobre el problema.
Selecciona reglas que permitan:
- Generar reglas base para deducir las metas desde hechos conocidos.
- Métodos de seleccion, como: "búscar 1ro en profundidad" ( BackTracking ). El cual:
- Para elegir una regla, selecciona la 1ra que encuentra.
- - Si conduce a un punto muerto, selecciona la 2da.
- - Así hasta que hayan sido probadas todas las alternativas.
Codificables enLenguaje PROLOG

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

PARADIGMA LOGICO: Lógica + Control de datos = Programa

  • Paradigma Lógico: Caracteristicas

    • Especifica hechos y propiedades: del problema y es el sistema quién busca la solución, usando:
      - Hechos o asertos y reglas para representar la información.
      - Deducciones que generen nuevos hechos, partiendo de componentes lógicos y secuencias de control del sistema.
      - Automatiza así la corrección del programa.
      - Verificación de transformaciones, evaluadas partiendo de metas.
      - Pruebas que se ajustan a hechos o deducen de alguna regla, sus antecedentes se convierten en nuevas metas.
      - No describe como debe resolverse el problema.

    • Resuelve problemas: planteados en términos de reglas lógicas:
      - La lógica de solución de problemas es una modelización a través de un conjunto de fórmulas.
      - Hay al menos una interpretación que es modelo de dichas fórmulas y que es la especificación del problema.
      - Asume la definición de asertos o hechos (Ej: Pity es padre) y reglas para deducir nuevos hechos
      Ej: para todo y, Si y es padre, y es masculino; luego se deduce que Pity es masculino.

    • La evaluación: empieza definiéndo una meta y probando que se ajusta a un hecho o deduce de alguna regla.
      - Tal meta se deduce de una regla si todos sus antecedentes verifican con la transformación existente.
      - Tales antecedentes seran nuevas metas que deben equipararse con hechos o resolverse vía otras reglas.
      - El proceso termina cuando todas las sub_metas han sido probadas.
      - La solución final resulta de aplicar los resultados intermedios obtenidos a las variables de la meta inicial.

    • El paradigma lógico, es usado: En aplicaciones vinculados con:
      Inteligencia Artificial: Sistemas informáticos que simulan el funcionamiento del pensamiento humano.
      Sistema Experto: Imita el comportamiento de un experto humano. Mediante:
      - "Base de Conocimiento": Base de datos con información de estructura lógica.
      - Herramienta para comprender las preguntas.
      - "Motor de Inferencias": Para encontrar la respuesta correcta examinando la base de datos.
      Procesamiento de Lenguaje Natural: En el lenguaje humano:
      - Trata de dividir el lenguaje en partes.
      - Relaciona y trata de comprender su significado.

      La estructura del paradigma lógico: Contiene:

      1.- TERMINOS:
      - Variables (A, B, X),
      - Constantes (Cayo, 2, Moto) y
      - Funciones cuyos argumentos son términos (f(x), padre(Cayo)).

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

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

      Robert Kowalski crea este paradigma, sobre estas cláusulas, como subconjunto de la Lógica de Predicados de 1er orden.
      - Casado( x, y )
      - SI esposo( y , x ) o
      - esposa( x , y )

      4.- UNIFICACION DE PREDICADOS:
      Los símbolos de predicados deben ser iguales y con el mismo número de argumentos.
      Si no, termina en error: Por cada término de ambos predicados puede suceder:
      - Si un término es variable y el otro es cualquier término sin 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.

      5.- ENCADENAMIENTO DE REGLAS
      Parte de una lista L de objetivos O1 O2 ... On . . .
      1 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 sustituciones necesarias;
      - Si no se puede unificar Ë la rama termina en fracaso.

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

      - 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

      6.- ASERTOS o PROPOSICIONES
      O hechos de reglas lógicas establecidas apriori que generen conclusiones para 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.

      Para evaluar se define una meta, luego se prueba si 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 resolver por otras reglas.
      El proceso:
      - Termina cuando todas las sub-metas han sido probadas.
      - La solución final aplica a las variables de la meta inicial, los resultados intermedios obtenidos.

      7.- MECANISMOS de BUSQUEDA de REGLAS
      Para seleccionar reglas, se requiere:
      - Buscar en profundidad con un algoritmo de BackTracking ó método de resolución.
      - Cuando requiere elegir una regla, selecciona la 1ra que encuentra.
      - Si la regla elegida conduce a un punto muerto, selecciona la 2da.
      - Así hasta que hayan sido probadas todas las alternativas.

      El Paradigma Lógico crea reglas, mediante:
      - 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.
      - Genera conclusiones a partir de preguntas o cuestiones lógicas.
      - Tales hechos o asertos y reglas permiten deducir nuevos hechos. Por ejemplo:

      Lógica + Control + Estructuras de datos = Programa

      Donde :
      LOGICA: Constituida por
      HECHOS: Establecen relaciones entre objetos. Ejemplo:

      
                  Chita es amiga de Tarzan
                     OBJETOS: Chita y Tarzan
                     RELACION: amiga
          
      REGLAS LOGICAS: Expresan que un hecho depende 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: Mediante estrategias para investigar las cuestiones lógicas.
      Ejemplo:
      estrategia de búsqueda “ primero en profundidad”

      ESTRUCTURA DE DATOS: Son los elementos de la base de conocimiento y cuestiones lógicas.
      Ejemplo: variables, listas, constantes, etc.

  • Paradigma Lógico: Programación
    El Lenguaje PROLOG:
    Es nativo y es capaz 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 lógica, infiere consecuencias.

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

Paradigma Procedimental

Formula las soluciones a los problemas:
Mediante llamadas a secuencias de instrucciones o "Procedimientos", los cuales:
- Pueden llamarse repetidamente en el programa, reduciendo su código y complejidad.
- El programa principal en cada llamada, les pasa los datos individuales.
- Tales datos procesados al finalizar el programa, definen el resultado final. Donde:
- - Se prueba su calidad con técnicas de depuración y verificación.
- - Si un procedimiento es correcto, produce resultados correctos.
- - Caso contrario se búscan los errores para repararlos.

PARADIGMA: Inteligente no es el que dice lo que piensa,
..es el que piensa lo que dice..!! ( Anonimo )

  • Paradigma Procedimental: Caracteristicas

    PROCESAMIENTO: Pueden procesarse:
    a) En Serie o
    b) En Paralelo. Este ultimo:
    - - b 1- Asincronico (cooperación de procesos paralelos) o
    - - b 2- Sincrónico (proceso simples aplicados simultáneamente a muchos objetos).
    c) Segun la forma de procesar datos, se clasifican en 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:
      - ORIENTADO a OBJETO.
      - IMPERATIVO.

    • GENERA CONTINUAMENTE NUEVOS DATOS (sin efectos laterales).
      Los paradigmas sin efectos laterales incluyen al PARADIGMA:

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

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

      - 3 ) 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 Procedimental: Programacion

    Ejemplo en lenguaje C:
    Con la estructura simple "pila" de datos con FILO (First-In/Last-Out):
    - En el tope de la pila, se:
    - Adicionan usando una función mete()
    - 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 */. 
    

PARADIGMA: En los ojos del joven arde la llama.
En los ojos del viejo brilla la luz. ( Víctor Hugo)

POO: Paradigma Orientado a Objetos

Formula las soluciones a los problemas:
Con el 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.
Codificables en Lenguajes Orientado a Objetos, como:
- Builder
- C++ y C#
- Delphi
- Java
- Visual Basic
- Visual Fox

PARADIGMA: Se conoce el corazón del hombre por lo que hace
..y su sabiduría, por lo que dice...!! (Taleb)

La filosofía del POO propone soluciones a típicos problemas de la programación, como la:
- Falta de portabilidad y 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 "OO": Orientación a Objetos" abarca un conjunto de tecnologías de software:
- 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.

  • Paradigma Orientado a Objetos: Caracteristicas
    Provee 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.

    La filosofía del POO destaca los siguientes elementos:

    1.- POO: C L A S E S:
    La clase que es:
    - Un tipo predefinido de estructura de datos intangible.
    - Abstracción del objeto.
    - Plano de características para construir objetos, con detalles comunes.

    Ejemplo 1: 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.

    Ejemplo 2: El plano de la casa es la clase, mientras que objeto es la propia casa, construida en base de tal plano.

    SUBCLASE:
    Es la extensibilidad que permite generar una clase, a partir de otra ya existente.
    Ambas, tienen aspectos similares y partes propias que define su propia estructura particular.

    2.- POO: 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 del 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 ente tangible operable que interactua con métodos del programa para obtener la solución del problema.
    - 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.
    - El método de instancia del objeto 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.
    - La encapsulación asegura que para obtener los datos de un objeto sea seguro.
    - La variable1 hasta variableX se acceden 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 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".

    Nombres de variables pueden ser idénticos a nombres de métodos 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 puede contener información (argumento) que los objetos necesitan pasar al objeto receptor.
    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.

    Resolver un problema utilizando objetos requiere:
    - Identificar los objetos y cómo usarlos en una secuencia adecuada para resolver el problema.
    - Es el diseño de los objetos cuyo comportamiento resuelva un problema determinado.
    - Un mensaje al objeto genera operaciones capaces de resolver, al menos, una parte del problema.

    La resolución de problemas, puede insumir 4 pasos:
    - (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:
    - 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 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 ( ). Ejemplo:

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

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

    • POO 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 por una interface de objeto:
      - Que permite al 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).
      Esta propiedad:
      - Destaca las características esenciales del objeto, distinguiéndola de otros tipos de objetos
      - El Diseño OO consiste en componer niveles y conjuntos adecuados de abstracciones.
      - Una correcta abstracción genera la amigabilidad del sistema.

    • POO Objetos: ENCAPSULACION
      Forma en que atributos, y métodos se "ocultan" dentro de la estructura del objeto, con apariencia no visibles desde el exterior.
      Propiedad de ocultación de la información que integrada en una unidad o cápsula, datos y programas relacionados entre sí.
      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 si:
      -| La clase tiene variables interdependientes; si se manipula esas variables directamente la clase puede funcionar mal.
      -| Las variables estan ocultas, los métodos son la única posibilidad para cambiar los valores de sus variables.
      -| 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.
      -| La variable es directamente manipulada, sin intervención de métodos de la clase, las posibilidades para comprobar son inmanejable.

    • LOO Objetos: MODULARIDAD y JERARQUIA
      La MODULARIDAD es la característica que hace factible la simplificación de la complejidad inherente al sistema.
      Descompone al sistema en módulos operativos, cohesivos y casi independientes o débilmente acoplados, diseñados para ejecutar una tarea.

      La JERARQUIA, permite clasificar u ordenar para simplificar la comprensión del conjunto de abstracciones.
      Existen dos tipos de jerarquías:

      1) Jerarquía de clases:
      Cuya semántica es "es un": que puede ser de herencia.
      - Simple: Define una relación entre clases, donde una clase comparte la estructura de comportamiento definida en otra clase antecesora.
      - 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
      - Las subclases especializan el comportamiento o estructura de sus superclases.

      2) 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
      - La existencia de cada parte es independiente de la existencia del todo.
      - Si eliminamos el todo, no necesariamente desaparecen sus partes
      - La ausencia de una de sus partes no implica la ausencia del todo.

    • POO Objetos: 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.
      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
      Ejemplo: Un mensaje "+": a un objeto
      - Entero producirá una suma de dígitos
      - Cadena, generaría una concatenación.

      Una analogía para 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.

    • POO Objetos: HERENCIA y COMPOSICÍON

      La HERENCIA permite a una clase tener el mismo comportamiento que otra y extender o limitar ese comportamiento de la acción a una necesidad.
      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.

      Por su parte la Composición es incluir tipos de objetos definidos por el usuario como partes de otros tipos de objetos.
      Producien un efecto inverso a la herencia.

      La composición es una 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.

    • POO Objetos: TIPIFICACION, PERSISTENCIA, REUTILIZACION y RELACION
      La TIPIFICACIÓN, permite que objetos de distinto tipo pueden intercambiarse bajo grandes restricciones.
      Cada tipo es caracterización exacta de las propiedades estructurales de una serie de entidades.
      Ejemplo: Los objetos impresora y mouse, enchufados en conectores de distinto tipo, no funcionaran regularmente.

      La PERSISTENCIA, es la característica del objeto que conserva su estado a través del tiempo y el espacio.

      La REUTILIZACIÓN , 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 diferente, se resuelve cambiando el protocolo del objeto-mensaje ya existente. Donde:
      - - Se requiere agregar nuevos mensajes.
      - - Puede agregarse nuevos objetos y mensajes a los que responden los nuevos objetos.

      Con la RELACION, se inserta dinámicamente un objeto al programa usando punteros a otros objetos, como enlaces a tros componentes.
      Existen dos tipos de RELACIONES:

      1) JERARQUICAS:
      Son 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, pero puede existir un hijo con varios padres.

      2) SEMANTICAS:
      Sin vínculo con la organización de los objetos que las establecen.
      Sus propiedades y consecuencia dependen del significado y no de su posición en la organización.

      Ejemplo: Un diccionario informatizado para obtener la definición de una palabra cualquiera.
      - Las palabras son objetos y
      - La jerárquia proviene de la estructura de conocimientos. 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.
      	 

    • POO Objetos: PROPIEDADES, CONDICIONES, ESTRUCTURA y ORGANIZACION
      Las PROPIEDADES 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 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.

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

      Las CONDICIONES especifican que:
      - 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.

      Por la ESTRUCTURA el objeto es instancia de una clase que tiene estado, identidad y 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.

      Por la ORGANIZACIÓN existen jerarquías de ciertos objetos superiores 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.

      - - 1: LA RAÍZ DE LA JERARQUÍA:
      Objeto único y especial, ubicado en el nivel más alto de la estructura.
      Suele denominarse Raíz o Entidad u Objeto madre,.

      - - 2: INTERMEDIOS:
      Ubicados después de la raíz, tienen descendientes y constituyen conjuntos o clases de objetos.
      Pueden ser generales o especializados, según la aplicación.

      Sus nombres genéricos denotan al conjunto que representan. Ej: contenedor, buscador, etc.

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

    PARADIGMA: La ignorancia afirma o niega
    La ciencia duda..!! (Voltaire)

  • Paradigma Orientado a Objetos: Programación

    LOO: Lenguaje Orientada a Objetos

    En la Operación Secuencial, el Mensaje o Evento, comunica requerimientos entre objetos para concretar una acción.
    Tal mensaje provoca el envío de otros mensajes, ya sea al mismo u otros objetos, para completar su tarea.
    El control no se devuelve al objeto emisor original hasta que 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.

    El METODO, especifica la misión del objeto, mediante programas de acciones a ejecutar y heredar a sus descendientes.
    Son códigos de programas procedurales, asociados a un objeto determinado para desencadenar mediante mensajes.
    Invocar al objeto, mediante mensajes y a su campo de acción, limitado al objeto y sus descendientes.

    Los métodos 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 nombre, nombre:, direccion y nombre:direccion: son nombres de métodos para el objeto Alumno.
    El objeto Alumno recibe mensaje nombre, este pasa el control al método nombre definido en Alumno.

    - Métodos que operan sobre objetos son métodos de instancias
    - Mensajes que invocan métodos de instancia se llaman mensajes de instancia.
    - Métodos que operan sobre clases de objetos específicas son los métodos de clase.

    VER PARA CREER..!!

    -| EJEMPLO 1:
    Definir una clase: Incrustar objetos, cuyos métodos son activados por eventos.

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

    -| EJEMPLO 2:
    Estructura del objeto y su encapsulamiento:

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

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

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

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

Paradigma funcional: LENGUAJE LISP

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

Creado por John McCarthy (ITM), es lenguaje de programación de alto nivel para la inteligencia artificial (AI).
Cambió hasta sus versiones: Common Lisp y Scheme.

LISP "LISt Processing": Se caracterizan por:
- Ser lenguaje de programación tipo multiparadigma con sintaxis entre paréntesis.
- Tener listas encadenadas entre paréntesis como estructuras de datos.
- Poseer intercambiabilidad del código y datos.
- Llamar la función con el nombre de operador y argumentos. Ej: Función f de 3 argumentos: (f x y z).
- Sus funciones primitivas predefinidas para tratar listas son:.


	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

Desarrollado por Haskell Curry operara parámetros de funciones y calcula resultados: Haskell posee:
- 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.

El entorno HUGS:
funciona como calculadora interactiva entre el ordenador y usuario. Donde
- 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,
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.
- Para evaluar tomar una expresión que transforma mediante funciones, hasta que no pueda transformarse más.
- La expresión resultante se denomina representación canónica y es mostrada al usuario.
- El proceso de evaluación puede seguir diversas trayectorias: Ejemplo:

    cuadrado (3+4)
    =               { evaluando la suma }
    cuadrado 7

    =               { utilizando la definición cuadrado x = x * x }
     7 * 7

   =                { evaluando la multiplicación }
            49
Este ejemplo evaluó expresiones internas antes de la aplicación de la función.
Argumentos antes de llamar por valor la función y se asocia con la evaluación ansiosa.

Otra posibilidad es usar la definición de función antes de evaluar 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

  1. 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)
      Se conoce las funciones que están definidas en los ficheros especificados.

    • also fichero(s)
      Permite añadir definiciones de otros ficheros, sin eliminar las definiciones existentes.

    • edit fichero ´
      Crea o modifica un fichero.
      Sin nombre, edit usa el ultimo fichero que se ha recuperado.
      Al salir del procesador de textos, se carga otra vez.
      Ejemplo, si se hicieron cambios en otra ‘ventana’).

    • type expresion
      Se determina el tipo de la expresion dada.

    • set ±letra
      Se pueden aplicar o eliminar algunas opciones.
      Activa/desactiva número de reducciones y la memoria usada.

      Con :set -s deja de hacerlo. Con :set +s da otra vez esta información.
      Las opciones son: s, t, g en i:
      - s: Información estadística (reducciones y memoria).
      - t: Tipo de cada resultado de una computación.
      - g: Informe sobre Garbage collection.
      - i: Constantes de enteros se manejan de forma especial.

  2. HASKELL: FUNCIONES y OPERADORES
    Las palabras reservadas:
    
       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>   
    

    - Signo ? Indica que el interprete esta listo para calcular 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).
    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.

    Nombres de funciones y parámetros empiezan en minúscula.
    (minúsculas y mayúsculas son diferentes para el interprete).
    Luego pueden seguir 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: a->b es función con argumento tipo a y devuelve un valor de tipo b.

    La función Haskell es objeto de 1ra clase
    Puede ser argumento de otra función 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 que 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 en orden inverso.
      - sort : Ordena los elementos de menor a mayor.

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

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

    Información de tipo
    Además se puede incluir información de tipo con una expresión:

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

    Por Ej.: cuadrado:: Int -> Int

    Dice 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 tipos predefinidos de Haskell son:
    I - Tipos básicos, cuyos valores se toman como primitivos.
    II - Tipos compuestos.

    I.- TIPOS BÁSICOS DE DATOS
    Deben escribirse con mayúsculas:
    - Int [Int]
    - Float [Float]
    - Bool [Bool]
    - Char [Char]

    I.a - ENTEROS
    Tipo "Int": Incluyen enteros positivos y negativos, como: -273, el 0 ó el 383.

    El rango de los enteros utilizables está restringido.
    Puede usar el tipo Integer: Enteros sin límites superior ni inferior.

    prelude Incluye operadores y funciones que manipulan enteros:
    - (+): Suma,
    - (*): Multiplicación,
    - (-): Substracción,
    - (^): Potenciación, etc.

    I.b - FLOTANTES
    Float: Representa fraccionarios o cantidades muy largas o muy pequeñas.
    Un valor numérico es un flotante si:
    - Incluye un punto en su representación
    - Cuando es demasiado grande para ser representado por un entero.

    Notación científica: Ejemplo 1.0e3 equivale a 1000.0, mientras que 5.0e-2 equivale a 0.05.

    Prelude: Incluye para flotantes: pi, exp, log, sqrt, sin, cos, tan, asin, acos, atan, etc.

    I.c - CARACTERES
    Char: Representa caracteres individuales. 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.
    

    II.- TIPOS COMPUESTOS:
    Se construyen utilizando otros tipos, por ejemplo, listas, funciones y tuplas.

  4. HASKELL: LISTAS
    [a] representa el tipo de listas cuyos elementos son valores de tipo a.

    Puede escribirse como, Lista:
    -| Vacía: mediante [].

    -| No vacías:
    - - Enunciando explícitamente sus elementos (por ejemplo, [1,3,10]) o
    - - Poniendo un elemento al principio de otra lista con el operador (:).

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

    (:) Es asociativo a la derecha, así: 1:3:10:[] equivale a (1:(3:(10:[])))

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

    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

  5. HASKELL: CADENAS
    Las cadenas son:
    - Secuencias de caracteres encerradas entre comillas dobles.
    - Lista de caracteres y el tipo String es abreviación de [Char].

    Los códigos de escape pueden utilizarse para cadenas. Ejemplo:

    
        Prelude>"hola" 
        
        hola
    

    Prelude para listas pueden utilizarse con cadenas.
    Ejemplo:

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

  6. 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 ().

  7. 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.
    - La propia función definida en su definición (definición recursiva). Ejemplo: f x = f x

    La funciones recursiva tienen sentido si:
    1 - El parámetro de la llamada recursiva es mas simple.
    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)
    

    Si n==0 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 es usando patrones:

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

    Usar patrones tiene relación con la tradición matemática del usar inducción.
    Ejemplo:
    Definición matemática de función potencia es usada directamente como función

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

    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
    

    La versión recursiva de suma necesita funciones head y tail para distinguir las diferentes partes en lista.

  8. 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> es un argumento de función, denominado 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)
        

  9. HASKELL: FUNCIONES DE ORDEN SUPERIOR SOBRE LISTAS:
    Las funciones pueden ser más flexibles utilizando funciones como parámetros. Ej: map, filter y foldr

    a) 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]      
    

    b) 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]
    

    c) foldr:
    ‘pliega’ la lista al valor colocando un operador, 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.

    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 Lógico: LENGUAJE PROLOG

Prolog consta de los siguientes elementos:

A.- PROLOG: ESTRUCTURAS DE DATOS:
Prolog consta de dos tipos de elementos:
- 1) Hechos y Reglas: Opera predicados, constantes, variables.
- 2) Los tipos de datos básicos, son: Atomos, Números y Cadenas de caracteres.

1).- HECHOS (Sentencias):
Son relaciones entre los objetos del sistema. Su formato es:
- - nombre-de-predicado(constante...)
- Ejemplo: La relación o el hecho que Cayo y Pity son hermanos se expresa: Hermano (Cayo, Pity).

2).- REGLAS:
Sentencias de relación entre hechos, del tipo p®q, con el formato:
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).

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

B.- PROLOG: OPERADORES:
Son reglas de operadores relacionales y aritméticos básicos, donde:

"is", es operador de asignación o relacional igual. Ejemplo:

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.

C.- PROLOG: VARIABLES:
Define reglas validas dentro de regla donde aparecen.
- No existen variables globales.
- Comienzan con una letra mayúscula. Ejemplo: Pity
- La variable anónima, identificada con guión bajo ("_"), almacena valores temporales.

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

D.- PROLOG: RECURSIVIDAD:
Itera sobre las cláusulas y está basado en el concepto matemático de inducción planteado como Forma:

Procedural:
Parte de un caso genérico hasta la cláusula de corte de recursividad (prueba que un hecho o regla se cumple n veces).

Declarativa:
Desde el caso inicial (P0), inferimos el caso general (Pn) y vemos que 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)

Como PROLOG no tiene funciones:
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 de la base de conocimientos como verdadera o falsa).
- Una función de paradigma agrega un argumento más, que será el valor "devuelto" por el predicado.
- Como no se puede usar N = N -1, se:
- - Usan variables temporales (N1 = N - 1) y
- - Pasan como argumentos a sucesivas llamadas recursivas.
Ejemplo: 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 permite 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".

E.- PROLOG: LISTAS:
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])?

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

Paradigma ANTECEDENTES

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

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

De estos aspectos surgen los grandes paradigmas conceptuales del siglo XX. Así, nace con:

- Darwin: La Teoría de la Evolución.

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

C.- "Teoría General de Sistemas" :

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

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

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

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

F.- 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 3 categorías.

    1) 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,
    - Emulaban al LENGUAJE ENSAMBLADOR, accediendo a sus componentes del hardware.
    - No soportaban algoritmos con procedimientos, funciones, variables, ni punteros, listas, pilas, colas o árboles con asignación dinámica de memoria.

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

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

  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

  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.

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

Estructura de las Revoluciones Científicas

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    - Obviamente, Kuhn no está hablando de la lógica del descubrimiento científico sino más bien de la psico-sociología de la ciencia.
    Pero Kuhn y Popper coinciden en pasar por alto los mecanismos de generación de las hipótesis aunque el primero las atribuye a la intuición estimulada por la acumulación progresiva de anomalías y el segundo nada más a la intuición

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    LENGUAJES DE PROGRAMACIÓN:
    A S P
    Basic
    Builder
    C++ C#
    Delphi
    Fox
    Haskell
    HTML
    Java
    PHP
    Small
    UML

    PARADIGMA
    Hay hombres que de su ciencia
    tienen la cabeza llena
    Hay sabios de todas mentas
    Mas digo sin ser muy ducho
    Que es mejor que aprender mucho
    El aprender cosas buenas..!!
    José Hernández

    PARADIGMAS IMPRESOS:
    Lenguajes Gramáticas Autómatas Series
    Laplace Ecuación Operador Compilador

    PARADIGMA
    Cultivo una rosa blanca
    ..en julio, como en enero
    para el amigo sincero
    que me da su mano franca..!!

    Y para el cruel que me arranca
    el corazón con que vivo,
    cardo ni ortiga cultivo;
    ..cultivo una rosa blanca..!

    José Martí

    Te espero en: wilocarpio@gmail.com

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

    11/11/2014

    Volver al principio

    Password: