Está en la página 1de 16

Notas sobre programacion logica

Edelmira Pasarella
Mayo del 2004
1

Indice
1. Deniciones basicas 3
2. Semantica de los programas logicos 4
3. Resolucion SLD 6
4. B usqueda y backtracking 9
2
1. Deniciones basicas
Denicion 1 Sean A
1
. . . A
n
, B
1
. . . B
m
atomos y x
1
. . . x
s
las variables que
ocurren en esos atomos.
1. Un literal es una formula atomica o su negacion. Las formulas atomi-
cas son llamadas literales positivos y sus negaciones, literales neg-
ativos.
2. Una clausula es una formula de la forma
x
1
. . . x
s
(A
1
. . . A
n
B
1
. . . B
m
)
3. Una clausula es una clausula de Horn si contiene a lo sumo un literal
positivo.
4. Una clausula de programa es una clausula con exactamente un
literal positivo.
Si una clausula de programa contiene al menos un literal negativo es
una regla:
x
1
. . . x
s
(A B
1
. . . B
m
) x
1
. . . x
s
(A B
1
. . . B
m
)
De otro modo, es un hecho:
x
1
. . . x
s
A
5. Un objetivo es una clausula que no tiene literales positivos. Es decir,
y
1
. . . y
s
(B
1
. . . B
m
) y
1
. . . y
s
(B
1
. . . B
m
)
6. Una clausula denida es una clausula cuya forma clausal viene dada
por una secuencia de literales. Es decir, el orden en el cual ocurren los
literales en la clausula es importante.
7. Un programa logico denido es un conjunto nito de clausulas
denidas de programa.
3
Notacion Para simplicar, en el resto de este documento cuando hablamos
de clausulas y programas nos referimos a clausulas y programas denidos,
respectivamente. Ademas, utilizaremos la siguiente notacion:
1. Hechos (o clausulas unitarias): A
2. Reglas:AB
1
, . . . , B
m
A se llama la cabeza y B
1
, . . . , B
m
la cola de la regla (clausula), re-
spectivamente.
3. Objetivos: A
1
. . . , A
k
2. Semantica de los programas logicos
La semantica da signicado a los programas y nos permite describir for-
malmente lo que calculan. Hay tres maneras bien conocidas de dar signicado
o semantica a los programas logicos: la semantica declarativa, la semantica
operacional y la semantica denotacional (com unmente llamada semantica
de punto jo). En esta seccion presentamos algunas nociones y teoremas
basicos relacionados a la semantica de los programas logicos denidos (para
mayor detalle, ver [2, 1, 4, 5]). Donde sea posible seguiremos la terminologa
de Lloyd [4].
Denicion 2 Sea L un lenguaje de primer orden.
1. El universo de Herbrand de L, denotado H
L
, es el conjunto de todos
los terminos de base que pueden formarse a partir de las constantes y
los smbolos de funcion que ocurren en L.
Ejemplo Sea L = {0, suc, nat} donde 0 es una constante, suc es un
smbolo de funcion de aridad 1 y nat es un predicado de aridad 1. En
los proximos tres ejemplos nos referiremos a este lenguaje. El universo
de Herbrand de L es:
H
L
= {0, suc(0), suc(suc(0), . . . , suc
i
(0), . . .}
2. La base de Herbrand de L, denotada B
L
, es el conjunto de todos
los atomos que pueden formarse a partir de los predicados que ocurren
en L y los terminos en H
L
.
4
Ejemplo La base de Herbrand de L es:
B
L
= {nat(0), nat(suc(0)), . . . , nat(suc
i
(0)), . . .}.
3. Una estructura A para L es una estructura de Herbrand si su
dominio es H
L
y, para cada smbolo de funcion f de L y elementos
t
1
. . . , t
n
de A, f
A
(t
1
, . . . , t
n
) = f(t
1
, . . . , t
n
). Para cada constante c en
L, c
A
= c.
Ejemplo Una estructura de Herbrand para L es:
A = H
L
, 0
A
, suc
A
, B
L
, donde 0
A
= 0 y suc
A
(t) = suc(t) para todo
t H
L
.
4. Si un conjunto de sentencias, un modelo de Herbrand de es una
estructura de Herbrand que es un modelo para . Debido a que en los
modelos de Herbrand la interpretacion de las constantes y los smbolos
de funcion son jas, es posible identicar un modelo de Herbrand con
un subconjunto de la base de Herbrand.
Consideremos un programa logico P. P induce un lenguaje de primer
orden donde las constantes, los smbolos de funcion y los predicados son,
respectivamente, las constantes, los smbolos de funcion y los predicados
que ocurren en P. Entonces, podemos hablar del universo de Herbrand
de P, denotado H
P
. Asimismo podemos hablar de la base de Herbrand
de P, denotada B
P
.
Ejemplo Sea P el siguiente programa:
p(a)
p(b)
q(a)
r(f(x))p(x), q(x)
El universo y la base de Herbrand de P son, respectivamente:
H
P
= {a, b, , f(a), f(b), f(f(a)), f(f(b)), f(f(f(a))), . . .}
B
P
= {p(a), p(b), q(a), q(b), p(f(a)), p(f(b)), q(f(a)), p(f(b)), p(f(f(a))),
p(f(f(b))), q(f(f(a)), q(f(f(b)) . . .}
5
Semantica declarativa. Desde el punto de vista logico, un programa P
puede verse como una teora logica formada por las clausulas del programa.
Los modelos de Herbrand de esta teora son considerados los modelos del
programa P. Por ejemplo, la base de Herbrand del programa P, B
P
, es un
modelo de P.
Entre las estructuras de Herbrand que son modelos de P, se destaca
el que contiene exactamente los atomos que son consecuencia logica de
P. Este modelo corresponde al signicado entendido o estandar del
programa y es llamado el modelo mnimo de P, M
P
. El modelo M
P
se
dene como sigue:
M
P
= {A B
P
: P |= A}
Ejemplo El modelo mnimo del programa P es:
M
P
= {p(a), p(b), q(a), r(f(a))}
Semantica operacional. Esta denida por el proceso de inferencia uti-
lizado para probar que un objetivo puede ser derivado del programa. En la
proxima seccion estudiaremos en detalle este punto.
Semantica denotacional. Esta semantica asigna signicado a un pro-
grama asociandole un funcion sobre el dominio calculado por el programa.
El signicado viene dado entonces por el punto jo de la funcion, si existe.
En este documento no entramos en detalle de este tema (remitimos al lector
interesado a [7]).
3. Resolucion SLD
La semantica operacional estandar de los programas logicos esta dada
por un procedimiento de refutacion basado en la regla de resolucion, llama-
do resolucion SLD [2], denido originalmente por Kowalski [3]. Resolucion
SLD signica Linear resolution with Selection function for Denite claus-
es.
Denicion 3 La funcion de seleccion, llamada regla de computacion, es
una funcion que va de un conjunto de objetivos a un conjunto de atomos de
forma tal que el valor de la funcion para un objetivo es un atomo, llamado
el atomo seleccionado en ese objetivo.
6
Denicion 4 Sea P un programa, G = A
1
, ..., A
j
, ..., A
n
(n 1) y R una
regla de computacion.
1. Supongamos que R(G) = A
j
y C = AB
1
, ..., B
k
es una clausula
de programa con las variables renombradas. Si A y A
j
son unica-
bles con unicador mas general (umg) , entonces el objetivo G

=
(A
1
, ..., A
j1
, B
1
, ..., B
k
, A
j+1
, ..., A
n
) es derivado de G y C va
R usando . Tambien podemos decir que G

es SLD-derivado de G
en P va R usando . Es decir, G

es un resolvente de las clausulas G


y C.
2. Una SLD-derivacion de G con respecto a P va R es una secuencia
(posiblemente innita) G
0
,
0
, G
1
,
1
, ..., donde G = G
0
,
0
es la
sustitucion identidad y G
i+1
se deriva de G
i
y alguna clausula en P
va R usando
i+1
. En general, llamamos SLD-derivacion a una SLD-
derivacion va una regla de computacion. Una SLD-derivacion puede
tener exito o fallar.
3. Una SLD-derivacion con exito es una SLD-derivacion nita que
naliza con la clausula vaca. En este caso la SLD-derivacion se llama
una SLD-refutacion. Una SLD-derivacion con fallo es una SLD-
derivacion nita que naliza con un objetivo diferente a la clausula
vaca en el cual el atomo seleccionado por la regla de computacion
utilizada no unica con la cabeza de ninguna de las clausulas del pro-
grama.
4. Sea G
0
,
0
, ..., G
n
,
n
una SLD-refutacion de G con respecto a P
donde G = G
0
. La SLD-respuesta calculada de G con respecto
a P se dene como =
1
...
n
|
var(G)
1
. Esto es, es la composicion
de los umgs utilizados en la SLD-refutacion considerada, restringida
a las variables que ocurren libres en G.
La resolucion SLD es independiente de la regla de computacion. Esto
es, si P {G} es insatisfactible, encontraremos una refutacion utilizando
cualquier regla de computacion. En lo sucesivo, sin perdida de generalidad,
suponemos que la regla de computacion selecciona el primer literal en el
objetivo. Por convencion, en los ejemplos subrayamos el literal seleccionado
por la regla de computacion en cada caso.
1
var(G) es el conjunto de variables que ocurren libres en G y la notacion
1
...
n
|
var(G)
representa la restriccion de la sustitucion resultante de la composicion
1
...
n
a las variables
que aparecen en var(G).
7
Ejemplo
1. Sea G = r(f(a)), la siguiente derivacion es una refutacion de G con
respecto a P,
r(f(a)), , p(a), q(a), {a/x}, q(a), , ,
En esta refutacion la respuesta calculada es debido que la variable x
no ocurre en el objetivo.
2. Sea G = r(f(x)), la siguiente derivacion es una refutacion de G con
respecto a P.
r(f(x)), , (p(y), q(y)), {y/x}, q(a), {a/y}, ,
con respuesta calculada = {y/x}{a/y}|
{x}
= {a/x}
3. Sea G = r(x), la siguiente derivacion es una refutacion de G con
respecto a P.
r(x), , (p(y), q(y)), {f(y)/x}, q(a), {a/y}, ,
con respuesta calculada = {f(y)/x}{a/y}|
{x}
= {f(a)/x}
Correccion y completitud
Sea G =B
1
, ..., B
m
un objetivo. Desde el punto de vista logico, una res-
puesta de G con respecto a un programa logico P es una sustitucion para
var(G). Sea una respuesta de G con respecto a P, es una respuesta co-
rrecta de G con respecto a P si P

|= ((

m
i=1
B
i
))

. Su contrapartida des-
de el punto de vista procedimental es la nocion de SLD-respuesta calculada.
Clark establecio la correccion y la completitud de la SLD-resolucion rela-
cionando las respuestas correctas (salida declarativa) y las SLD-respuestas
calculadas (salida procedural). Abajo presentamos los correspondientes teo-
remas.
Teorema 1 (Teorema de correccion) Sea P un programa y G un objetivo.
Entonces, cada SLD-respuesta calculada de G con respecto a P es una res-
puesta correcta de G con respecto a P.
8
Teorema 2 (Teorema de Completitud) Sea P un programa y G un obje-
tivo. Para cada respuesta correcta de G con respecto a P, hay una SLD-
respuesta calculada
1
de G con respecto a P y una sustitucion tal que
=
1
.
El teorema de completitud nos dice que cada respuesta correcta de un
objetivo G con respecto a un programa P es una instancia de una respuesta
calculada de G con respecto a P. Para ilustrar esta propiedad consideremos
el siguiente ejemplo.
Ejemplo Sea P = {menor(0, suc(x))}.
Tenemos que P |= menor(0, y){suc(suc(0))/y}. Esto es, = {suc(suc(0))/y}
es una respuesta correcta de menor(0, y) con respecto a P. Una SLD-
respuesta calculada de menor(0, y) con respecto a P es {suc(x)/y} y te-
nemos entonces que = {suc(x)/y}{suc(0)/x}.
4. B usqueda y backtracking
A continuacion presentamos conceptos relacionados con los procedimien-
tos que implementan la SLD-resolucion. Lo primero que hay que decir es que
el espacio de b usqueda para SLD-refutaciones viene dado por una estruc-
tura de arbol conocido como SLD-arbol. Para ampliar detalles remitimos al
lector a [5, 6].
Denicion 5 Un SLD-arbol de G con respecto a P va R es un arbol tal
que cada nodo es un objetivo (que podra ser la clausula vaca), cuya raz es
G. Sea A
1
, ..., A
j
, ..., A
n
(n 1) un nodo de un SLD-arbol. Supongamos
que R(A
1
, ..., A
j
, ..., A
n
) = A
j
. Entonces, para cada clausula del programa
P, A B
1
, ..., B
k
tal que A
j
y A son unicables con umg , el nodo tiene
un hijo (A
1
, ..., A
j1
, B
1
, ..., B
k
, A
j+1
, ..., A
n
). La clausula vaca, si ocurre
en el arbol, no tiene hijos.
Es importante destacar aqu la independencia de la regla ya que permite
reducir sustancialmente el espacio de b usqueda al poder jar una regla de
computacion a priori y usarla para construir el SLD-arbol.
Ejemplo Consideremos el programa P
1
= P {r(x)q(x)}, es decir,
9
(1) p(a)
(2) p(b)
(3) q(a)
(4) r(f(x))p(x), q(x)
(5) r(x)q(x)
y el objetivo G = r(x). El SLD-arbol de G con respecto a P
1
es el
siguiente:
r(x)
(p(y), q(y)){f(y)/x} q(y){y/x}
(q(y)){a/y} (q(y)){b/y} {y/x}{a/y}
{f(y)/x}{a/y}
Note que cada camino del arbol SLD corresponde a una derivacion SLD.
A continuacion presentamos las derivaciones del arbol de arriba:
I II III
r(x) r(x) r(x)
| | |
(4) (4) (5)
| | |
(p(y), q(y)){f(y)/x} (p(y), q(y)){f(y)/x} q(y){y/x}
| | |
(1) (2) (3)
| | |
(q(y)){a/y} (q(y)){b/y} {y/x}{a/y}
|
(3)
|
{f(y)/x}{a/y}
10
Las derivaciones I y III son refutaciones mientras que II es una derivacion
con fallo.
En la implementacion de la SLD-resolucion, ademas de la unicacion,
hay dos problemas importantes a resolver:
Denir la regla de computacion. En las implementaciones de Prolog,
la regla de computacion selecciona siempre el literal mas a la izquierda
del objetivo considerado.
Cual clausula del programa utilizar
2
para resolver con el literal selec-
cionado. En las implementaciones de Prolog, las clausulas se escogen
siguiendo el orden en el cual aparecen listadas en el programs.
Ejemplo Sea programa P
2
:
(1) p(b)
(2) p(a)
(3) q(x)r(x)
(4) r(b)
y el objetivo p(x), q(x). La regla de computacion selecciona el literal
p(x) y comienza tratando de resolver con la clausula (1).
El esquema generado por la regla de computacion y la escogencia de
la clausula de programa para aplicar la regla de resolucion se traduce
en un recorrido en profundidad del SLD-arbol correspondiente. Esto
es, la b usqueda de una refutacion de un objetivo G con respecto a un
programa P, se inicia siempre por el camino mas a la izquierda del
SLD-arbol de G con respecto a P (asumiendo que este arbol reeja el
orden en el que ocurren las clausulas en el programa P).
2
Recordemos que en realidad se utilizan variantes de las clausulas de programa.
11
Ejemplo Consideremos el SLD-arbol de p(x), q(x) con respecto al
programa P
2
:
p(x), q(x)
q(x){b/x} q(x){a/x}
r(u){b/u} r(u){a/u}

En este arbol, el camino mas a la izquierda es una refutacion de


p(x), q(x) con respecto a P
2
.
Veamos ahora que sucede si modicamos el orden de las clausulas (1) y
(2) del P
2
:
(1) p(a)
(2) p(b)
(3) q(x)r(x)
(4) r(b)
Llamemos a este programa P
3
. El SLD-arbol de p(x), q(x) con respecto
a P
3
es:
p(x), q(x)
q(x){a/x} q(x){b/x}
r(u){a/u} r(u){b/u}

En este arbol, a diferencia del anterior, la refutacion viene dada por el


camino mas a la derecha. Prolog, intenta conseguirla probando por el camino
mas a la izquierda y falla. Que hace entonces para encontrar otro camino
que le de una refutacion (si la hay)?
En esta situacion de fallo, Prolog utiliza un mecanismo llamado bac-
tracking que, en este caso, consiste en devolverse en el camino consider-
ado hasta encontrar un nodo con una rama a la derecha. Si se encuentra
12
tal nodo, se reintenta por esta rama tomando siempre el camino mas a la
izquierda. Prolog realiza backtracking hasta encontrar un camino con exito,
si lo hay. Notese que en la medida que Prolog hace backtracking las susti-
tuciones que se haban obtenido por el camino que fallo se van deshaciendo
tambien para reconstruirlas en el nuevo intento. Veamos esto en el arbol de
p(x), q(x) con respecto a P
3
obteniendo la sustitucion {b/x}.
Al llegar al nodo r(u){a/u} no hay ninguna clausula cuya cabeza unique
con r(a), falla y se devuelve al nodo q(x){a/y} deshaciendo la sustitucion.
En este nodo no hay ramas a la derecha para explorar. Entonces, se devuelve
otra vez y llega al nodo raz, es decir, p(x), q(x). Reintenta nuevamente
con otra clausula cuya cabeza unique con p(x) y encuentra la clausula (2)
y sigue bajando por esta rama hasta llegar a la clausula , con lo cual,
nalmente encuentra una refutacion de p(x), q(x) con respecto a P
3
.
En los SLD-trees pueden ocurrir ramas innitas. Para ver esto basta
considerar el SLD-arbol del objetivo p con respecto al programa {pp}.
El estudio de este topico esta fuera del alcance de este documento por lo
que remitimos al lector a [4]. Para terminar esta seccion presentamos un
interprete abstracto para programas logicos [6]:
Entrada: Un objetivo G y un programa P
Salida: Una instancia de G que es una consecuencia logica de P,
o no en caso contrario
Algoritmo: Inicializa el resolvente con G
mientras el resolvente no sea vaco hacer
escoger un literal A del resolvente
escoger una variante de una clausula A

B
1
, . . . , B
n
de P
tal que A y A

uniquen con umg


(si no existe tal clausula, salir del lazo mientras
reemplazar A por B
1
, . . . , B
n
en el resolvente
aplicar al resolvente y a G
n-mientras
si el resolvente es vaco entonces dar como salida G
sino dar como salida no
13
Ejercicios
1. Sea P un programa. Demuestre que la estructura de Herbrand vaca
( B
P
) es un modelo de P si, y solo si, cada regla en P tiene una
cola no vaca. Es decir, P no contiene hechos.
2. Demuestre que B
P
es un modelo de P para todo programa P.
3. Considere el siguiente programa:
(1) q(a)
(2) r(b)
(3) p(x)r(x)
a) De el lenguaje subyacente.
b) De el universo y la base de Herbrand correspondientes.
c) De el modelo mnimo.
d) De un modelo de Herbrand que sea diferente al modelo mnimo
y a la base de Herbrand.
4. Considere el siguiente programa:
(1) sum(x, 0, x)
(2) sum(x, suc(y), suc(z))sum(x, y, z)
a) De el lenguaje subyacente.
b) De el universo y la base de Herbrand correspondientes.
c) De un modelo de Herbrand que sea diferente a la base de Her-
brand.
5. Considere el siguiente programa en Prolog:
(1) pertenece(X, [X| ]).
(2) pertenece(X, [ |L]) : pertenece(X, L).
De el SLD-arbol de la consulta ? pertenece(X, [a, b, c]). con respecto
al programa de arriba. Simule la b usqueda de la resolucion que hara
Prolog. Cual es la sustitucion resultante para X? Hay otras? Si la
respuesta es s, como podramos obtenerlas?
14
6. Considere el siguiente programa en Prolog:
(1) conc([ ], L, L).
(2) conc([X|L1], L2, [X|L3]) : conc(L1, L2, L3).
De el SLD-arbol de la consulta ? conc(L1, L2, [a, b, c]). con respecto
al programa de arriba. Simule la b usqueda de la resolucion que hara
Prolog. De todas las posibles respuestas calculadas.
7. Considere el universo y la base Herbrand para los programas de los
ejercicios 5 y 6. De ejemplos de respuestas correctas y de respuestas
calculadas. Discuta al respecto y de conclusiones.
15
Referencias
[1] K. R. Apt. Logic programming. In J.van Leeuwen., editor, Handbook of
Theoretical Computer Science, pages 493574. Elsevier Science Publish-
ers B.V., 1990.
[2] K. R. Apt and M.H. van Emden. Contributions to the theory of logic
programming. The Journal of ACM, 29(3):841862, 1982.
[3] R.A. Kowalski. Predicate logic as a programming language. Information
Processing Letters 74, pages 569574, 1974.
[4] J. W. Lloyd. Foundations of Logic Programming. Springer-Verlag, 2nd
edition, 1987.
[5] Anil Nerode and Shore Richard A. Logic for applications. Springer-
Verlag, 1993.
[6] L. Sterling and EG. Shapiro. The art of Prolog. The MIT Press, 1994.
[7] van Emden, M.H. and R.A. Kowalski. The semantics of predicate logic
as a programming language. Journal of ACM, 23(4):733742, 1976.
16

También podría gustarte