ANEXO

LÓGICA MATEMÁTICA


 

1 Lógica matemática.

1.1 Conceptos básicos.

1.2 Resolución y unificación. Métodos.

 

Lógica matemática.

Dado que el Lenguaje Natural, aunque es potente, resulta muy ambiguo, nos interesa encontrar un lenguaje más sencillo, sin ambigüedades que nos permita realizar razonamientos y generalizaciones. Por ello, es necesario introducirnos en la formalización del Cálculo Proposicional, que, aunque no cuenta con toda la potencia necesaria para describir el mundo, es válido como primera aproximación. También veremos algunos conceptos del Cálculo de Predicados y, por supuesto, nos centraremos en definir y ver cómo funciona el Método de Resolución.

[ÍNDICE]

Conceptos básicos.

Para comprender los principios de la lógica matemática en el campo del Cálculo Proposicional, necesitamos conocer una serie de conceptos básicos que se describen a continuación:

Dada una serie de premisas, a través de las reglas de inferencia, podemos llegar a un enunciado que podemos denominar enunciado Conclusión. El conjunto de pasos para llegar a este enunciado a partir de las premisas usando dichas reglas de inferencia, compone un algoritmo general que permite automatizar el proceso de demostración. De esta forma, obtenemos un demostrador automático de teoremas que es, justamente, en lo que consiste la máquina PROLOG.

Aunque mediante la Lógica Proposicional podemos describir muchas situaciones, existen otras imposibles de representar. Necesitamos introducirnos, además, en la Lógica de Predicados. Podemos considerar la Lógica Proposicional como un subconjunto de la Lógica de Predicados o de Primer Orden. Por tanto, a las definiciones anteriores, hemos de añadir otras nuevas que nos permitan comprender los métodos que se explicarán en apartados posteriores.

Ejemplo:

f(a, x) Ù Ø g(x), " x (g(x) Ú a) ® [f(a, v) Ù P(b Ú c)]

 

Ejemplo:

[" x (g(x) Ú a) ® (f(a, v) Ù P(b Ú c))] Ú Ø (f(a, x) Ù Ø g(z))

 

    1. La variable x está inmediatamente después de un símbolo " ó $ .
    2. La variable x está en el radio de acción de un cuantificador " x ó $ x.

Ejemplos:

" x (f(x) Ú g(z)). El cuantificador abarca a f(x) y g(z).

" x h(x) Ú f(a, v, x). El cuantificador abarca sólo a h(x).

 

Ejemplo:

" x [P(g(x)) Ú R(a)] ® [f(a, v) Ù Q(b Ú c)]

 

Ec 1

[ÍNDICE]

Resolución y unificación. Métodos.

La Deducción Natural consiste en un sistema de reglas de inferencia que permite construir deducciones, es decir, a partir de "algo" podemos deducir o "llegar a" "otra cosa", hasta que encontramos una conclusión. Se trata de un método puramente sintáctico donde sólo nos ocupamos de la manipulación de símbolos. Es un método interesante para construir demostraciones, sin embargo es difícilmente mecanizable.

Por otro lado, como hemos visto, es fácil representar hechos del mundo real mediante la lógica proposicional y mediante la lógica de predicados. Además mediante la lógica de predicados podemos representar el conocimiento que tenemos sobre un cierto mundo finito poniéndolo en forma de sentencias y disponemos de un mecanismo para razonar con ese conocimiento. Sin embargo, lo que para el ser humano resulta trivial, deducir una sentencia a partir de otra, para la máquina puede llegar a ser computacionalmente muy costoso e, incluso, inviable. Los estudios, por tanto, se han centrado en conseguir un método de demostración que se puede ejecutar en un tiempo finito, y que en dicho tiempo, de forma eficiente, nos proporcione una solución acertada.

El Método de Resolución [Robinson, 1965], es un intento de mecanizar el proceso de deducción natural de esa forma eficiente. Las demostraciones se consiguen utilizando el método refutativo (reducción al absurdo), es decir lo que intentamos es encontrar contradicciones. Para probar una sentencia nos basta con demostrar que su negación nos lleva a una contradicción con las sentencias conocidas (es insatisfactible). Si la negación de una sentencia entra en contradicción con los hechos de nuestra base de conocimiento es porque lo contrario, es decir, la sentencia original era verdadera y se puede deducir lógicamente de las sentencias que componen dicha base de conocimientos.

Existen distintas Estrategias de Resolución: sistemática, con conjunto soporte, unitaria, primaria y lineal.

En este apartado formularemos detalladamente el método de Resolución por Refutación Lineal. Para ello, es necesario conocer el proceso de conversión a forma clausal, ya que las cláusulas con las que se trabaja en esta técnica deben tener una forma específica. Por otro lado, hemos de definir también el proceso o algoritmo de Unificación, paso imprescindible en este método de Resolución.

[ÍNDICE]

Conversión a forma clausal.

El proceso de conversión a forma clausal consiste en transformar las sentencias y fórmulas en cláusulas, cuya principal característica, al nivel de representación, es la ausencia casi total de símbolos de relación. En una cláusula sólo aparecerán disyunciones "Ú ".

De esta manera, el primer paso será transformar todas las sentencias a una forma canónica llamada forma normal conjuntiva [Davis y Putnam, 1960], a partir de la cual obtendremos el conjunto de cláusulas. Así, podemos definir una cláusula, más formalmente, como una fórmula en forma normalizada conjuntiva que no tiene ninguna conectiva. Esta transformación la vamos a realizar en varios pasos:

  1. Primero pasaremos las sentencias a Forma Normal Prenexa.
  2. En el siguiente paso las transformaremos a Funciones de Skolem.
  3. Finalmente llegaremos a una representación en Forma de Cláusulas.

[ÍNDICE]

Forma Prenexa

Una fórmula está en Forma Normal Prenexa si es de la forma: Q1x1...QnxnY donde Y es una fórmula desprovista de cuantificadores y escrita como conjunción de disyunciones, Q1,...,Qn Î {" , $ } y x1,..., xn son variables.

Ejemplos:

" x " y $ z " v [(R(x) Ú T(y)) Ù Q(v, z)]

" x $ y (R(x, y) Ù Q(b, z))

" x P(x, y)

 

Tenemos nuestro conocimiento en forma de sentencias, formadas por símbolos de relación, variables, constantes, cuantificadores, todos mezclados. Para transformar una fórmula a Forma Normal Prenexa seguiremos el siguiente algoritmo:

Ejemplos:

" x P(x) Ú " x Q(x) º " y P(y) Ú " x Q(x)

" x [P(x) Ú Q(x)] Ù " y R(y) Ú Q(x) º " z [P(z) Ú Q(z)] Ù " y R(y) Ú Q(x)

 

Ejemplos:

" x P(x) Ú " x Q(x)

" y " x [P(y) Ú Q(x)]

(" x R(x) Ú " y T(y)) Ù $ z " v Q(v Ú z)

" x " y $ z" v [(R(x) Ú T(y)) Ù Q(v Ú z)]

 

[ÍNDICE]

Funciones de Skolem

El siguiente paso es convertir las fórmulas de Forma Normal Prenexa a Fórmulas de Skolem, que se caracterizan por no estar cuantificadas existencialmente. Por tanto, el algoritmo de transformación a forma de Skolem elimina los cuantificadores existenciales.

Partimos de una fórmula: Q1x1...QnxnY. Se recorre la fórmula en forma prenexa de izquierda a derecha y se eliminan los cuantificadores existenciales según los dos casos siguientes:

Ejemplos:

1. Supongamos que tenemos:

" x " y $ z [(R(x) Ú P(y)) Ù Q(b, z)]

nos queda como

" x " y [(R(x) Ú P(y)) Ù Q(b, f(x, y))]

 

2. Supongamos la siguiente sentencia:

$ x " y $ w [R(a, w) Ú P(y) Ú P(f(x))]

sustituimos x por c (caso 1): " y $ w [R(a, w) Ú P(y) Ú P(f(c))]

sustituimos w por g(y) (caso 2): " y [R(a, g(y)) Ú P(y) Ú P(f(c))]

 

Todos los pasos que hemos visto podemos resumirlos en el siguiente algoritmo, que es justamente el algoritmo general de conversión a forma clausal:

  1. Convertir la fórmula a Forma Normal Prenexa.
  2. Transformarla a Forma de Skolem.
  3. Pasar a Forma Normal Conjuntiva.
  4. Separar cada conjunción en una cláusula.

Ejemplo:

Vamos a partir de la sentencia:

" x [(R(x) Ú C(x, a)) Ù [O(x, b) Ú ($ y($ z O(y, z) ® L(x,y)))]]

Paso 1: Eliminamos los símbolos de implicación:

" x [(R(x) Ú C(x, a)) Ù [O(x, b) Ú ($ y(Ø $ z O(y, z) Ú L(x,y)))]]

Paso 2: Reducimos el ámbito de las negaciones:

" x [(R(x) Ú C(x, a)) Ù [O(x, b) Ú ($ y(" z Ø O(y, z) Ú L(x,y)))]]

Paso 3: En este caso no es necesario normalizar las variables de los cuantificadores por lo tanto pasamos al paso siguiente

Paso 4: Movemos los cuantificadores a la izquierda:

" x $ y " z [(R(x) Ú C(x, a)) Ù (O(x, b) Ú (Ø O(y, z) Ú L(x,y)))]

Paso 5: Eliminamos los cuantificadores existenciales:

" x " z [(R(x) Ú C(x, a)) Ù (O(x, b) Ú (Ø O(s(x), z) Ú L(x, s(x))))]

Paso 6: Eliminamos todos los cuantificadores: [(R(x) Ú C(x, a)) Ù (O(x, b) Ú (Ø O(s(x), z) Ú L(x, s(x))))]

Paso 7: Separar una cláusula por cada conjunción:

(R(x) Ú C(x, a))

(O(x, b) Ú (Ø O(s(x), z) Ú L(x, s(x))))

[ÍNDICE]

Algoritmo de Unificación.

Podemos definir la Unificación como un procedimiento de emparejamiento que compara dos literales y descubre si existe un conjunto de sustituciones que los haga idénticos. La idea básica de la unificación es muy sencilla. Para unificar dos literales vamos recorriéndolos de izquierda a derecha. En primer lugar se comprueba si los predicados coinciden. Si es así, seguimos adelante; si no es que no son unificables. Si el predicado concuerda, comenzamos a comparar los argumentos. Si el primero de ellos coincide en ambos literales, continuamos con el siguiente... y así hasta completar todos los argumentos. Como resulta obvio, ambos literales deben tener el mismo número de argumentos.

Para conseguir que cada argumento de un literal sea coincidente con su homólogo en el otro literal, debemos buscar una sustitución que nos permita emparejarlos. La única condición que debe reunir esta sustitución es que ha de aplicarse a todo el literal, es decir, que la sustitución afecta a todo el literal, y no sólo al argumento en cuestión. Por decirlo de una manera sencilla, las sustituciones se van arrastrando a lo largo del proceso de unificación.

Ejemplo:

Vamos a unificar P(x, x) con P(y, z):

  • Primera sustitución: (y/x)

Resultado: P(y, y) P(y, z)

  • Segunda sustitución: (z/y)

Resultado: P(z, z) P (z, z)

La sustitución resultante es la composición de las sustituciones: s = { z/y , y/x}

 

Describamos a continuación los pasos básicos del algoritmo de unificación:

Tomamos como entrada dos cláusulas, R y S.

  1. Si R = S entonces R y S son unificables.
  2. Si no, localizar el símbolo más a la izquierda de R que se diferencia de su homólogo en S
    1. Si es el primero (predicado), entonces R y S no son unificables.
    2. Si es uno de los argumentos, entonces sean t1, t2 los términos en los que difieren.
      1. Si ninguno de los dos (t1, t2) es una variable, entonces las cláusulas no son unificables. Tampoco lo serán si siendo uno de ellos una variable, está presente en las variables del otro.
      2. Si t1 es una variable x y no está entre las variables del otro t2, entonces haremos la sustitución: s = {x/t2}

  3. Volver al paso 1.

A partir del algoritmo de unificación podemos extraer las siguientes conclusiones:

  1. Podemos señalar como unificables todas aquellas cláusulas que no coincidan en su predicado y número de argumentos.
  2. Antes de intentar la unificación debemos asegurarnos que no existen variables comunes en ambas cláusulas.
  3. Debemos recordar siempre las condiciones que debe reunir una sustitución y que ésta debe ser única.

Ejemplo:

Unificación de las sentencias R (x, f(g(x)), a) y R (b, y, z)

Términos desiguales Sustitución Resultado

 

t1 = x t2 = b x/b - R(b, f(g(b)), a) , R(b, y, z)

 

t1 = f(g(b)) t2 = y y/f(g(b)) - R(b, f(g(b)), a), R(b, f(g(b)), z)

 

t1 = a t2 = z z/a - R(b, f(g(b)), a) , R(b, f(g(b)), a)

Las dos cláusulas son unificables y la sustitución resultante es: s = { z/a , y/f(g(b)) , x/b }

 

Una vez que hemos comprendido como funciona el algoritmo de unificación y cómo debemos especificar adecuadamente las sentencias para llevar a cabo el algoritmo de resolución por refutación, vamos a describir los pasos del mismo detenidamente.

[ÍNDICE]

Algoritmo de Resolución

El procedimiento de resolución consiste en un proceso iterativo en el cual comparamos (resolvemos), dos cláusulas llamadas cláusulas padres y producimos una nueva cláusula que se ha inferido (deducido), de ellas. Por tanto, lo que hacemos es combinar las cláusulas padres para dar lugar a una nueva cláusula, en la que podemos simplificar alguno de sus términos.

Por ejemplo, supongamos que tenemos las cláusulas siguientes (ambas verdaderas):

Aplicando resolución, podemos combinar ambas cláusulas y obtener:

Ahora podemos hacer una simplificación, ya que (invierno Ù Ø invierno) es una tautología, con lo que nos queda:

Que también deberá ser verdadera, pues hemos seguido puntualmente todas las propiedades de la lógica de primer orden.

La resolución opera tomando dos cláusulas tales que cada una contenga un mismo literal, en una cláusula en forma positiva y en la otra en forma negativa. El resolvente se obtiene combinando todos los literales de las cláusulas padres y eliminando aquellos que se cancelan.

Si la cláusula resultante es la cláusula vacía (€), entonces es que hemos llegado a una contradicción.

Como observamos el proceso de resolución parece sencillo. Podemos resumirlo formalmente en los pasos siguientes, basados en el algoritmo de resolución lineal:

Vamos a partir de un conjunto de cláusulas. Nuestro objetivo es probar una sentencia mediante la demostración de que su negación nos lleva a una contradicción con las sentencias conocidas (es insatisfacible):

  1. Convertimos todas las proposiciones a forma clausal.
  2. Negamos la proposición que queremos demostrar y convertimos el resultado a forma clausal añadiendo la cláusula resultante al conjunto obtenido en el paso anterior.
  3. Hasta que se encuentre una contradicción o no se pueda seguir avanzando, repetimos lo siguiente:
    1. Seleccionamos dos cláusulas (cláusulas padres) que contengan un literal común pero con signos contrarios y unificamos esos dos literales.
    2. Las resolvemos juntas. La cláusula resultante llamada resolvente, será la disyunción de los literales de las dos cláusulas padres, una vez realizadas las sustituciones apropiadas. El par de literales L y Ø L, que provienen de cada una de las cláusulas padres, se pueden eliminar de la resolvente.
    3. Si la resolvente es la cláusula vacía, es que se ha encontrado una contradicción. Si no, añadimos la resolvente al conjunto de cláusulas disponibles.

El algoritmo que acabamos de ver está definido de una forma muy general. Sin embargo, para su uso cotidiano se pueden hacer una serie de sugerencias que, si bien en la mayoría de los casos no están basadas en aserciones infalibles, pueden facilitar el proceso general de resolución:

Ejemplo:

A partir de la base de conocimiento siguiente, compuesta por 5 cláusulas, aplicar resolución para demostrar que la hipótesis V(z) es cierta:

P(x) Ú Q(c, x) Ú Ø S(y, x) y P(a) Ú Ø R(z) Ú S(b, a) y Ø Q(z, a) Ú V(a) y R(x) Ú V(y) y

Ø P(y) Ú Q(x, y)

Ya tenemos las proposiciones en forma de cláusulas, luego sólo nos falta agregar la hipótesis, transformarla en cláusula y añadirla al conjunto de sentencias anterior:

V(z) negada nos queda Ø V(z). (Como vemos está en forma de cláusula).

Dado que las sustituciones afectan a todas las ocurrencias de la variable que se pretende sustituir en toda la base de conocimientos, si queremos que dicha sustitución afecte a muchas ocurrencias de una variable podemos intentar renombrarlas. Pero para evitar tener todas las variables renombradas y, por tanto, evitar la complicación del procedimiento, estableceremos un uso especial de las sustituciones. Sólo afectarán a las cláusulas padres en el momento de la resolución, y a la cláusula resolvente, quedando el resto inalteradas.

Comenzamos el proceso por las cláusulas de mayor tamaño:

P(x) Ú Q(c, x) Ú Ø S(y, x) y P(a) Ú Ø R(z) Ú S(b, a) con la sustitución s = {y/b, x/a} nos queda:

P(x) Ú Q(c, x) Ú Ø S(y, x) Ú P(a) Ú Ø R(z) Ú S(b, a) = P(a) Ú Q(c, a) Ú Ø R(z).

Combinamos la resolvente con Ø P(y) Ú Q(x, y) con la sustitución s = {y/a} nos queda:

P(a) Ú Q(c, a) Ú Ø R(z) Ú Ø P(y) Ú Q(x, y) = Q(c, a) Ú Ø R(z) Ú Q(x, a).

Aplicamos a la resolvente la sustitución s = {x/c} y nos queda:

Q(c, a) Ú Ø R(z).

Combinamos la resolvente con Ø Q(z, a) Ú V(a) con la sustitución s = {z/c} nos queda:

Q(c, a) Ú Ø R(z) Ú Ø Q(z, a) Ú V(a) = Ø R(c) Ú V(a).

Combinamos la resolvente con R(x) Ú V(y) con la sustitución s = {x/c} nos queda:

Ø R(c) Ú V(a) Ú R(x) Ú V(y) = V(a) Ú V(y).

Aplicamos la sustitución s = {y/a} y nos queda V(a) que podemos combinar con Ø V(z) obteniendo la cláusula vacía.

[ÍNDICE]