domingo, 3 de abril de 2011

Introduccion a la Programacion Logica

INTRODUCCIÓN A LA PROGRAMACIÓN LÓGICA


En los comienzos de los años 70 el francés Alain Colmenuer desarrolló el lenguaje PROLOG que también permite el desarrollo de aplicaciones en forma declarativa.

En general el PROLOG es un demostrador automático de problema, el cual utiliza una Base de Conocimientos en forma de reglas de inferencia deductivas (cláusulas de Horn), es decir sus reglas tienen como consecuente una única acción y las inferencias obte¬nidas son estrictamente lógicas (verdaderas o falsas), aunque puede parecer una limitación, esto no es totalmente justo, ya que PROLOG permite programar mecanismos inferenciales con lógica probabilisticas, dado que se trata de búsquedas en árboles con acumulación de evidencias.

El PROLOG como lenguaje surgido del cálculo de predicados, tomó las siguientes ideas de la lógica para su ejecución.
1) Un conjunto de axiomas o hechos.
2) Reglas de inferencias las cuales se resuelven por resolución y unificación.
3) El objetivo a demostrar, que serán las condiciones a unificar con las reglas.

También tomó del LISP el tratamiento de las listas para la repre¬sentación de estructuras complejas. Aunque el PROLOG tuvo su origen en la lógica matemática no fue una transposición exacta, y esta ligada a las discusiones que sostienen desde hace años los principales investigadores de la Inteligencia Artificial, los cuales están divididos en dos grandes grupos, de una parte Minsky quien propone estudiar los mecanismos del pensamiento humano y luego simularlo en la computadora.
Lo más importante para Minsky son los conceptos, o sea la inter¬pretación que se le puede dar a cada palabra en dependencia de un contexto dado.
El otro grupo encabezado por Mac Carthy (autor del LISP), afirma que la lógica matemática es el elemento característico para la representación del razonamiento y su implantación en la computadora, este grupo centra su atención en la formalización y en la estructura de los conocimientos más que en el sentido de los mismos.
DEDUCCIÓN PROLOG EN LÓGICA PROPOSICIONAL

En esta sección vamos a estudiar el sistema deductivo de Prolog en el caso de la lógica proposicional. Vamos a desarrollar el estudio mediante el siguiente ejemplo.
Ejemplo 2.1 [Problema de clasificación de animales] Disponemos de una base de conocimiento compuesta de reglas sobre clasificación de animales y hechos sobre características de un animal.
Regla 1: Si un animal es ungulado y tiene rayas negras, entonces es una cebra.
Introducción a la programación lógica con Prolog 5
Regla 2: Si un animal rumia y es mamífero, entonces es ungulado.
Regla 3: Si un animal es mamífero y tiene pezuñas, entonces es ungulado.
Hecho 1: El animal es mamífero.
Hecho 2: El animal tiene pezuñas.
Hecho 3: El animal tiene rayas negras.
Demostrar a partir de la base de conocimientos que el animal es una cebra. Demostración: Una forma de demostrarlo es razonando hacia atrás. El problema inicial consiste en demostrar que el animal es una cebra. Por la regla 1, el problema se reduce a demostrar que el animal es ungulado y tiene rayas negras. Por la regla 3, el problema se reduce a demostrar que el animal es mamífero, tiene pezuñas y tiene rayas negras. Por el hecho 1, el problema se reduce a demostrar que el animal tiene pezuñas y tiene rayas negras. Por el hecho 2, el problema se reduce a demostrar que el animal tiene rayas negras. Que es cierto por el hecho 3. usado Para resolver el problema anterior con Prolog vamos a considerar las siguientes cuestiones:

1. cómo se representan en Prolog las reglas,
2. cómo se representan en Prolog los hechos,
3. cómo se representan en Prolog las bases de conocimientos,
4. cómo se inicia una sesión Prolog,
5. cómo se carga en Prolog la base de conocimiento,
6. cómo se representa en Prolog el objetivo a demostrar,
7. cómo se interpreta la respuesta de Prolog,
8. cómo ha realizado Prolog la búsqueda de la demostración,
9. cuál es la demostración obtenida y
10. cómo se corresponde dicha demostración con la anteriormente presentada.
Para representar una regla, se empieza por elegir los símbolos para los átomos que aparecen en la regla. Para la regla 1, podemos elegir los símbolos es_ungulado, tiene_rayas_negras y es_cebra. La regla 1 puede representarse como si es_ungulado y tiene_rayas_negras entonces es_cebra.
Usando las conectivas lógicas la expresión anterior se escribe mediante la fórmula
es_ungulado ^ tiene_rayas_negras ! es_cebra donde ^ representa la conjunción y!, el condicional. La fórmula anterior se representa en Prolog, mediante la cláusula es_cebra :- es_ungulado, tiene_rayas_negras.
Se puede observar que la transformación ha consistido en invertir el sentido de la escritura y sustituir las conectivas por :- (condicional inversa) y , (conjunción). El átomo a la izquierda de
:- se llama la cabeza y los átomos a la derecha se llama el cuerpo de la regla.
6 José A. Alonso
Para representar los hechos basta elegir los símbolos de los átomos. Por ejemplo, el hecho 2
se representa en Prolog por
tiene_rayas_negras.
es decir, el símbolo del átomo terminado en un punto. Los hechos pueden verse como cláusulas con el cuerpo vacío. Para representar la base de conocimiento en Prolog, se escribe en un fichero (por ejemplo,
animales.pl) cada una de las reglas y los hechos 1.
es_cebra :- es_ungulado, tiene_rayas_negras. % Regla 1
es_ungulado :- rumia, es_mamífero. % Regla 2
es_ungulado :- es_mamífero, tiene_pezuñas. % Regla 3
es_mamífero. % Hecho 1
tiene_pezuñas. % Hecho 2
tiene_rayas_negras. % Hecho 3
Al lado de cada regla y de cada hecho se ha escrito un comentario (desde % hasta el final de la línea). Para iniciar una sesión de Prolog (con SWI Prolog) se usa la orden pl. La base de conocimientose carga en la sesión Prolog escribiendo el nombre entre corchetes y terminado en un punto. La pregunta se plantea escribiendo el átomo y un punto. Welcome to SWI-Prolog (Multi-threaded, Version 5.6.18) Copyright (c) 1990-2006 University of Amsterdam. ?- [animales].
Yes
?- es_cebra.
Yes
La respuesta Yes significa que ha demostrado que el animal es una cebra.

La búsqueda de la prueba es una búsqueda en profundidad en un espacio de estados, donde cada estado es una pila de problemas por resolver. En nuestro ejemplo, el estado inicial consta de un único problema (es_cebra). Buscamos en la base de hechos una cláusula cuya cabeza coincida con el primer problema de la pila, encontrando sólo la regla 1. Sustituimos el problema por el cuerpo de la regla. dando lugar a la pila es_ungulado, tiene_rayas_negras. Para el primer problema tenemos dos reglas cuyas cabezas coinciden (las reglas 2 y 3). Consideramos en primer lugar la regla 2, produciendo la pila de problemas rumia, es_mamífero, tiene_rayas_negras. El primer problema no coincide con la cabeza de ninguna cláusula. Se produce un fallo y se reconsidera la elección anterior. Consideramos ahora la cláusula 3, produciendo la pila de problemas es_mamífero, tiene_pezuñas, tiene_rayas_negras. Cada uno de los problemas restantes coincide con uno de los hechos, con lo que obtenemos una solución del problema inicial.

HISTORIA DE LA PROGRAMACION LOGICA
Remontándonos en el tiempo podemos tomar a Aristóteles (384-322 a.C.) y su teoría silogística como los precursores de la lógica matemática y en consecuencia de la Programación lógica. La teoría silogística, que estudia una clase particular de implicaciones con dos premisas y una conclusión, también fue tratada por los filósofos contemporáneos de Aristóteles y largamente estudiada en siglos posteriores, aunque no se produjeron innovaciones de interés hasta el siglo XVII con los trabajos de Descartes y Leibnitz.
Dos siglos después Boole dio un paso importante en el sistema de razonamiento aristotélico poniendo en relación la lógica y el algebra. Los trabajos de Boole fueron modificados y ampliados mas tarde por los lógicos y matemáticos como Jevon, Pierce, Schroeder y Huntington entre otros.
Llegamos así a finales del siglo XIX y principios del XX con la revolución de la fundamentacion de las Matemáticas gracias a los trabajos de Frege, Cantor, Peano, Russell y Whitehead entre otros que marcan el periodo más apasionante y de mayor actividad en la historia de la lógica matemática.
Llegamos a la mitad del siglo XX y descubrimos que de forma paralela al desarrollo de la lógica se ha producido un espectacular avance de las llamadas “maquinas de calcular”, avance sobre el que reflexiona A. Turing en un articulo titulado “¿Pueden pensar las maquinas?”, publicado en 1950 y que podemos dar como punto de partida de lo que después se llamara Inteligencia Artificial.

No obstante hasta la primera mitad de los sesenta, con los trabajos de Kowalski y el primer PROLOG de Colmerauer cuando nace la Programación Lógica como rama de la demostración automática con personalidad propia.

PROGRAMACION LOGICA
La Programación Lógica estudia el uso de la lógica para el planteamiento de problemas y el control sobre las reglas de inferencia para alcanzar la solución automática.

La Programación Lógica, junto con la funcional, forma parte de lo que se conoce como Programación Declarativa, es decir la programación consiste en indicar como resolver un problema mediante sentencias, en la Programación Lógica, se trabaja en una forma descriptiva, estableciendo relaciones entre entidades, indicando no como, sino que hacer, entonces se dice que la idea esencial de la Programación Lógica es
Programa= lógica + control
Lógica (programador): hechos y reglas para representar conocimiento

Control (interprete): deducción lógica para dar respuestas (soluciones)

La programación lógica intenta resolver lo siguiente:

Dado un problema S, saber si la afirmación A es solución o no del problema o en que casos lo es. Además queremos que los métodos sean implantados en maquinas de forma que la resolución del problema se haga de forma automática

La programación lógica: construye base de conocimientos mediante reglas y hechos

Regla: implicación o inferencia lógica que deduce nuevo conocimiento, la regla permite definir nuevas relaciones apartir de otras ya existentes

Ej.: Mortal (x): - humano(x)
x es mortal si x es humano
Hecho: declaración, cláusula o proposición cierta o falsa, el hecho establece una relación entre objetos y es la forma más sencilla de sentencia
Ej.:
Humano (Sócrates); Sócrates es humano
Ama (Juan, Maria) ; ama Juan a Maria
Consulta: se especifica el problema, la proposición a demostrar o el objetivo Partiendo de que los humanos son mortales y de que Sócrates es humano, deducimos que.
Sócrates es mortal
Mortal (x): - humano(x);- los humanos son mortales ; regla
Humano (Sócrates); Sócrates es humanos ; hecho
Sócrates es mortal ; consulta
La programación lógica comprende dos Paradigmas de Programación la Programación Declarativa y la Programación funcional.
La programación declarativa gira en torno al concepto de predicado, o relación entre elementos.
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.

FUNDAMENTOS DE LA PROGRAMACION LOGICA
 La mayoría de los Lenguajes de Programación se basan en la Teoría Lógica de Primer Orden, aunque también incorporan algunos comportamientos de orden superior, en este sentido, destacan los lenguajes funcionales ya que se basan en el Calculo Lambda, es la única teoría lógica de orden superior.
La Teoría Lógica de Primer Orden o también llamada lógica de predicados: es un sistema deductivo basado en un Lenguaje Lógico Matemático formal de gran utilidad para las Matemáticas, Filosofía, Lingüística y Computacional. Incluye proposiciones lógicas, predicados y cuantificadores.
CARACTERISTICAS DE LA PROGRAMACION LOGICA
· Unificación de términos
· Mecanismos de inferencia automática
· Recursion como estructura de control básica
· Visión lógica de la computación
LENGUAJES DE PROGRAMACION LOGICA
Un lenguaje es el CLP pero el lenguaje de programación lógica por excelencia es el PROLOG.
Prolog: es un Lenguaje de Programación diseñado para representar y utilizar el conocimiento que se tiene sobre un determinado dominio. Los programas en Prolog responden preguntas sobre el tema del cual tienes conocimiento.
La popularidad del lenguaje se debe a su capacidad de deducción y además es un lenguaje fácil de usar por su semántica y sintaxis. Solo busca relaciones entre los objetos creados, las variables y las listas, que son su estructura básica.
Escribir un programa en Prolog consiste en declarar el conocimiento disponible acerca de objetos, además de sus relaciones y sus reglas, en lugar de correr un programa para obtener una solución, se hace una pregunta, el programa revisa la base de datos para encontrar la solución a la pregunta, si existe mas de una solución, Prolog hace un barrido para encontrar soluciones distintas. El propio sistema es el que deduce las respuestas a las preguntas que se le plantean, dichas respuestas las deduce del conocimiento obtenido por el conjunto de reglas dadas.

No hay comentarios:

Publicar un comentario