Вы находитесь на странице: 1из 25

3.

1 REPASO DE LA LÓGICA DE PRIMER ORDEN

La lógica de primer orden analiza las frases sencillas del lenguaje (fórmulas
atómicas o elementales) separándolas en Términos y predicados. Los términos
hacen referencia a los objetos. Además, dichas fórmulas atómicas se pueden
combinar mediante Conectivas permiten construir formulas mas complejas,
llamadas formulas moleculares.

La lógica de primer orden es, a su vez, lenguajes formales con cuantificadores que
alcanzan solo a variables de individuo, con predicados y funciones cuyos
argumentos son solo constantes o variables de individuo.

Los conceptos básicos de la lógica de primer orden son.

 Predicados

 Constantes de individuos

 Variables de individuos

 Cuantificadores

 Conectivas

 Argumentos

1
Predicados
Se utilizan para expresar propiedades de los objetos, predicados monádicos, y
relaciones entre ellos, predicados poliádicos. En Prolog los llamaremos hechos.

Debemos tener en cuenta que:

• Los nombres de todos los objetos y relaciones deben comenzar con una letra
minúscula.

• Primero se escribe la relación o propiedad: predicado

• Y los objetos se escriben separándolos mediante comas y encerrados entre


paréntesis: argumentos.

• Al final del hecho debe ir un punto (".").

Ø simbolo_de_predicado(arg1,arg2,...,argn).

Tanto para los símbolos de predicado como para los argumentos, utilizaremos en
Prolog constantes atómicas.

Ejemplos (ej01.pl):

/* Predicados monádicos: PROPIEDADES */

/* mujer(Per) <- Per es una mujer */


mujer(clara).
mujer(chelo).

/* hombre(Per) <- Per es un hombre*/


hombre(jorge).
hombre(felix).
hombre(borja).
/* moreno(Per) <- Per tiene el pelo de color oscuro */ moreno(jorge).

2
/* Predicados poliádicos: RELACIONES */

/* tiene(Per,Obj) <- Per posee el objeto Obj */ tiene(jorge,moto).

/* le_gusta_a(X,Y) <- a X le gusta Y */ le_gusta_a(clara,jorge).


le_gusta_a(jorge,clara). le_gusta_a(jorge,informatica).
le_gusta_a(clara,informatica).

/* es_padre_de(Padre,Hijo-a) <- Padre es el padre de Hijo-a */


es_padre_de(felix,borja).

es_padre_de(felix,clara).

/* es_madre_de(Madre,Hijo-a) <- Madre es la madre de Hijo-a */


es_madre_de(chelo,borja).

es_madre_de(chelo, clara).

/* regala(Per1,Obj,Per2) <- Per1 regala Obj a Per2 */ regala(jorge, flores,


clara).

3
CONSTANTES DE INDIVIDUOS

Una constante de individuo es una expresión lingüística que refiere a una entidad.
Por ejemplo «Marte», «Júpiter», «Caín» y «Abel» son constantes de individuo.
También lo son las expresiones «1», «2», etc., que refieren a números.

Una entidad no tiene que existir para que se pueda hablar acerca de ella, de modo
que la lógica de primer orden tampoco hace supuestos acerca de la existencia o no
de las entidades a las que refieren sus constantes de individuo.

VARIABLES DE INDIVIDUOS

Además de las constantes de individuo que hacen referencia a entidades


determinadas, la lógica de primer orden cuenta con otras expresiones, las variables,
cuya referencia no está determinada. Su función es similar a la de las expresiones
del lenguaje natural como «él», «ella», «esto», «eso» y «aquello», cuyo referente
varía con el contexto. Las variables generalmente se representan con letras
minúsculas cerca del final del alfabeto latino, principalmente la x, y, z.

Del mismo modo, en la matemática, la x en la función f(x) = 2x no representa ningún


número en particular, sino que es algo así como un espacio vacío donde pueden
insertarse distintos números. En conclusión, podemos representar una expresión
como «esto es antiguo» con la expresión:

Antiguo(x) o A(x).

Es evidente, sin embargo, que hasta que no se determine a qué refiere la x, no es


posible asignar un valor de verdad a la expresión «esto es antiguo», del mismo
modo que hasta que no se determine un número para la x en la función f(x) = 2x, no
será posible calcular ningún valor para la función.

Por supuesto, al igual que con las constantes de individuo, las variables sirven
también para formalizar relaciones. Por ejemplo, la oración «esto es más grande
que aquello» se formaliza: G(x,y) Y también pueden combinarse constantes de
individuo con variables. Por ejemplo en la oración «ella está sentada entre Bruno y
Carlos»: S(x,b,c)

4
CUANTIFICADORES

Considérese ahora la siguiente expresión matemática: x < 3. Esta expresión no


es ni verdadera ni falsa, y parece que no lo será hasta que no reemplacemos a la x
por algún número cualquiera. Sin embargo, también es posible dar un valor de
verdad a la expresión si se le antepone un cuantificador. Un cuantificador es una
expresión que afirma que una condición se cumple para un cierto número de
individuos. En la lógica clásica, los dos cuantificadores más estudiados son el
cuantificador universal y el cuantificador existencial.

El primero afirma que una condición se cumple para todos los individuos de los que
se está hablando, y el segundo que se cumple para al menos uno de los individuos.
Por ejemplo, la expresión "para todo x" es un cuantificador universal, que
antepuesto a "x < 3", produce: Para todo x, x < 3. Esta es una expresión con valor
de verdad que resulta una expresión falsa, pues existen muchos números (muchos
x) que son mayores que tres.

Anteponiendo en cambio la expresión "para al menos un x", un cuantificador


existencial, se obtiene: para al menos un x, x < 3. La cual resulta ser una expresión
verdadera. Sin embargo, el valor de verdad de las dos expresiones anteriores
depende de qué números se esté hablando. En lógica, a aquello de lo que se está
hablando cuando se usa algún cuantificador, se lo llama el dominio de discurso.

Tómese por caso la afirmación "todos son amigables".

Esta oración puede traducirse así: Para todo x, x es amigable.

Y una oración como "alguien está mintiendo" puede traducirse: Para al menos un x,
x esta mintiendo. También es frecuente traducir esta última oración así: Existe al
menos un x, tal que x está mintiendo.

A continuación se formalizan ambas oraciones, introduciendo la notación especial


para los cuantificadores:

Para todo x, x es amigable. ∀x A(x)

Existe al menos un x, tal que x está mintiendo. ∃x M(x)

5
TERMINOS

Los términos pueden ser constantes o variables, y suponemos definido un dominio


no vacío en el cual toman valores (Universo del Discurso).

Se toma como dominio el Universo de Herbrand. Para saber cuántos individuos del
universo cumplen una determinada propiedad o relación, cuantificamos los
términos.

Las constantes se utilizan para dar nombre a objetos concretos del dominio, dicho
de otra manera, representan individuos conocidos de nuestro Universo. Además,
como ya hemos dicho, las constantes atómicas de Prolog también se utilizan para
representar propiedades y relaciones entre los objetos del dominio. Hay dos clases
de constantes:

Átomos: existen tres clases de constantes atómicas:

Cadenas de letras, dígitos y subrayado (_) empezando por letra minúscula.

Cualquier cadena de caracteres encerrada entre comillas simples (').

Combinaciones especiales de signos: "?-", ":-", ...

Números: se utilizan para representar números de forma que se puedan realizar

operaciones aritméticas. Dependen del ordenador y la implementación 4.

Enteros: en la implementación de Prolog-2 puede utilizarse cualquier entero que el


intervalo [-223,223-1]=[-8.388.608,8.388.607].

6
Reales: decimales en coma flotante, consistentes en al menos un dígito,
opcionalmente un punto decimal y más dígitos, opcionalmente E, un

«+» o «-» y más dígitos.

Ejemplos de constantes:

átomos válidos átomos no válidos números válidos nº no


válidos

f 2mesas -123 123-

vacio Vacio 1.23 .2

juan_perez juan-perez 1.2E3 1.

'Juan Perez' _juan 1.2E+3 1.2e3

a352 352a 1.2E-3 1.2+3

Las variables se utilizan para representar objetos cualesquiera del Universo u


objetos desconocidos en ese momento, es decir, son las incógnitas del problema.
Se diferencian de los átomos en que empiezan siempre con una letra mayúscula o
con el signo de subrayado (_). Así, deberemos ir con cuidado ya que cualquier
identificador que empiece por mayúscula, será tomado por Prolog como una
variable. Para trabajar con objetos desconocidos cuya identidad no nos interesa,
podemos utilizar la variable anónima (_). Las variables anónimas no están
compartidas entre sí.

Ejemplos de variables: X Sumando Primer_factor

_indice

_ (variable anónima)

7
Una variable está instanciada cuando existe un objeto determinado representado
por ella. Y está no instanciada cuando todavía no se sabe lo que representa la
variable. Prolog no soporta asignación destructiva de variables, es decir, cuando
una variable es instanciada su contenido no puede cambiar.

La manipulación de datos en la programación lógica se realiza por medio de la


unificación.

Explícitamente Prolog no utiliza los símbolos de cuantificación para las variables,


pero implícitamente sí que lo están. En general, todas las variables que aparecen
están cuantificadas universalmente, ya que proceden de la notación en forma
clausal, y, por tanto, todas las variables están cuantificadas universalmente aunque
ya no escribamos explícitamente el cuantificador (paso 6ª de la transformación a
forma clausal : eliminación de cuantificadores universales). Pero veamos que
significado tienen dependiendo de su ubicación. Si las fórmulas atómicas de un
programa lógico contienen variables, el significado de estas es :

Las variables que aparecen en los hechos están cuantificadas universalmente ya


que en una cláusula todas las variables que aparecen están cuantificadas
universalmente de modo implícito.

gusta(jorge,X). equivale a la fórmula x gusta(jorge,x)

y significa que a jorge le gusta cualquier cosa

8
• Las variables que aparecen en la cabeza de las reglas (átomos afirmados)
están cuantificadas universalmente. Las variables que aparecen en el cuerpo de la
regla (átomos negados), pero no en la cabeza, están cuantificadas
existencialmente.

abuelo(X,Y) :- padre(X,Z), padre(Z,Y). equivale a la fórmula

x y z [abuelo(x,y) ¬padre(x,z) ¬padre(z,y)]

x y [abuelo(x,y) z ¬[padre(x,z) padre(z,y)] ]

x y [abuelo(x,y) ¬ z [padre(x,z) padre(z,y)] ]

x y[ z [padre(x,z) padre(z,y)] abuelo(x,y) ]

que significa que para toda pareja de personas, una será el abuelo de otra si existe
alguna persona de la cuál el primero es padre y a su vez es padre del segundo

• Las variables que aparecen en las preguntas están cuantificadas


existencialmente.

?- gusta(jorge,X) equivale a la fórmula x ¬gusta(jorge,x) ¬ x


gusta(jorge,x)

y que pregunta si existe algo que le guste a jorge, ya que utilizamos refutación y por
tanto negamos lo que queremos demostrar.

9
3.2 UNIFICACION Y RESOLUCION

Cuando se tienen sentencias compuestas por predicados y conectivos lógicos, se


debe evaluar la veracidad de cada uno de sus componentes para determinar si toda
la sentencia es verdadera o falsa. Para ello, se busca en el conjunto de axiomas la
forma de establecer la veracidad de los predicados componentes.

Un predicado componente se dice que es verdadero si se identifica con un axioma


de la base de información. En la lógica de predicados, este proceso es algo
complicado ya que las sentencias pueden tener términos variables. A los predicados
que tienen variables por argumentos, se los denomina patrones.

La unificación es el proceso de computar las sustituciones apropiadas que permitan


determinar si dos expresiones lógicas, ya sean predicados o patrones, coinciden.

El proceso de unificación involucra los siguientes pasos:

 Todo predicado que no contenga variables en sus argumentos, deben tener


un axioma que se identifique totalmente, para considerarlo como verdadero.

 Si un predicado contiene una variable, esta debe ser asociada a un valor


determinado. Esta asociación se realiza buscando en la base de axiomas y
seleccionando todos aquellos que se identifican con el patrón en todo,
excepto por la variable. La variable es asociada con el valor en la posición
correspondiente del axioma. Si más de un axioma se identifica con el
predicado dado, todos los valores asociados son considerados y son tratados
separadamente.

 El proceso de identificación continua asumiendo que el valor de la variable


es el valor asociado, en cualquier lugar que esta aparezca.

 Los conectivos lógicos son aplicados a todos los predicados, para determinar
la veracidad de la sentencia dada.

10
Las fórmulas que se desea unificar. Su resultado, el unificador, se expresa como un
conjunto de pares substitución/variable para cada una de las variables asignadas
(este conjunto recibe también el nombre de substitución). El valor de substitución
para una variable puede ser cualquier término del lenguaje lógico utilizado
(exceptuando términos con la misma variable). Por ejemplo, se pueden unificar las
fórmulas

padre(X, hermano(Y))

padre(juan, Z)

utilizando el unificador { juan / X, hermano(Y) / Z }.

También se podría utilizar la substitución { juan / X, hermano(pedro) / Z, pedro / Y },


pero aquí se introduce una asignación suplementaria que no es necesaria para
unificar. Para evitar introducir substituciones arbitrarias, se utiliza el unificador más
general, es decir, el que minimiza las restricciones impuestas a los valores de las
variables (en este caso concreto, Y puede tomar cualquier valor).

La unicación es una operación sintáctica.

Por ejemplo, no se puede unificar padre(X, hermano(Y)) con padre(pedro, julio)


porque no hay ninguna substitución de variables que haga sintácticamente iguales
a hermano(Y) y julio.

Composición de substituciones
La aplicación de una substitución s a una fórmula F se escribe F s y entrega como
resultado una nueva fórmula en que las variables asignadas han sido reemplazadas
por sus respectivos valores. Por ejemplo:

F = padre(X, hermano(Y))
s= { juan / X, hermano(Y) / Z }
F s = padre(pedro, hermano(Y))

11
Si F = padre(pedro, Z) se obtiene el mismo resultado (ya que s es el unificador de
ambas fórmulas).

Dos substituciones s1 y s2 se pueden aplicar succesivamente con el mismo efecto


que una substitución única equivalente s que corresponde a
la composición de s1 y s2:

(Fs1) s2 = F s

Si los valores de substitución de s2 no hacen referencia a las variables asignadas


en s1, se puede calcular la composición s de la siguiente manera:

s1 = { a1 / X1, a2 / X2,... , a n / Xn }
s2 = { b1 / Y1, b2 / Y2,... , b m / Ym }
Ninguna variable Xj aparece en algún término bk.
s = { a1s2 / X1, a2s2 / X2,... , ans2 / Xn, b1 / Y1, b2 / Y2,... , bm / Ym }

Cálculo del unificador más general


Existe un algoritmo recursivo que entrega como resultado el unificador más
general de dos fórmulas lógicas, o, si no se pueden unificar, una indicación de
falla. Para simplificar la especificación de este algoritmo conviene reescribir las
fórmulas en una notación de "listas" (al estilo LISP) aplicando recursivamernte las
siguientes reglas:

 Términos simples (símbolos de constantes y variables): no se modifican.

 Términos compuestos: a ( t1, t2,... tn) (at1t2... tn)

Ejemplo: padre(X, hermano(Y)) (padre X (hermano Y))

Para aplicar el algoritmo de unificación, se distinguen cuatro tipos de términos:

 símbolos de constantes (incluyendo nombres de predicados y funciones)


 símbolos de variables
 lista vacía
 lista no vacía

12
Una lista no vacía se puede descomponer en la cabeza de la lista y el resto de la
lista (en lisp el car y el cdr). La recursividad del algoritmo se basa en esta
descomposición. El resto de una lista de un sólo elemento es una lista vacía.

Algoritmo de unificación
Hecha la transformación a listas, el algoritmo se escribe de la siguiente manera:
function unify(t1, t2) {
if (t1 = t2)
return {} // unificador vacío
elsif (t1 es una variable)
if (t1 no aparece en t2) return {t2 / t1} // t1 se substituye por t2
else return FAIL // no se puede unificar
elsif (t2 es una variable)
if (t2 no aparece en t1) return {t1 / t2} // t2 se substituye por t1
else return FAIL
elsif (t1 y t2 son listas no vacías) {

ct1 cabeza de t1 ; ct2 cabeza de t2

sc unify(ct1, ct2) ; if (sc = FAIL) return FAIL

rt1 (resto de t1) sc ; rt2 (resto de t2) sc

sr unify(rt1, rt2) ; if (sr = FAIL) return FAIL


return composicion de sc seguido de sr
}
else return FAIL
}

13
EJEMPLOS

ALGORITMO

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.

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.

Ejemplo

Se unificara 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}

14
RESOLUCIÓN

Resolución.- Utiliza refutación para comprobar una determinada sentencia. La


refutación intenta crear una contradicción con la negación de la sentencia original,
demostrando, por lo tanto, que la sentencia original es verdadera. La resolución es
una técnica poderosa para probar teoremas en lógica y constituye la técnica básica
de inferencia en PROLOG, un lenguaje que manipula en forma computacional la
lógica de predicados.

La regla de resolución, establece que:

Si (AÚ B) es verdadero y (~B Ú C) es verdadero,

entonces (A Ú C) también es verdadero

Existen distintas Estrategias de Resolución: sistematica, con conjunto soporte,


unitaria, primaria y lineal.

La resolución es un procesos iterativo en el cual comparamos (resolvemos), dos


clausulas llamadas clausulas padres y producimos una nueva clausula que se ha
inferido (deducido), de ellas.

EJEMPLO

Suponiendo que se tiene las clausulas siguientes ( ambas verdaderas):

 invierno v verano (es invierno o es verano).


 ¬ invierno v frio (hace frio o no es invierno).

Aplicando resolución, podemos combinar ambas clausulas y obtener:

 Invierno v verano v ¬ invierno v frio.

Ahora podemos hacer una simplificación, ya que (invierno ^ ¬ invierno) es una


tautología, con lo que nos queda:

 Verano v frio (es verano o hace frio).

15
La resolución opera tomando dos clausulas tales que cada una contenga un mismo
literal, en una clausula en forma positiva y en la otra en forma negativa. El resolvente
se obtiene combinando todos los literales de las clausulas 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):

Convertimos todas las proposiciones a forma clausal.

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.

Hasta que se encuentre una contradicción o no se pueda seguir avanzando,


repetimos lo siguiente:

Seleccionamos dos cláusulas (cláusulas padres) que contengan un literal común


pero con signos contrarios y unificamos esos dos literales.

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.

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.

16
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:

 Aunque no sea un criterio estricto, suele dar buenos resultados comenzar a


resolver por las cláusulas de mayor tamaño, es decir, las que poseen mayor
número de literales.
 La cláusula resolvente se añade al conjunto de cláusulas disponible y, en
teoría, se puede continuar el proceso tomando dos cláusulas padre
cualesquiera. Sin embargo, al igual que en el caso anterior, suele dar buen
resultado continuar el proceso de resolución a partir de la nueva cláusula
resultante.
 De igual forma, aunque no existe ninguna limitación en cuanto al número de
veces que se puede usar una cláusula para resolver, se recomienda probar
primero a no usar dos veces la misma cláusula antes de usar todas las
cláusulas disponibles.
 Si es posible llegar a la cláusula vacía resolviendo únicamente con las
cláusulas del conjunto inicial sin usar en ningún momento la o las cláusulas
provenientes de la hipótesis, es porque existe una inconsistencia dentro del
conjunto inicial de cláusulas. Ésta puede ser una forma de detectar errores
en el diseño de la base de conocimiento.
 Si en la cláusula resolvente existen dos literales iguales, ésta se puede
simplificar eliminando uno de los dos literales. Puede ser necesaria una
sustitución previa a fin de que esos literales sean unificables y, por tanto,
completamente iguales.
 No es necesario usar todas las cláusulas en el proceso de resolución. En la
mayoría de los casos basta con usar algunas de las cláusulas de la base de
conocimiento y alguna o algunas de las cláusulas proveniente de la hipótesis.

17
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).

18
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.

19
3.3 CLAUSULAS DE HORN RESOLUCIÓN SLD

Una clausula de Horn es una regla de inferencia lógica con una serie de premisas
(cero, una o más) y un único consecuente. Las clausulas de Horn son las
instrucciones básicas del lenguaje de programación Prolog de paradigma
declarativo.

En lógica matemática, una clausula de Horn es una clausula (una disyunción de


literales), con a le sumo, un positivo literal. Lleva ese nombre después que el lógico
ALFRED HORN, quien fuen el primero en señalar la importancia de estas clausulas
en 1951, en el articulo “On sentences which are true of direct unións of algebras”.

Una cláusula de Horn es una cláusula de la forma:


A1 v ... v Ak ← B1 ^ ... ^ Bn, con k=1 ó k=0 y n>=0.
donde A y B representan átomos.
Las cláusulas de Horn con k=1 y n>0 son reglas.
Las cláusulas de Horn con k=1 y n=0 son hechos.
Las cláusulas de Horn con k=0 y n>0 son objetivos.
En las cláusulas de programa (reglas o hechos):
A ← B1 ^ ... ^ Bn, con n>=0
el átomo A es la cabeza y el conjunto de átomos B es el cuerpo.

Ejemplos de los diferentes tipos de cláusulas de Horn:


Regla: hermanas(X,Y)←mujer(X) ^ mujer(Y) ^ padres(X,P,M) ^ padres(Y,P,M)
Hecho: mujer(ana) ←
Objetivo: ← hermanas(X, ana)

20
Interpretación intuitiva de cláusulas de Horn
Una cláusula de la forma

P ¬Q1 ¬Q2 ... ¬Qn

corresponde a una expresión lógica más fácil de leer como

Q1 Q2 ... Qn P

lo que se suele escribir de la siguiente manera

P Q1, Q2, ... Qn.

Las cláusulas con este formato son llamadas reglas. Desde un punto de vista
declarativo, una regla especifica la definición de una relación (P) en función de
otras relaciones (Q1, Q2, ... Qn). Desde un punto de vista procedural, P se
interpreta com un objetivo por cumplir que se descompone en Q1, Q2,
... Qn subobjetivos, los cuales a su vez pueden admitir una descomposición
basada en reglas.

Las cláusulas que se reducen a un solo literal positivo son llamadas hechos y se
escriben

P .

Un hecho corresponde a la definición de una relación elemental.

Las cláusulas que sólo contienen literales negativos

Q1, Q2, ... Qn.

corresponden a objetivos que se deben satisfacer, es decir, a una consulta por


resolver. Nótese que la cláusula es la negación de la consulta original, por lo tanto

21
los cuantificadores universales implícitos en la cláusula corresponden a
cuantificadores existenciales en la consulta original.

Construir una teoría del universo mediante cláusulas de Horn equivale a definir
relaciones relevantes, lo que puede hacerse recursivamente y especificando
varias reglas o hechos por cada relación. Por ejemplo:

ancestro(X,Y) padre(X,Y).

ancestro(X,Y) padre(Z,Y), ancestro(X,Z).

Las consultas pueden verse como ecuaciones lógicas cuyas variables son las
incógnitas por despejar.

Algoritmo de resolución con cláusulas de Horn


La consulta negada siempre se expresa mediante una cláusula que sólo contiene
literales negativos:

Q1, Q2, ... Qi, ... Qn.

Las únicas contradicciones que es posible derivar mediante resolución deben


originarse a partir de esta consulta negada, ya que la teoría del universo no puede
ser inconsistente. Para aplicar resolución se debe identificar entre las reglas (o
hechos) pertenecientes a la teoría del universo, una regla de la forma

Q R1, R2, ... Rm.

tal que la cabeza Q de la regla sea unificable con algún subobjetivo Qi de la


consulta. Si u es el unificador más general para Q y Qi, entonces el resolvente de
la regla es la cláusula

(Q1, Q2, ... Qi-1, R1, R2, ... Rm, Qi+1, ... Qn) u.

que conserva la misma forma que la consulta negada y constituye un nuevo


objetivo por satisfacer.

22
El algoritmo de resolución consiste entonces en iterar la aplicación de la regla de
resolución mientras el objetivo resultante no sea vacío. Nunca se resuelven las
reglas o hechos de la teoría del universo entre sí. Siempre participa la cláusula de
consulta o una cláusula derivada de ella.

La expresión anterior del algoritmo de resolución es no determinística. Para


implementarlo en una máquina secuencial se requiere precisar un orden de
evaluación, lo que se puede lograr mediante los siguientes criterios:

1. Satisfacer siempre primero el primer subobjetivo de la consulta, luego el


primer subobjetivo de la cláusula resultante, y así succesivamente.
2. Ordenar las reglas y hechos de la teoría del universo y elegir siempre la
primera regla unificable para resolver. Cada vez que se utiliza una regla o
un hecho, se reemplazan sus variables por variables frescas creadas
dinámicamente.
3. Cuando ya no se puede seguir resolviendo, volver al último punto de
decisión y elegir la siguiente regla para resolver. Esto constituye
un backtracking que permite recorrer todas las soluciones posibles (siempre
que no hayan recursiones infinitas).

Estos son los criterios definidos en el lenguaje de programación lógica PROLOG.


Además, cada vez que se obtiene un resolvente vacío, se imprimen los valores
asociados a las variables de la consulta, componiendo todas las unificaciones que
fueron necesarias para llegar a ese resultado.

23
RESOLUCIÓN SLD

La resolución general es un mecanismo muy potente de demostración, pero tiene


un alto grado de indeterminismo: en la selección de las clausulas con las que hacer
resolución y en la selección de los literales a utilizar en la resolución.

Los hechos y las reglas se denominan clausulas definidas: Los hechos representan
“hechos acerca de los objetos” (de nuestro universo de discurso), relaciones
elementales entre estos objetos las reglas expresan relaciones condicionales entre
los objetos dependencias.

REGLAS

Un hecho es una regla con cabeza vacía un objetivo es una regla con cabeza vacía
y el éxito es una regla con cabeza y cuerpo vacíos. En las clausulas de Horn se
trabaja con secuencias de literales en vez de conjuntos. Esto implica dos cosas: los
literales pueden aparecer repetidos en el cuerpo hay un orden en los literales del
cuerpo.

Ejemplo:

24
25

Вам также может понравиться