• No se han encontrado resultados

La resolución como algoritmo para la solución de problemas

In document Logica Computacional UNED (página 132-134)

Parte II. FORMALISMOS PARA PROGRAMACIÓN

3.1 Cómo interpretar una fórmula lógica como un programa

3.1.2 La resolución como algoritmo para la solución de problemas

En capítulos anteriores hemos visto cómo las técnicas de resolución se aplican a sistemas de axiomas expresados en forma clausulada. Vimos también cómo cualquier fórmula lógica podía expresarse en esta forma. Habitualmente los axiomas se declaran a modo de reglas:

Si premisa1 y premisa2 y ... entonces conclusiones Formalmente, se escribe:

A = ∀x1...∀xk(B1∧ ... ∧ Bm→ B)

donde B y Bi son los átomos que representan, respectivamente, la conclusión (o consecuente) y

las correspondientes premisas (o antecedentes). En el caso degenerado en que no hay antecedentes, la fórmula se escribe: A = ∀x1...∀xkB.

En un capítulo anterior vimos cómo traducir este tipo de fórmulas a una clase particular de cláusu- las denominadas cláusulas de Horn, en el caso de la lógica proposicional. La extensión del concepto de cláusula de Horn al caso de la lógica de predicados es inmediata. En esta sección recordaremos cómo aplicar el método de resolución en sistemas de cláusulas de Horn para dictaminar si una fórmula G es una consecuencia lógica de un conjunto de axiomas. A continuación veremos cómo la aplica- ción de dicho método puede interpretarse como la ejecución de un programa lógico que averigua la satisfacibilidad de la fórmula G.

La traducción a forma normal conjuntiva de una regla, prescindiendo de los cuantificadores y eliminando el condicional, es inmediata:

A = ¬(B1∧ ... ∧ Bm) ∨ B = ¬B1∨ .... ∨ ¬Bm∨ B

Podemos ahora aplicar el método de resolución para dictaminar si una fórmula escrita en forma normal conjuntiva G = G1∧ ... ∧ Gl es una consecuencia lógica del conjunto de axiomas: basta con

añadir ¬G al conjunto de axiomas, expresados en forma clausulada, y refutarla por resolución. ¬G se denomina habitualmente ”la cláusula objetivo”.

Un conjunto de axiomas es presumiblemente satisfacible, de modo que en la refutación no tiene sentido buscar resolventes entre los axiomas; en lugar de ello buscaremos resolver la cláusula objetivo con un axioma. Como ¬G se expresa como una disyunción de literales negativos, ¬G = ¬(G1

... ∧ Gl) = ¬G1∨ ... ∨ ¬Gl, sólo existe la posibilidad de que uno de tales literales negativos, ¬Gi,

se resuelva con el único literal positivo del axioma, B. El resolvente será por tanto una clásula que constará sólo de literales negativos:

¬B1∨ ... ∨ ¬Bm∨ ¬G1∨ . . . ∨ ¬Gi−1∨ ¬Gi+1∨ . . . ∨ ¬Gl

.

Por tanto, todos los resolventes que aparezcan a lo largo de la refutación contendrán sólo literales negativos. Eventualmente, la resolución tendrá lugar con axiomas que no tengan antecedentes, es decir, axiomas cuyas formas clausuladas consistan en un único literal positivo. Progresivamente se producirán resolventes más cortos y, finalmente, la cláusula vacía. De este modo quedará refutada la fórmula ¬G y se habrá probado la satisfacibilidad de la fórmula G.

1 subcadena(x, x)

2 ¬ subcadena(x, y) ∨ ¬ su f i jo(y, z) ∨ subcadena(x, z)) 3 su f i jo(x, y · x)

4 ¬ subcadena(x, y) ∨ ¬ pre f i jo(y, z) ∨ subcadena(x, z)) 5 pre f i jo(x, x · y)

Una forma de probar que la fórmula subcadena(a · b · c, a · a · b · c · c) es una consecuencia lógica de la teoría es refutar mediante resolución la fórmula ¬ subcadena(a · b · c, a · a · b · c · c), según se describe en la siguiente secuencia:

6 ¬ substr(a · b · c, a · a · b · c · c)

7 ¬ substr(a · b · c, y1) ∨ ¬ su f f ix(y1, a · a · b · c · c) ( de 6 y 2 con x = a · b · c, z = a · a · b · c · c)

8 ¬ substr(a · b · c, a · b · c · c) (resolvente de 7 y 3) 9 ¬ substr(a · b · c, y2) ∨ ¬ pre f ix(y2, a · b · c · c) (resolvente de 8 y 4)

10 ¬ substr(a · b · c, a · b · c) (resolvente de 9 y 5)

11 ¤ (resolvente de 10 y 1)

Como vimos en la sección anterior, resulta más intuitivo ver este sistema axiomático como un programa si se utiliza el operador de implicación inversa ←. Abreviadamente (asumiendo que to- das las variables están cuantificadas de forma universal y que las comas en el antecedente denotan conjunción.), la teoría se transforma entonces en:

1. subcadena(x, x)

2. subcadena(x, z) ← subcadena(x, y), su f i jo(y, z)) 3. su f i jo(x, y · x)

4. subcadena(x, z) ← (subcadena(x, y), pre f i jo(y, z)) 5. pre f i jo(x, x · y)

Bajo esta perspectiva, la refutación de ¬ subcadena(a · b · c, a · a · b · c · c), prueba de que la cláusula básica subcadena(a · b · c, a · a · b · c · c) es una consecuencia lógica de los axiomas de la teoría de cadenas, puede verse como la aplicación de un procedimiento o programa para averiguar si la cadena a · b · c es una subcadena de la cadena a · a · b · c · c. Los distintos pasos del procedimiento de resolución pueden verse como subprocedimientos de un procedimiento principal.

La utilidad de este programa se ve más claramente si la fórmula bajo prueba es: ωsubcadena(ω, a · a · b · c · c)

El procedimiento de prueba consiste en este caso en refutar en el sistema de axiomas la fórmula ¬(∃ωsubcadena(ω, a · a · b · c · c))

equivalente a:

ω¬ subcadena(ω, a · a · b · c · c)

Es fácil ver que el proceso de resolución produce como resultado la clásula vacía bajo la sustitu- ción:

{ω← a · b · c}

El procedimiento, en este caso, no sólo sirve para probar que la fórmula ∃ωsubcadena(ω, a · a · b · c · c) es una consecuencia lógica de los axiomas, sino que además ”computa” un valor deω= a · b · c que hace cierta la fórmula subcadena(ω, a · a · b · c · c).

Ejercicio 3.5 Muestre cómo puede utilizarse el sistema de cláusulas siguiente :

3.1. Cómo interpretar una fórmula lógica como un programa 123 2. ∀n∀n1∀m∀m1((n > 0) ∧ (n1= n − 1) ∧ Fact(n1, m1) ∧ (m = n ∗ m1) → Fact(n, m))

para calcular el factorial del número 3.

Idem en el caso del sistema de cláusulas solución del ejercicio 3.3 y el problema de ordenar los números 9, 2 y 5.

La refutación de fórmulas en un sistema de axiomas sirve de mecanismo de inferencia genérico de los programas lógicos. Ha de observarse, no obstante, que la conversión de un procedimiento de refutación en un programa no es del todo inmediata. El programa esbozado anteriormente es altamente no determinista, ya que el procedimiento de refutación generalmente lo es: en cada paso puede darse la opción de qué literal resolver y de qué axioma, ya que la resolución puede ser posible con más de un axioma y utilizando distintos literales. Esto significa que no se ha especificado por completo el control de ejecución, condición indispensable para que un algoritmo pueda ejecutarse de forma automática. Traducir un procedimiento de refutación a un programa exige especificar reglas que fijen las opciones anteriores. Tales reglas concretan la semántica operacional del lenguaje de programación lógica utilizado. Entre las mencionadas reglas cabe distinguir entre reglas de computación y reglas de búsqueda, que a continuación definimos.

Definición 3.6 Regla de computación: Regla que indica el literal y la cláusula objetivo con que se

efectuará una resolución.

Definición 3.7 Regla de búsqueda: Regla que indica la cláusula con que se efectuará una resolución

con un literal y cláusula objetivo previamente escogidos.

In document Logica Computacional UNED (página 132-134)