jueves, 1 de marzo de 2007

Programación lógica

Introducción:
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 ori­gen 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.

La lógica desde la antigüedad se concibió como el método de descubrir las leyes del pensamiento, pero estas leyes siempre han estado restringidas al pensamiento científico y muy especialmente el matemático, quedando fuera el sentido común. Esta deficiencia es admitida por los defensores de la lógica, pero ellos consideran que la lógica es la única senda posible para desarrollar programas capaces de mostrar inteligencia.
2.1.1. Programación declarativa

En la programación declarativa lo principal no son las instrucciones que se dan en forma secuencial (programación prescriptiva), en su lugar, el programador se dedica a describir el problema a través de reglas y hechos que funcionan de forma independiente y es a través de un mecanismo de inferencia que se ejecutan las reglas.

En la programación declarativa las reglas (base de conocimientos) esta separada del programa de control (maquina de inferencia).

Ejemplo de programación declarativa:
Si y/o y/o .... entonces y/o ....

Donde un hecho seria:
Juan es un estudiante
El perro es blanco
A María le gusta el cine.

El conocimiento operativo tiene carácter procedimental.
Si Premisas entonces Conclusión
(También hay quienes utilizan: Si Condiciones entonces Acciones)

Si P entonces C
Donde:P y C instrucciones estaríamos en presencia de una representación procedimental.
P y C hechos o aserciones estaríamos en presencia de una representación declarativa.

Ejemplo de representación procedimental
Si A1 = B1 y A2 > B2 entonces X := A1 + A2

Donde A1 = B1 y A2 > B2 son comparaciones que tomaran el valor de ¨verdadero¨ o ¨falso¨.


O sea que tendríamos:

Si P1 y P2 entonces C

donde P1 y P2 serian variables lógicas (darían verdadero o falso)

Ejemplo de representación declarativa
Si y entonces

Esto en cualquier lenguaje se haría de la siguiente forma:
X := “Juan es un estudiante”
Y := “Juan tiene 7 años”

if X = “Juan es un estudiante” and Y = “Juan tiene 7 años”
then Z := “Juan esta en la primaria”

Veamos ahora la forma de formalizar los hechos o aserciones
Ejemplo: Juan tiene 10 años de edad
1)
<10>
2) relacion (concepto, concepto,....) La que utiliza Prolog
edad(Juan, 10)
También se utiliza
3)


Nos concentraremos en las dos primera representaciones.

Ejemplo1: El león es un mamífero

es-un(leon, mamifero)

Ejemplo 2: A María le gusta el cine.
1)
2) gusta(maria, cine)

Veamos ahora algunos ejemplos donde se combinan los hechos en formas de reglas o cláusulas:

si y
entonces

Y ahora formalizando los hechos tendremos:


1) si y
entonces

O también (similar a Prolog)
2) vive(tiburon, en-agua) si vive(pez, en-agua) y es-un(pez, tiburon)

Observen que en prolog la conclusión se pone delante de las premisas

Representación en forma de reglas:
si Premisas entonces Conclusión
Lo que se interpretaría como:
si entonces
Donde la conclusión puede estar compuesta por varios hechos o aserciones.

Representación en prolog:
Conclusión si Premisas
Y se interpretaría como:
si
Donde la conclusión estará dada por un solo hecho o aserción.

Ejercicio 1:
1. A María le gusta el tenis.
2. A Tomas le gusta el béisbol.
3. A José le gustan los deportes que le gustan a Tomas.

1.
2. S
3. Si entonces

Similar a prolog:
1. gusta(maria, tenis)
2. gusta(tomas, beisbol)
3. gusta(Jose, X) Si gusta(tomas, X)

Ejercicio 2:

Sofía desea un hombre que no fume.

si y

Similar a prolog:
desea(sofia, X) si hombre(X) y no fuma(X)


Calculo proposicional y de predicados.

Introducción a la lógica de predicados.

Esquemas lógicos:

Habíamos definido que Prolog utiliza la representación:
Relación (concepto1, concepto2,....)

En lógica el nombre de la relación se denomina “predicados” y los conceptos “argumentos” y dicha estructura se denomina ‘proposición” las cuales toman el valor de verdadero o falso. Y se resuelven a través del calculo de predicados.

Predicado (Argumento1, Argumento2, .....)

Un argumento puede ser representado con una constante o con una variable.

Ejemplos:
Propietario(pedro, radio)
Estudia (maria, X-materia)
Posee (luis, X-cualidad)
Supervisa(pedro, juan)

Calculo de predicados: Dado una formula cualquiera determinar si es verdadera o falsa.



Modus ponens: A, A Þ B

B

Si A se cumple y A Þ B se cumple entonces también se cumple B

Si tenemos A1 Ù A2 Ù A3 Þ B donde si todas las A se cumplen entonces se cumple B. Pero, si alguna de las A da falso, en ese caso no se puede saber el valor de B, dado que B puede ser verdadera o falsa
Ya que la formula: (falso) Þ B es verdadera tanto para si B es verdadera o falsa.

Ejemplo:

Todos los hombres son mortales
Socrates es hombre

Socrates es mortal

Como ya sabemos esto se representaría de forma declarativa:

Si hombre. X entonces mortal. X
Hombre. Socrates

Mortal. Socrates

En calculo de predicados seria:

Hombre (X) Þ Mortal (X)
Hombre (Socrates)

Mortal (Socrates)

Lo cual es posible ya que si Hombre(X) es verdadero también Hombre(Socrates) es verdadero por interpretación de formulas.


Interpretación de formulas del calculo de predicados.

Veamos algunas definiciones:
U: Universo o dominio para la interpretación.
Predicado: “Relación entre elementos de U y las propiedades de los elementos.

Definición: Una formula A es verdadera en U. Si A evaluada para cualquier valor de X tomado de U da siempre verdadero.

O sea:

A es verdadero en U si "(X), X Î U y A(X) verdadero


Donde X es una variable libre (no instanciada)

Ejemplo de Universo:
U = {Socrates, Platon, Democrito}

Cuantificadores universales

": Para todo o para cada.
"(X):Todas las sustituciones de la variable X por elementos de algún dominio de aplicación, deben tomar el valor verdadero.

$: Existe.
$(X): Solamente alguna de las sustituciones necesita tomar dicho valor.

En Prolog los cuantificadores se dan de forma implícita. Hay que eliminar los cuantificadores y mantener la dependencia.

Si tenemos la siguiente expresión
" (X) $(Y) tal que X £ Y
Como Y depende de X , al eliminar los cuantificadores quedaría:
Y = f(X).

Ejemplo 1:
Sea el predicado Persona(X)
Sea U = { juan, maria, jose, ana}
El predicado persona seria cierto en U si se cumple:
"(X) tal que X Î {juan, maria, jose, ana}
O sea persona(X) se cumple para:
Persona(maria) ® verdadero
Persona (luis) ® falso

Ejemplo 2
Todas las personas tienen una madre.
Tendriamos la siguiente expresión:
"(X) $(Y) persona(X) Þ Madre(Y, X)

Veamos algunas propiedades
Ø(Ø A) = A
A Þ B = ØA Ú B
Ø(A Ù B) = ØA Ú ØB
Ø(A Ú B) = ØA Ù ØB
A Ù (B Ú C) = A Ù B Ú A Ù C
A Ú (B Ù C) = A Ú B Ù A Ú C


Conjuntos y relaciones

Pocos lenguajes pueden ser interpretados desde tres ángulos diferentes, como declarativos, como lógicos y como relacionales. Tal vez esta sea una de las mayores dificultades a la hora de comprender la esencia de Prolog, pero a su vez, en esa riqueza de interpretación radica, tanto su complejidad como su encanto.

Hemos estado afirmando que Prolog los hechos se representan como:
Relación(concepto1, concepto2,.......)

Ejemplo:
1. gusta(maria, juan)
2. gusta(maria, Y)
3. gusta(X, Juan)
4. gusta(X, Y)

Lo que se interpreta como:
1. A María le gusta Juan.
2. A María le gusta alguien
3. A alguien le gusta Juan
4. A alguien le gusta alguien

Repasemos algunos conceptos sobre RELACION

Producto cartesiano
A = {a,b,c} y B = {2,3}
Sea el par (x,y) con x Î A y y Î B
Se obtiene el conjunto
AxB = { (a,2), (a,3), (b,2), (b,3), (c,2), (c,3)}
Y se denota como
AxB = { (x,y) / x Î A y y Î B}

Relación entre conjuntos
Sea C = { (c,2), (c.3)}
Se tiene que C Ì AxB
Una relación entre dos conjuntos A y B es cualquier subconjunto del producto cartesiano AxB.
Por tanto C es una relación del conjunto ab
O lo que es lo mismo.
Si R Ì ab Þ R es una relación entre A y B

Aquí R fue seleccionada arbitrariamente. En la practica se establecen las condicione entre los componentes de los pares con el objeto de obtener una relación determinada, del tipo.
R = { (x,y) Î AxB / }

Ejemplo:
Sean los conjuntos A = { 1, 3 } y B = { 2, 4 }
Sea la relación R = { (x,y) Î AxB / x < y }
Tendremos R = { (1,2), (1,4), (3,4) }
Entrando en materia

Sean los conjuntos H = { juan, jose } y M = {maria, ana }
Sea la relación G (gusta) G = { (x,y) Î HxM / si x Î H y y Î M}
Tendremos G = { (juan, maria), (juan, ana), (jose, maria), (jose, ana) }

En Prolog seria:
Gusta (X,Y) si hombre(X) y mujer(Y)
Hombre(juan)
Hombre(jose)
Mujer(maria)
Mujer(ana)

Y el resultado seria: gusta(juan,maria), gusta(juan,ana), gusta(jose, maria) y gusta(jose, ana).

Ejemplo 1:
A José le gustan todas las mujeres bonitas.
Seria
Gusta (José, X) si mujer(X) y bonita(X)
Bonita(ana).

Observen que ahora estamos haciendo referencia al conjunto de las mujeres bonitas el cual es subconjunto de M= {maria, ana}

Ejemplo 2:
María odia a todos los hombres
Odia(maria, X) si hombre(X)