miércoles 15 de abril de 2009

Paradigma Logico – Programación Logica

Una forma de razonar para resolver problemas en matemáticas se fundamenta en la lógica de primer orden. El conocimiento básico de las matemáticas se puede representar en la lógica en forma de axiomas, a los cuales se añaden reglas formales para deducir cosas verdaderas (teoremas) a partir de los axiomas. Gracias al trabajo de algunos matemáticos de finales del siglo pasado y principios de éste, se encontró la manera de automatizar computacionalmente el razonamiento lógico, particularmente para un conjunto significativo de la lógica de primer orden, que permitió que la lógica matemática diera origen a otros
tipos de lenguajes de programación, conocidos como lenguajes lógicos.
También se conoce a estos lenguajes como lenguajes declarativos, porque todo lo que el programador tiene que hacer para solucionar un problema es describirlo vía axiomas y reglas de deducción.
En los lenguajes lógicos se utiliza el formalismo de la lógica de primer orden para representar el conocimiento sobre un problema y para hacer preguntas que, si se demuestra que se pueden deducir a partir del conocimiento dado en forma de axiomas y de las reglas de deducción estipuladas, se vuelven teoremas. Así se encuentran soluciones a problemas formulados como preguntas. Con base en la información expresada dentro de la lógica de primer orden, se formulan las preguntas sobre el dominio del problema y el intérprete del lenguaje lógico trata de encontrar la respuesta automáticamente. El
conocimiento sobre el problema se expresa en forma de predicados (axiomas)
que establecen relaciones sobre los símbolos que representan los datos del
dominio del problema.
Este concepto de programación lógica está ligado históricamente a un lenguaje llamado Prolog, que proviene de PROgrammation en LOGique (programación en lógica), que fue el primer lenguaje de programación lógico y el más conocido y utilizado. Este lenguaje fue desarrollado por el Grupo de Inteligencia Artificial de la Universidad de Marseille, dirigido por Alain Colmerauer, en 1972. Prolog es utilizado para el desarrollo de aplicaciones de inteligencia artificial debido a su forma de representar el conocimiento, facilitando las
búsquedas en bases de datos, la escritura de compiladores, la construcción de sistemas expertos, el procesamiento de lenguaje natural y la programación automática. También es muy adecuado para las aplicaciones que implican búsqueda de patrones, búsqueda con rastreo inverso o información incompleta.
Asimismo es el lenguaje escogido por Japón como piedra angular de los sistemas de computación de quinta generación.

Dice Alain Colmerauer en [1]: "Se suele preguntar cuál es la diferencia entre Prolog y los otros lenguajes de programación y de dónde viene su supuesto poder. Prolog nació de un desafío: crear un lenguaje de muy alto nivel, aun cuando fuera ineficiente para los informáticos de la época. La eficiencia consistía entonces en que una máquina ejecutara muy rápidamente programas laboriosamente escritos. El reto consistía en poder escribir rápidamente los programas dejando a la máquina su laboriosa ejecución.”

Una vez liberados de esa obsesión por la eficiencia, se pudo recurrir a los formalismos y mecanismos de inferencia de la lógica matemática; mecanismos ciertamente ineficientes,  pero poderosos sin lugar a dudas. De ahí viene el nombre de Prolog “Programación en lógica”. Ahora bien, si se considera lo que sucede a nivel de la máquina, resulta que ésta deberá ser mucho más inteligente de lo normal: debe ser no-determinista, es decir, capaz de explorar muchas posibilidades y debe poder resolver miles y miles de pequeñas ecuaciones.
Estas ecuaciones introducen incógnitas, que no son otra cosa que las variables del programa, pero distan mucho de ser las variables habituales que designan localidades de memoria. El programador que llega a Prolog desde un lenguaje clásico, experimenta una revelación semejante a la del escolar que pasa de la aritmética a los primeros rudimentos del álgebra. Puede representar como incógnitas aquellas entidades cuyos valores busca, establecer ciertas relaciones entre esas incógnitas y, sin tener que detallarlos, dejar que la máquina considere todos los casos posibles y aportar todas las posibles soluciones...

Logica Proposicional:

La programación lógica tiene sus orígenes en los trabajos de prueba automática de teoremas. Para esto se utiliza una única regla de inferencia llamada principio de resolución1, mediante la cual la prueba de un teorema puede ser llevada a cabo en forma automática. La resolución es una regla que se aplica sobre las fórmulas surgidas de la lógica de primer orden y la demostración de teoremas mediante esta regla de inferencia se lleva a cabo por reducción al absurdo.
La lógica de primer orden o lógica proposicional es uno de los formalismos más utilizados para representar conocimiento en Inteligencia Artificial. Esta lógica es la que utiliza proposiciones y nexos entre éstas para expresar sus verdades. Las proposiciones equivalen a frases u oraciones del lenguaje hablado, mientras que los nexos a través de los cuales puede relacionar estas proposiciones son la conjunción (y), la disyunción (o) y la implicación (si). Cuenta con un lenguaje formal mediante el cual es posible representar fórmulas llamadas axiomas o predicados, que permiten describir fragmentos del conocimiento, y además consta de un conjunto de reglas de inferencia que aplicadas a los axiomas,
permiten derivar nuevo conocimiento.
El lenguaje formal de la lógica proposicional o lógica de primer orden es el Lenguaje de Primer Orden (LPO). En realidad éste no es un lenguaje simple, sino que es una familia de lenguajes, donde todos sus miembros tienen una gramática similar y comparten ciertos ítems importantes de su vocabulario. De todos modos nuestro estudio se centrará en un lenguaje genérico de primer orden, que es el que luego podremos aplicar en los programas de Prolog.
Los enunciados más básicos de LPO son los enunciados atómicos. Estos se corresponden a los enunciados más simples del español, enunciados que consisten en algunos nombres conectados por algún predicado. Ejemplos de este tipo son Juan corrió, Juan vio a Ana y Ana regaló flores a Juan. En LPO, los enunciados atómicos son formados también combinando nombres (o constantes individuales, tal como suelen llamarse) y predicados, aunque como
posteriormente veremos difieren un poco en el modo en que son combinados.

Introducción a Prolog

Prolog es un lenguaje de programación declarativo basado en la lógica de primer orden, particularmente en una restricción de la forma clausal de la lógica. Fue desarrollado por Alain Colmerauer en 1972 en la Universidad de Marseille, Francia. Usa como regla de inferencia el “principio de resolución” propuesto por Robinson en 1965. La representación del dominio se realiza a través de hechos y reglas.
Decimos que es declarativo porque no es imperativo. Es decir, cada “línea de programa” Prolog es una declaración, no una orden. Se tiene así un conjunto de aseveraciones expresadas simbólicamente, que expresan conocimientos de una situación real o ficticia. Para esto se usa la lógica de predicados de primer orden que se expuso anteriormente.
Prolog es un lenguaje de programación hecho para representar y utilizar el conocimiento que se tiene sobre un determinado dominio. Más exactamente, el dominio es un conjunto de objetos y el conocimiento se representa por un conjunto de relaciones que describen las propiedades de los objetos y sus interrelaciones.
En Prolog, el programa (las reglas que definen las propiedades y relaciones entre los objetos) está muy alejado del modelo Von Newman que posee la máquina en la que tienen que ser interpretados. Debido a esto, la eficiencia en la ejecución no puede ser comparable con la de un programa equivalente escrito en algún lenguaje imperativo o procedural. El beneficio es que aquí ya no es necesario definir el algoritmo de solución, como en la programación imperativa, sino que lo fundamental es expresar bien el conocimiento que se tenga sobre el problema que se esté enfrentando.
Prolog forma su lenguaje a partir de un alfabeto que contiene sólo dos tipos de símbolos:
1. símbolos lógicos, entre los que se encuentran los símbolos de constantes proposicionales true y false (verdadero y falso); los símbolos para la negación, la conjunción, la disyunción y la implicación (que en Prolog se denota con los caracteres :-); los símbolos de cuantificadores; y los símbolos auxiliares de escritura como corchetes [,], paréntesis (,) y coma.
2. símbolos no lógicos, agrupados en el conjunto de símbolos constantes; el conjunto de símbolos de variables individuales (identificadores); el conjunto de símbolos de relaciones n-arias; y el conjunto de símbolos de funciones n-arias.
A partir de estos símbolos se construyen las expresiones válidas en el LPO de Prolog: los términos (nombres) y las fórmulas (predicados). Este LPO posee un amplio poder de expresión, ya que los términos permiten hacer referencia (nombrar) todos los objetos del universo, mientras que las fórmulas (predicados) permiten afirmar o negar propiedades de estos o bien establecer relaciones entre los objetos del universo.
Existen muchas versiones de Prolog. En Prolog de Edimburgo, versión de Prolog diseñada por David Warren que se ha convertido en estándar, un término es cualquiera de las tres expresiones siguientes: una constante, como el número "100"; la palabra "antonio" y la letra "c"; o una variable, por ejemplo "X" (notar que los identificadores que comienzan con mayúscula representan, siempre, variables).
En cambio, un predicado atómico o elemental es una expresión de la forma "R(a1, a2,..., an)" donde R es un símbolo de predicado n-ario que como vimos, denota alguna relación entre objetos o alguna propiedad de un objeto, y a1, a2,..., an son términos funcionando como argumentos.

Algunas Versiones de Lenguaje Prolog para PC:


ALS Prolog (Applied Logic Systems Inc.) DOS / Unix / Xenix
Arity Prolog (Arity Corp) DOS / Windows / OS 2
Cogent Prolog (Amziod) DOS
IF Prolog (InterFace Computer Inc.) UNIX
Quintus Prolog (Quintus Corp.) DOS / Windows / OS 2
Turbo Prolog (Borland International) DOS
PIE Prolog (versión shareware) DOS

Universidad Tecnológica Nacional Paradigmas de Programación
Facultad Regional Córdoba Programación Lógica