PROGRAMACIÓN LÓGICA

18

description

programacion

Transcript of PROGRAMACIÓN LÓGICA

Page 1: PROGRAMACIÓN LÓGICA

Ing. sistemas computacionales

Materia: Programación Lógica y Funcional

INVESTIGACIÓN

Elaborado por:Karla Barrios Alejo

PROFESOR:Horacio Escobar Rodríguez

Grupo: M4

Horario: de 11:00 a.m. a 12:00 p.m.

INSTITUTO TECNOLOGICO DE CHILPANCINGO

Page 2: PROGRAMACIÓN LÓGICA

PROGRAMACIÓN LÓGICA

La programación lógica es un tipo de paradigmas de programación dentro del paradigma de programación declarativa. El resto de los subparadigmas de programación dentro de la programación declarativa son: programación funcional, programación con restricciones, programas DSL (de dominio específico) e híbridos. La programación funcional se basa en el concepto de función (que no es más que una evolución de los predicados), de corte más matemático. La programación lógica gira en torno al concepto de predicado, o relación entre elementos.

La programación lógica encuentra su hábitat natural en aplicaciones de

inteligencia artificial o relacionada: Sistemas expertos, donde un sistema de

información imita las recomendaciones de un experto sobre algún dominio de

conocimiento.

Demostración automática de teoremas, donde un programa genera nuevos

teoremas sobre una teoría existente.

Reconocimiento de lenguaje natural, donde un programa es capaz de

comprender (con limitaciones) la información contenida en una expresión

lingüística humana.

Etc.

La programación lógica también se utiliza en aplicaciones más "mundanas" pero

de manera muy limitada, ya que la programación tradicional es más adecuada a

tareas de propósito general.

La programación lógica permite formalizar hechos del mundo real, por ejemplo:

las aves vuelan los pingüinos no vuelan "pichurri" es un ave "sandokan" es un perro "alegría" es un ave

y también reglas o restricciones:

una mascota vuela si es un ave y no es un pingüino

Page 3: PROGRAMACIÓN LÓGICA

Ante dicho "programa" es posible establecer hipótesis que no son más que preguntas o incógnitas, por ejemplo:

¿ "pichurri" vuela ? ¿ qué mascotas vuelan ?....

Gracias a que la lógica de primer orden es computable, el ordenador será capaz de verificar la hipótesis, es decir, responder a las incógnitas:

Es cierto que "pichurri" vuela. "pichurri" y "alegría" vuelan.

Obsérvese que el programa lógico no solamente es capaz de responder si una determinada hipótesis es verdadera o falsa. También es capaz de determinar qué valores de la incógnita hacen cierta la hipótesis.

El lenguaje de programación lógica por excelencia es Prolog, que cuenta con diversas variantes. La más importante es la programación lógica con restricciones, que posibilita la resolución de ecuaciones lineales además de la demostración de hipótesis.

PROGRAMACIÓN PARALELA

La programación paralela es el uso de varios procesadores trabajando en conjunto para dar solución a una tarea en común, lo que hacen es que se dividen el trabajo y cada procesador hace una porción del problema al poder intercambiar datos por una red de interconexión o a través de memoria.

La programación paralela permite resolver problemas que no caben en un solo procesador y que no se resuelven en un tiempo razonable, se pueden ejecutar problemas con mayor complejidad más rápidamente.

El rendimiento de las computadoras tradicionales secuenciales está saturándose porque las aplicaciones de hoy en día necesitan realizar trabajo más complejo, por lo cual la solución es tener varios procesadores en sistemas paralelos, al así obtener ganancia de eficiencia siempre y cuando los algoritmos se diseñen adecuadamente.

Lenguajes para computadoras paralelos son flexibles para permitir una implementación eficiente y ser aún más fáciles para programar.

Page 4: PROGRAMACIÓN LÓGICA

Dos técnicas básicas:

Pipeline:

Un pipeline es un conjunto de elementos procesadores de datos conectados en serie, en el cual la salida de un elemento está conectada en la entrada del que sigue. Los elementos de esta técnica son ejecutados en paralelo, debe haber un tipo buffer insertando los elementos.

Aplicaciones de pipelines, consiste en múltiples procesos que están ordenados de tal forma que el flujo de salida de un proceso se alimenta de la entrada del siguiente proceso. 

Replicación asincrónica 

Tecnología en la que una vez que los datos están escritos en el sitio de almacenamiento primario, los nuevos datos a este sitio son aceptados, sin tener que esperar que el sitio de almacenamiento secundario o remoto termine su escritura.Espero que mi explicación les sirva, si tienen algún comentario acerca de esta entrada, espero me digan ya que estoy abierto a cualquier error.

PROGRAMACIÓN DISTRIBUIDA

La programación distribuida es un paradigma de programación enfocado en desarrollar sistemas distribuidos, abiertos, escalables, transparentes y tolerantes a fallos. Este paradigma es el resultado natural del uso de las computadoras y las redes.

Page 5: PROGRAMACIÓN LÓGICA

Casi cualquier lenguaje de programación que tenga acceso al máximo al hardware del sistema puede manejar la programación distribuida, considerando una buena cantidad de tiempo y código.

La programación distribuida típicamente cae en alguna de las varias arquitecturas básicas o arquitecturas: cliente-servidor, 3-tier, n-tier, objetos distribuidos, entre otras además de ser base para la pragmatisidad. Los lenguajes específicamente diseñados para programación distribuida son: Ada, Alef, E, Erlang, Limbo y Oz.

Multicomputadoras

Características generales y tipos:

Son un tipo especial de sistemas con múltiples procesadores. Las características que les distinguen son:

1. La memoria es privada (es decir, cada procesador tiene un mapa de direcciones propio que no es accesible directamente a los demás).  

2. La comunicación entre procesadores es por paso de mensajes a través de una red de interconexión.

En un multicomputadora, cada nodo es una computadora clásica.  

Los nodos colaboran para resolver juntos un mismo problema (ejecutar la misma aplicación). 

La compartición de datos es explícita, ya que el acceso a datos comunes es por paso de mensajes

.

Multicomputadoras con base en buses

Cada CPU tiene conexión directa con su propia memoria local. El único problema restante es la forma en que los CPU se comunicarán entre sí. Es claro que aquí también se necesita cierto esquema de interconexión, pero como sólo es para la comunicación entre un CPU y otro, el volumen del tráfico será de varios órdenes menores en relación con el uso de una red de interconexión para el tráfico CPU-memoria.

Multicomputadoras con conmutador

Se han propuesto y construido varias redes de interconexión, pero todas tienen la propiedad de que cada CPU tiene acceso directo y exclusivo a su propia memoria particular. Hay dos topologías populares, una retícula y un hipercubo. Las retículas se basan en las tarjetas de circuitos impresos. Se adecuan mejor a los problemas con naturaleza bidimensional inherente, como la teoría de gráficas o la visión. Un hipercubo es un cubo n-dimensional. Se puede pensar como dos cubos ordinarios, cada uno de los cuales cuenta con 8 vértices y 12 aristas. Cada vértice es un

Page 6: PROGRAMACIÓN LÓGICA

CPU. Cada arista es una conexión entre dos CPU. Se conectan los vértices correspondientes de cada uno de los cubos.

PROGRAMACIÓN LÓGICA INDUCTIVA

Programación lógica inductiva es un subcampo de la máquina de aprendizaje que utiliza la programación lógica como una representación uniforme para ejemplos, conocimientos e hipótesis. Dada una codificación del conocimiento de fondo conocido y un conjunto de ejemplos representados como una base de datos lógica de datos, un sistema de ILP derivar un programa de lógica planteada como hipótesis que implica todo el positivo y ninguno de los ejemplos negativos.

Esquema: ejemplos positivos ejemplos negativos conocimiento de fondo => hipótesis.

Programación lógica inductiva es particularmente útil en la bioinformática y de procesamiento de lenguaje natural. El término programación lógica inductiva se introdujo por primera vez en un artículo de Stephen Muggleton en 1991.

Implementaciones

ACE

Aleph

Claudien

DL-Estudiantes

DMáx

FOIL

Golem

Inthelex

Cal

Mio

MIS por Ehud Shapiro

Progol

RSD

Warmr

Page 7: PROGRAMACIÓN LÓGICA

La programación lógica inductiva se define como la intersección entre el aprendizaje inductivo y la programación lógica. Esto es así porque utiliza técnicas de ambos campos:

 Del aprendizaje inductivo en los ordenadores hereda su objetivo: desarrollar herramientas y técnicas para inducir hipótesis a partir de observaciones (ejemplos) y sintetizar nuevo conocimiento a partir de la experiencia.

 De la programación lógica hereda básicamente el formalismo de representación y su orientación a la semántica. La ILP utiliza la programación lógica como mecanismo para representar las hipótesis y las observaciones, superando así dos de las principales limitaciones de las técnicas clásicas de aprendizaje en ordenadores: la rigidez en la representación del conocimiento (lógica de proposiciones, árboles de decisión, etc.) y la dificultad para expresar conocimiento de base (background knowledge).

En los sistemas de aprendizaje de orden-0 el conjunto de entrenamiento consta de vectores de valores, cada uno perteneciente a una clase conocida. El conocimiento inducido permite definir clases en función del valor de los atributos, siendo representable con expresiones de la lógica de proposiciones. En ocasiones, se representa en forma de árbol de decisión: ID3, C4.5, etc. y a veces en forma de reglas: PRISM, C4.5rules, etc.

Por el contrario, en los sistemas de aprendizaje de primer orden, el conjunto de entrenamiento lo forman relaciones definidas de forma extensional, y el conocimiento de base lo constituyen otras relaciones, definidas intencionalmente. El objetivo del aprendizaje es, en estos sistemas, la construcción de un programa lógico que defina de forma intencional una relación objetivo (extensional) del conjunto de entrenamiento. En este tipo de definiciones lógicas se permite la recursión y algunos cuantificadores, muy útiles cuando se trabaja con objetos estructurados, difíciles de describir en un formato objeto-atributo-valor.

El inconveniente de usar representaciones tan expresivas como la lógica de predicados de primer orden es que, aunque las descripciones que se construyen tienden a ser más sencillas que las obtenidas en lógica de proposiciones, el espacio de búsqueda de las mismas es mucho mayor. Esto hace que la búsqueda de la mejor descripción sea una difícil y costosa tarea, que sólo puede realizarse mediante métodos heurísticos de búsqueda.

Page 8: PROGRAMACIÓN LÓGICA

PROGRAMACIÓN CON RESTRICCIONES

La Programación por restricciones  es un paradigma de la programación en informática, donde las relaciones entre las variables son expresadas en términos de restricciones (ecuaciones). Actualmente es usada como una tecnología de software para la descripción y resolución de problemas combinatorios particularmente difíciles, especialmente en las áreas de planificación y programación de tareas (calendarización).

Este paradigma representa uno de los desarrollos más fascinantes en los lenguajes de programación desde 1990 y no es sorprendente que recientemente haya sido identificada por la ACM (Asociación de Maquinaria Computacional) como una dirección estratégica en la investigación en computación.

Se trata de un paradigma de programación basado en la especificación de un conjunto de restricciones, las cuales deben ser satisfechas por cualquier solución del problema planteado, en lugar de especificar los pasos para obtener dicha solución.

La programación con restricciones se relaciona mucho con la programación lógica y con la investigación operativa. De hecho cualquier programa lógico puede ser traducido en un programa con restricciones y viceversa. Muchas veces los programas lógicos son traducidos a programas con restricciones debido a que la solución es más eficiente que su contraparte.

La diferencia entre ambos radica principalmente en sus estilos y enfoques en el modelado del mundo. Para ciertos problemas es más natural (y por ende más simple) escribirlos como programas lógicos, mientras que en otros es más natural escribirlos como programas con restricciones.

El enfoque de la programación con restricciones se basa principalmente en buscar un estado en el cual una gran cantidad de restricciones sean satisfechas simultáneamente. Un problema se define típicamente como un estado de la realidad en el cual existe un número de variables con valor desconocido. Un programa basado en restricciones busca dichos valores para todas las variables.

Algunos dominios de aplicación de este paradigma son:

Dominios booleanos, donde solo existen restricciones del tipo verdadero/falso.

Dominios en variables enteras y racionales.

Dominios lineales, donde solo se describen y analizan funciones lineales.

Page 9: PROGRAMACIÓN LÓGICA

Dominios finitos, donde las restricciones son definidas en conjuntos finitos.

Dominios mixtos, los cuales involucran dos o más de los anteriores.

Los lenguajes de programación con restricciones son típicamente ampliaciones de otro lenguaje. El primer lenguaje utilizado a tal efecto fue Prolog. Por esta razón es que este campo fue llamado inicialmente Programación Lógica con Restricciones. Ambos paradigmas comparten características muy similares, tales como las variables lógicas (una vez que una variable es asignada a un valor, no puede ser cambiado), o el backtracking.

La programación con restricciones puede ser implementado como un lenguaje propio o como bibliotecas para ser usadas en algún lenguaje de programación imperativo. Algunos lenguajes populares de programación con restricciones son:

B-Prolog (Basado en Prolog, propietario)

CHIP V5 (Basado en Prolog, también existen bibliotecas en C y C++, propietario)

Ciao Prolog (Basado en Prolog, software libre: GPL/LGPL)

ECLiPSe (Basado en Prolog, software libre)

Mozart ( Basado en Oz, software libre: X11)

SICStus (Basado en Prolog, propietario)

GNU Prolog (Basado en Prolog, software libre)

SWI-Prolog Un entorno Prolog que contiene varias librerías para soluciones con restricciones (LGPL)

INTEGRACIÓN CON OTROS PARADIGMAS: OO, PROGRAMACIÓN FUNCIONAL.

PROGRAMACION ORIENTADA A OBJETOS

La Programación Orientada a Objetos (POO u OOP según sus siglas en inglés) es un paradigma de programación que usa objetos y sus interacciones para diseñar aplicaciones y programas de computadora. Está basado en varias técnicas, incluyendo herencia, modularidad, polimorfismo, y encapsulamiento. Su uso se popularizó a principios de la década de 1990. Actualmente son muchos los lenguajes de programación que soportan la orientación a objetos. Actualmente una de las áreas más candentes en la industria y en el ámbito académico es la orientación a objetos. La orientación a objetos promete mejoras de amplio alcance en la forma de diseño, desarrollo y mantenimiento del software ofreciendo una solución a largo plazo a los problemas y preocupaciones que han existido desde el

Page 10: PROGRAMACIÓN LÓGICA

comienzo en el desarrollo de software: la falta de portabilidad del código y reusabilidad, código que es difícil de modificar, ciclos de desarrollo largos y técnicas de codificación no intuitivas .

CARACTERISTICAS DE LENGUAJE ORIENTADA A OBJETOS

• HERENCIA MULTIPLE

• suele ser común a la mayoría de los lenguajes OOP, aunque introduce un problema al existir la posibilidad de que el objeto sucesor herede el mismo atributo, aunque con distinto tipo y valor, de más de un predecesor. 

• EFICIENCIA

• Los lenguajes OOP arrastraron en un principio la reputación de ser ineficaces. Esto se debía en gran medida a que los primeros lenguajes (como Smalltalk) eran interpretados y no compilados. La existencia de compiladores permite a los desarrolladores ganar rapidez. 

• ASIGNACION DE TIPOS

• Los lenguajes orientados a objetos varían de forma sustancial la forma por la que se aproximan a la asignación de tipos.

• Por asignación de tipos entendemos que cada variable sea identificada como perteneciente a una clase (asignación fuerte) o sea simplemente un objeto indeterminado (asignación débil). 

• Manejo de memoria

• Los OOP son lenguajes que utilizan de manera intensiva la memoria de la computadora.

• Hay dos tipos de aproximación a la gestión de memoria.

• El sistema en tiempo de ejecución libera la memoria automáticamente a medida que los objetos dejan de utilizarse.

• Encapsulación

• Consiste en separar aquellos atributos del objeto que deben ser conocidos por el resto, de aquellos necesarios para su funcionamiento propio. 

Page 11: PROGRAMACIÓN LÓGICA

• Polimorfismo:

• comportamientos diferentes, asociados a objetos distintos, pueden compartir el mismo nombre, al llamarlos por ese nombre se utilizará el comportamiento correspondiente al objeto que se esté usando.

Ventajas y desventajas de programación orientada a objetos

VENTAJAS:

La OOP proporciona las siguientes ventajas sobre otros lenguajes de programación

• Uniformidad

• Ya que la representación de los objetos lleva implica tanto el análisis como el diseño y la codificación de los mismos.

• Comprensión

• Tanto los datos que componen los objetos, como los procedimientos que los manipulan, están agrupados en clases, que se corresponden con las estructuras de información que el programa trata.

• Flexibilidad

• Al tener relacionados los procedimientos que manipulan los datos con los datos a tratar, cualquier cambio que se realice sobre ellos quedará reflejado automáticamente en cualquier lugar donde estos datos aparezcan.

• Estabilidad

• Dado que permite un tratamiento diferenciado de aquellos objetos que permanecen constantes en el tiempo sobre aquellos que cambian con frecuencia permite aislar las partes del programa que permanecen inalterables en el tiempo.

DESVENTAJAS:

A pesar de que las ventajas de la programación orientada a objetos superan a las limitaciones de la misma, podemos encontrar algunas características no deseables en ésta. Limitaciones para el programador. No obstante que la tecnología orientada a objetos no es nueva, un gran porcentaje de programadores no están familiarizados con los conceptos de dicha tecnología. En otras palabras, la lógica de la programación

Page 12: PROGRAMACIÓN LÓGICA

estructurada sigue siendo predominante en la mayoría de los desarrolladores de software, después de haber revisado de forma breve los principios de la programación orientada a objetos, nos es claro que en ésta se requiere una lógica de pensamiento totalmente diferente a la lógica comúnmente utilizada para la programación estructurada. Tamaño excesivo en las aplicaciones resultantes. La gran mayoría de los equipos de cómputo cuentan con capacidades tanto de almacenamiento como de memoria lo suficientemente buena como para ejecutar la mayoría de las aplicaciones que puedan desarrollarse con la tecnología orientada a objetos, sin embargo existen casos en los que lo anterior no se cumple.

PROGRAMACIÓN FUNCIONAL

La programación funcional es un paradigma de programación declarativa basado en la utilización de funciones aritméticas que no maneja datos mutables o de estado. Enfatiza la aplicación de funciones, en contraste con el estilo de programación imperativa, que enfatiza los cambios de estado. La programación funcional tiene sus raíces en el cálculo lambda, un sistema formal desarrollado en los años 1930 para investigar la definición de función, la aplicación de las funciones y la recursión. Muchos lenguajes de programación funcionales pueden ser vistos como elaboraciones del cálculo lambda.

En la práctica, la diferencia entre una función matemática y la noción de una "función" utilizada en la programación imperativa es que las funciones imperativas pueden tener efectos secundarios, al cambiar el valor de cálculos realizados previamente. Por esta razón carecen de transparencia referencial, es decir, la misma expresión sintáctica puede resultar en valores diferentes en diferentes momentos dependiendo del estado del programa siendo ejecutado. Con código funcional, en contraste, el valor generado por una función depende exclusivamente de los argumentos alimentados a la función. Al eliminar los efectos secundarios se puede entender y predecir el comportamiento de un programa mucho más fácilmente, y esta es una de las principales motivaciones para utilizar la programación funcional.

Los lenguajes de programación funcional, especialmente los que son puramente funcionales, han sido enfatizados en el ambiente académico principalmente y no tanto en el desarrollo de software comercial. Sin embargo, lenguajes de programación importantes tales como Scheme, Erlang, Rust, Objective Caml y Haskell, han sido utilizados en aplicaciones comerciales e industriales por muchas organizaciones. La programación funcional también es utilizada en la industria a través de lenguajes de dominio específico como R (estadística),

Page 13: PROGRAMACIÓN LÓGICA

Mathematica (matemáticas simbólicas), J y K (análisis financiero), F# en Microsoft.NET y XSLT (XML). Lenguajes de uso específico usados comúnmente como SQL y Lex/Yacc, utilizan algunos elementos de programación funcional, especialmente al procesar valores mutables. Las hojas de cálculo también pueden ser consideradas lenguajes de programación funcional.

La programación funcional también puede ser desarrollada en lenguajes que no están diseñados específicamente para la programación funcional. En el caso de Perl, por ejemplo, que es un lenguaje de programación imperativo, existe un libro que describe cómo aplicar conceptos de programación funcional. JavaScript, uno de los lenguajes más ampliamente utilizados en la actualidad, también incorpora capacidades de programación funcional. Python también incorpora particularidades de los lenguajes funcionales como listas de comprensión y funciones de tratamiento de listas como matemática de conjuntos. Java en su versión 8, está incorporando la programación funcional, así como el uso de las expresiones lambda.

BIBLIOGRAFÍA

http://es.slideshare.net/karlabarriosalejo/savedfiles?s_title=lenguaje-de-programacin-orientada-a-objetos&user_login=jona_1994

http://es.wikipedia.org/wiki/Programaci%C3%B3n_distribuida

http://indalog.ual.es/WWW/prolog2005.pdf

http://ccc.inaoep.mx/~emorales/Papers/2006/capilp.pdf