Está en la página 1de 49

Prolog de Primer Orden

Prolog es un ejemplo de un paradigma de programaci


on llamado programaci
on
en l
ogica.
Un programa en Prolog puro de primer orden es un conjunto de clausulas de
horn definitivas de primer orden.
Una clausula de horn definitiva de primer orden es una clausula, cuantificada
universalmente y que contiene exactamente un literal positivo. Por ejemplo:
xyz (P (x, y) Q(x, y) R(x, y, z))
En programaci
on en l
ogica, esta clausula se anota simplemente como:
P (x, y) Q(x, y), R(x, y, z)
Los predicados se anotan con letras min
usculas. Si p de aridad n, se acostumbra
a llamarlo por p/n.

Jorge Baier Aranda, PUC

<< Atras

174

Al igual que en l
ogica de predicados, un termino puede ser:
Constantes: Estas pueden ser:

Atomos:
Smbolos que comienzan con letra min
uscula, por ej. x, y, a,
etc. Smbolos encerrados en comillas simples, por ej. X, 5, x23,
a,, etc.
N
umeros: Enteros y/o reales. Por ej. 4, 9.5, etc..
Caracteres y textos (strings): Los caracteres y los strings se encierran entre
comillas dobles. Por ej. "f", "fam", etc.
Variables: Smbolos que comiencen con letra may
uscula o con un gui
on bajo
. Por ej., X, 5, x23.
Functores: Son terminos de funci
on. Por ej., padre(X,bonifacio), etc.
Un functor tiene una aridad asociada. Si f es el nombre de un functor, f /m
denota que f tiene aridad m.
Un programa prolog esta compuesto por clausulas de horn con la siguiente sintaxis
l:-l1, . . . , ln,
donde l, y l1, ..., ln son literales positivos.
Jorge Baier Aranda, PUC

<< Atras

175

En el caso en que n = 0, la clausula se llama hecho y se anota simplemente


como
l.
Cuando n > 0 se acostumbra a llamar reglas a las clausulas.
Por ejemplo, la siguiente clausula (o regla) Prolog:
ancestro(X,Y) :- progenitor(X,Z),ancestro(Z,Y).
corresponde a la siguiente clausula de primer orden:
xyz (progenitor(x, z) ancestro(z, y) ancestro(x, y))
que, a su vez, es equivalente a:
xy (z (progenitor(x, z) ancestro(z, y)) ancestro(x, y))
Esto significa que toda variable que no se menciona en forma explcita en la
cabeza de una regla se debe suponer como cuantificada existencialmente en la
cola de ella.
Jorge Baier Aranda, PUC

<< Atras

176

El siguiente ejemplo se puede ver como una base de datos de una familia.
padre(alberto,juan).
madre(julia,juan).
padre(pedro,maria).
madre(helena,maria).
padre(juan,olga).
madre(maria,olga).
padre(juan,Alberto Jr.).
progenitor(X,Y) :- padre(X,Y).
progenitor(X,Y) :- madre(X,Y).
ancestro(X,Y) :- progenitor(X,Y).
ancestro(X,Y) :- progenitor(X,Z),ancestro(Z,Y).

Este programa es una teora de primer orden. Prolog permite consultar que cosas
se deducen de el. La respuesta la entrega usando un mecanismo de demostraci
on
que veremos mas adelante.

Jorge Baier Aranda, PUC

<< Atras

177

Las siguientes son consultas que se pueden hacer al interprete.


?- progenitor(juan,olga).
Yes.
?- progenitor(X,juan).
X = alberto
Yes

La segunda consulta se
progenitor(X,juan)?.

puede

leer

como

existe

un

tal

que

obtienen

de

la

consulta

Al ingresar ; Prolog busca otra respuesta.


Estas son todas las
progenitor(X,juan).

respuestas

que

se

X = alberto ;
X = julia ;
No

Jorge Baier Aranda, PUC

<< Atras

178

La siguiente consulta pregunta por todos los X que son descendientes de alberto,
?- ancestro(alberto,X).
X = juan ;
X = olga ;
X = Alberto Jr. ;
No

Que significa la siguiente consulta?


?- ancestro(p,q).
No

Que significa este comportamiento desde el punto de vista l


ogico?
Si un interprete de Prolog logra demostrar una consulta dado un programa P,
entonces diremos que:
P `p
La pregunta anterior se puede reformular como: Podemos establecer una
correspondencia entre |= y `p?
Jorge Baier Aranda, PUC

<< Atras

179

Algoritmo de Resolucin de P ROLOG


A continuaci
on presentamos una simplificaci
on del algoritmo de resoluci
on de
Prolog de primer orden.
En el pseudo c
odigo del algoritmo se utiliza las siguientes convenciones.
GL0: Lista de literales correspondientes al objetivo o consulta inicial.
GL: Lista de objetivos (literales positivos).
ren: Un procedimiento que recibe una lista de literales y renombra las variables
con nombres nuevos. Es usual que estos nombres sean de la forma n donde
n es un n
umero entero.
PP y PP aux: Dos procedimientos que reciben una lista de objetivos y retornan
una sustituci
on o #Falso si no hay sustituci
on posible. PP aux recibe ademas
de la lista de objetivos, un ndice a una clausula dentro del programa.
UMG Prolog: El procedimiento UMG sin occurs check (ya veremos de que se trata
esto).
Jorge Baier Aranda, PUC

<< Atras

180

c1, c2, . . . cm: Las clausulas del programa.


#m: Constante que se inicializa como el n
umero de clausulas del programa.
Cabeza y Cola: dos funciones sobre reglas o listas de objetivos. Si x es una
lista, entonces Cabeza(x) es el primer literal de x y Cola(x) es el resto de la
lista. Si x es una clausula, Cabeza(x) es la cabeza de la clausula y Cola(x)
es el cuerpo.
aplicarSust : Aplica una sustituci
on a un conjunto de variables clausulas.
composici
on: Permite componer dos sustituciones.
Dado que GL0 es el objetivo inicial, el procedimiento prolog se invoca como:
PP(ren(GL0), nil)

Jorge Baier Aranda, PUC

<< Atras

181

A continuaci
on se muestra la implementaci
on de las funciones necesarias para la
resoluci
on:
function PP(GL,S)
/* devuelve una sustituci
on que satisfaga GL o devuelve #Falso */
{
if GL=nil return(S);
PP_aux(GL,S,1)
}
function PP aux(GL,S,i)
/* devuelve sustituci
on que satisfaga GL o #Falso */
{
cl
ausula C; /* variables auxiliares */
sustituci
on S, S;
if i>#m return(#Falso);
C:= ren(C[i]);
S:= UMG_Prolog(Cabeza(GL),Cabeza(C));
if S=#Falso return(PP_aux(GL,S,i+1));
S:=PP(aplicarSust(S,append(Cola(C),Cola(GL))),
composici
on(S,S));
if S=#Falso return(PP_aux(GL,S,i+1));
return(S);
Jorge Baier Aranda, PUC

<< Atras

182

Tal como sugerimos en resoluci


on de primer orden, este algoritmo renombra
variables antes de aplicar la regla de resoluci
on.
Si Prolog responde NO cuando este algoritmo retorna #Falso, que significa que
Prolog responda NO?
que le falta a este algoritmo?
Resatisfacci
on de consultas. c
omo podemos implementar esto?
C
omo podemos incorporar negaci
on?

Jorge Baier Aranda, PUC

<< Atras

183

rboles de demostracin
En Prolog es posible rastrear la demostraci
on de un objetivo a traves del
comando trace.
Una vez que el interprete esta en modo trace, toda demostraci
on de una consulta
es mostrada paso a paso.
Volvamos a considerar el ejemplo de la base de datos familiar.
El siguiente ejemplo muestra un trace de la ejecuci
on de la consulta
ancestro(alberto,olga). [trace] ?- progenitor(maria,X).
Call:
Call:
Fail:
Redo:
Call:
Exit:
Exit:

(6)
(7)
(7)
(6)
(7)
(7)
(6)

progenitor(maria, G384) ? creep


padre(maria, G384) ? creep
padre(maria, G384) ? creep
progenitor(maria, G384) ? creep
madre(maria, G384) ? creep
madre(maria, olga) ? creep
progenitor(maria, olga) ? creep

X = olga ;
Jorge Baier Aranda, PUC

<< Atras

184

Fail:
Fail:
No

(7) madre(maria, G384) ? creep


(6) progenitor(maria, G384) ? creep

Esta demostraci
on se puede resumir en el siguiente
arbol de demostraci
on:
progenitor(maria,X)
X= G384
progenitor(maria,
G384)
....
.......... .....................
..........

......
..........
..........
..........
..........
.
.
.
.
.
.
.
.
.
.
..........
..........
..........
..........
..........
.
.
.
.
.
.
.
.
.
...
..........
..........
..........

padre(maria, G384)

...........
...........
...........
...........
...........
...........
...........
...........
...........
...........
...........
...........
...........
.....

madre(maria, G384)

G384=olga

En forma resumida, en un arbol de demostraci


on:
Cada nodo no hoja tiene como etiqueta un objetivo a demostrar o los smbolos.
Los nodos hoja estan etiquetados con  o .
Si un nodo n es padre de un nodo h, entonces h es el resultado de aplicar la
regla de resoluci
on entre n y alguna clausula del programa.
Jorge Baier Aranda, PUC

<< Atras

185

La etiqueta que une a n con h es la sustituci


on aplicada en la resoluci
on.
Una demostraci
on exitosa de un objetivo esta dada por las resoluciones que dan
origen a una rama que termina en un nodo hoja etiquetado con  (clausula
vaca).
Ejercicio: construya un arbol de demostraci
on para ancestro(olga,X).
Una observaci
on interesante es que Prolog siempre recorre el arbol de
demostraci
on en profundidad.

Jorge Baier Aranda, PUC

<< Atras

186

Es un Programa Prolog un Programa en Lgica?


Por que nos hacemos esta pregunta?
Sera ideal que Prolog el metodo de resoluci
on de Prolog representara
exactamente la noci
on de consecuencia l
ogica.
Es decir, si P es un programa, entonces
P |= ssi P `p

Supongamos que en el ejemplo de la familia, preguntamos por padre(hugo,X)


Prolog respondera que NO. Significa esto que del programa se deduce
X padre(hugo, X)?
La respuesta es no, porque hay un modelo del programa en el cual dicha f
ormula
es satisfacible!
Jorge Baier Aranda, PUC

<< Atras

187

De hecho, si P es un programa Prolog puro, entonces, nunca es posible que


P |= `,
donde ` es un literal de primer orden.
Esto es una conclusi
on directa del siguiente teorema.
Teorema 7. Un conjunto de clausulas de Horn de primer orden es siempre
consistente.
Demostraci
on: Basta con encontrar una interpretaci
on con un dominio A en
que las extensiones de todo predicado n-ario contiene exactamente a An. Tal
interpretaci
on es un modelo para el conjunto, porque todas las clausulas tienen
un literal positivo.
Cabe preguntarnos que relaci
on hay entre la l
ogica de primer orden y Prolog.
Si la correspondencia no es exacta, podemos, al menos dar a Prolog una
semantica precisa?
Jorge Baier Aranda, PUC

<< Atras

188

A continuaci
on veremos c
omo hacer esto.

Jorge Baier Aranda, PUC

<< Atras

189

Significado Declarativo de una Respuesta de P ROLOG


Hasta el momento hemos visto que Prolog puede responder a preguntas con
variables libres.
Que significa desde el punto de vista l
ogico que Prolog demuestre p(X,Y)?
Recordemos que en l
ogica de primer orden es posible tener un sinfin de
interpretaciones distintas.
Para dar semantica a Prolog, utilizaremos una noci
on restringida de
interpretaci
on.
Estas interpretaciones tendran como universo a los universos de Herbrand.

Jorge Baier Aranda, PUC

<< Atras

190

Modelos de Herbrand
Un universo de Herbrand es una estructura que se origina de la sintaxis del
lenguaje.
Veamos antes un par de definiciones.
Definici
on 26. Un termino instanciado (ground term) de un lenguaje de primer
orden, es un termino que no contiene variables.
Definici
on 27. Un universo de Herbrand esta formado por todos los terminos
instanciados del lenguaje.
Veamos un ejemplo
Supongamos el programa:
p(f(X)):- q(g(X)).
p(f(X)):- p(X).
p(a).
q(a).
Jorge Baier Aranda, PUC

<< Atras

191

En este programa tenemos los terminos de funci


on f y g y las constantes a y b.
El universo de Herbrand es:
{a, b, f (a), g(a), f (b), g(b), f (f (a)), f (g(a)), g(f (a)), g(g(b)), . . .}
Desde el punto de vista intuitivo un universo de Herbrand es un universo mnimo
pues no tiene elementos que no se pueden nombrar usando la sintaxis del lenguaje.
Si P es un programa construido sobre
h{R1, . . . , Rn}, {f1, . . . , fn}, {C1, . . . , Cn}i, entonces

los

smbolos

H = hDH, {R1H, . . . , RnH}, {f1H, . . . , fnH}, {C1H, . . . , CnH}i,


donde DH es el universo de Herbrand de P, es una estructura de Herbrand para
ese lenguaje.
La interpretaci
on de los terminos del lenguaje da una correspondencia unvoca
entre los terminos del lenguaje y los objetos del universo. As, una interpretaci
on
Jorge Baier Aranda, PUC

<< Atras

192

de Herbrand es tal que:


I(Cn) = Cn
I(fn(t1, . . . , tn)) = fn(I(t1), . . . , I(tn))
La pregunta clave es que es lo que se deduce de un programa en un universo de
Herbrand.
No podemos deducir mas que propiedades acerca de los objetos del universo.
Por ejemplo, si tenemos el programa P:
numero(0).
numero(s(X)) :- numero(X).
suma(X,0,X).
suma(X,s(Y),Z) :- suma(s(X),Y,Z).

Los u
nicos hechos que podramos llegar a deducir son:
{numero(0), suma(0, 0, 0), numero(s(0)), suma(s(0), 0, 0),
suma(s(0), s(0), 0), suma(s(0), s(0), s(0)), . . .}
Jorge Baier Aranda, PUC

<< Atras

193

Esta secuencia de propiedades de objetos concretos es lo que se conoce como


una base de Herbrand.
Formalmente,
Definici
on 28. [Base de Herbrand] Sea P un programa en l
ogica construido
sobre los smbolos S = h{R1, . . . , Rn}, {f1, . . . , fn}, {C1, . . . , Cn}i

B(P) = {Ri(t1, . . . , tn) | Ri es un smbolo de predicado de aridad n y


tj es un termino instanciado (1 j n)}

Un Modelo de Herbrand mnimo para P, escrito por IH (P), es un subconjunto


de B(P), pero que contiene exactamente los hechos que se deducen de un
programa.
Jorge Baier Aranda, PUC

<< Atras

194

En el programa ejemplo, un modelo mnimo de Herbrand es:


{numero(0), numero(s(0)), numero(s(s(0))), . . .
suma(0, 0, 0), numero(0, s(0), s(0)), numero(s(0), s(0), s(s(0))), . . .}
Formalmente,
Definici
on 29. Un Modelo mnimo de Herbrand IH (P) para un programa en
l
ogica P es un subconjunto de B(P) tal que si r IH (P) entonces existe una
clausula
ch : c1, . . . , cn
en P y una sustitucion tal que:
ch r
ci IH (P) con 1 i n
Ahora si preguntamos a Prolog por una lista de objetivos GL, entonces GL es
verdadero si existe una sustituci
on tal que para cada g GL, se cumple que
g IH (P)
Jorge Baier Aranda, PUC

<< Atras

195

Este es el que se conoce como significado declarativo de un programa Prolog.


Tambien podemos decir que lo que Prolog hace, en el fondo, al demostrar un
objetivo p(X,Y) es encontrar una demostraci
on constructiva
XY p(X, Y)
La demostraci
on es constructiva porque Prolog encuentra valores para X e Y
para los que p(X,Y) es consecuencia l
ogica del programa.
En el area de bases de datos deductivas es com
un tratar a las consultas que
requieren valores como respuesta como consultas con variables libres.
De esta manera la consulta
Rut alumno(N ombre, Rut, Dir)
Se interpreta como una consulta en la que se pregunta por el N ombre y Dir de
las tuplas de la tabla alumno.

Jorge Baier Aranda, PUC

<< Atras

196

Propiedades de la Resolucin Prolog


Es Prolog correcto?
La resoluci
on Prolog sera correcta si es que corresponde exactamente a la
regla de primer orden.
Lamentablemente, el mecanismo de resoluci
on de Prolog no realiza occurs
check .Esto hace que el interprete no reconozca casos en los cuales no se puede
realizar unificaci
on:
?- X=f(X).
X = f(f(f(f(f(f(f(f(f(f(...))))))))))

Nota: de hecho, algunos Prolog se caen con la consulta X=f(X),write(X).


Para ver mas claro el poblema, consideremos el siguiente programa:
q :- p(X,X).
p(X,Y) :- X=f(Y).

La respuesta a la consulta q es, incorrectamente, Yes.


Jorge Baier Aranda, PUC

<< Atras

197

Prolog tampoco es completo.


La fuente de incompleci
on de Prolog es:
La manera en que se recorre el arbol (en profundidad) de demostraci
on hace
que Prolog pueda caer en loops infinitos.
Consideremos el siguiente programa:
numero(s(X)) :- numero(X).
numero(0).

sin embargo, observen el comportamiento frente a la siguiente consulta.


?- numero(X).
ERROR: Out of local stack

Si cambiamos el programa original por:


numero(0).
numero(s(X)) :- numero(X).

obtenemos
?- numero(X).
X = 0 ;
X = s(0) ;
X = s(s(0)) ;
X = s(s(s(0))) ;
...
Jorge Baier Aranda, PUC

<< Atras

198

En otras palabras, esto significa que el significado declarativo de Prolog es


distinto al significado procedural de prolog.En ambos programas, el significado
declarativo es el mismo, pero el interprete no entrega las mismas respuestas.

Jorge Baier Aranda, PUC

<< Atras

199

Negacin como Falla


Hasta ahora, nuestros programas Prolog son incapaces de representar la noci
on
de negaci
on.
Por ejemplo, supongamos que quisieramos agregar la siguiente informaci
on como
una regla:
Maria adora a los animales, excepto a las gatos
Una forma natural de hacer esto en primer orden sera:
x (animal(x) gato(x) adora(M aria, x))
En Prolog, usaramos la siguiente regla:
adora(maria,X) :- animal(X), not gato(X).

En general, el interprete de Prolog responde SI para un objetivo not G si es


que no pudo demostrar G usando resoluci
on a partir del programa.
Jorge Baier Aranda, PUC

<< Atras

200

Problemas con Negacin como Falla


Es necesario ser extremadamente cuidadoso cuando se utiliza negaci
on como
falla.
En general, hay que evitar que hayan variables no unificadas en objetivos
precedidos por not.
Supongamos el siguiente ejemplo:
animal(piolin).
animal(silvestre).
animal(porky).
pajaro(piolin).
gato(silvestre).
chancho(porky).
adora(maria,X) :- animal(X), not(gato(X)).

Que respuestas da Prolog a la consulta adora(maria,X).


Exactamente las que esperabamos, X=piolin, X=porky.
Jorge Baier Aranda, PUC

<< Atras

201

Cambiemos ahora la u
ltima regla por:
adora(maria,X) :- not(gato(X)),animal(X).

Que obtenemos ahora como respuesta a adora(maria,X)?


Inesperadamente, la respuesta que da Prolog es NO. Por que?

Jorge Baier Aranda, PUC

<< Atras

202

Estructuras de Datos en Prolog


La semantica de modelos mnimos subyacente de Prolog, permite expresar en
forma sencilla estructuras de datos que no se pueden modelar en primer orden.
Por ejemplo, mas adelante veremos que no es posible construir un conjunto de
axiomas tales que fuercen a tener modelos cuyo dominio sean los naturales.
En Prolog cosas como estas son muy sencillas de expresar.
De hecho, ya hemos visto algo de esto. Supongamos que utilizamos el predicado
numero para identificar a los naturales.
Podemos considerar al primer n
umero como 0, al sucesor de 0 como s(0), al
sucesor de este como s(s(0)).
Si bien los nombres que usamos para los n
umeros son distintos (no usamos
1, 2, 3, . . .), esta representaci
on es suficiente.
El predicado numero se puede expresar facilmente como:
Jorge Baier Aranda, PUC

<< Atras

203

numero(0).
numero(s(X)) :- numero(X).

Supongamos ahora que queremos construir un predicado suma(X,Y,Z) que es


verdadero cuando Z es la suma de X e Y en esta representaci
on.
Una posibilidad es la siguiente:
suma(0,X,X).
suma(s(X),Y,Z):- suma(X,s(Y),Z).

Esto se basa en la siguiente propiedad de la suma: (x + 1) + y = x + (y + 1)


Un ejemplo de ejecuci
on es el siguiente:
?- suma(s(s(0)),s(s(s(0))),X).
X = s(s(s(s(s(0))))) ;
No

Notable es el hecho que parametros que podramos haber pensado como entradas,
tambien pueden ser parametros de salida.
Jorge Baier Aranda, PUC

<< Atras

204

Por ejemplo la consulta suma(s(s(0)),X,s(s(s(0)))) significa que n


umero
debo sumarle a 2 para que de 3? puede ser respondida por Prolog usando la
implementaci
on que hemos visto: ?- suma(s(s(0)),X,s(s(s(0)))).
X = s(0) ;
No
Esto se debe a que la regla de alguna manera expresa como funciona la suma
en los naturales. Prolog se limita simplemente a demostrar.
C
omo podemos implementar la multiplicaci
on?
mult(0,X,0).
mult(s(X),Y,Z) :- mult(X,Y,U),suma(U,Y,Z).

En que propiedad de la multiplicaci


on esta basada esta regla?
Podremos ahora usar a Prolog para resolver la ecuaci
on:
3x + 1 = 7
Jorge Baier Aranda, PUC

<< Atras

205

La respuesta es s! Con la siguiente consulta:


?- suma(U,s(0),s(s(s(s(s(s(s(0)))))))),mult(X,s(s(s(0))),U).
U = s(s(s(s(s(s(0))))))
X = s(s(0))
Yes
Podra encontrar las soluciones de x2 3x + 2 = 0?
Primer intento. Usando la consulta:
mult(X,X,U),mult(s(s(s(0))),X,V),suma(Z,V,U),suma(Z,s(s(0)),0).
Resultado: Prolog no responde. Por que ocurre esto?
Segundo intento: Usando la consulta
mult(X,X,U),mult(s(s(s(0))),X,V),suma(U,s(s(0)),Z),suma(V,0,Z).
Jorge Baier Aranda, PUC

<< Atras

206

Resultado: X = s(0)
U = s(0)
V = s(s(s(0)))
Z = s(s(s(0))) ;
X = s(s(0))
U = s(s(s(s(0))))
V = s(s(s(s(s(s(0))))))
Z = s(s(s(s(s(s(0))))))
Funciona!
Como conclusi
on: Prolog no resuelve todo (esto es consecuencia de que es
incompleto).
Para que encuentre las respuestas es necesario que el programador se preocupe
de ordenar la b
usqueda, que no es lo ideal.

Jorge Baier Aranda, PUC

<< Atras

207

Manejo de Listas
Es posible tambien manejar listas en Prolog.
La siguiente es una definici
on inductiva de lista.
La lista vaca nil, es una lista.
Si L es una lista, entonces a L tambien es una lista.
De esta manera, la lista formada por los n
umeros 1,2 y 3 se ve bajo esta definici
on
como
1 2 3 nil
y que en la representaci
on grafica usual se vera como:
1

...........
......

...........
......

.
.....
.....
.....
....
.
.
.
.
....
.....
.....
.....
.....
.
.
.
.
..
.....
.....

En Prolog, representaremos el constructor de listas por el functor cons. As:


lista(nil).
lista(cons(X,L)) :- lista(L).

Jorge Baier Aranda, PUC

<< Atras

208

Concatenacin de Listas
La operaci
on de concatenaci
on de lista sirve para juntar dos listas en una sola.
La concatenaci
on se puede definir inductivamente por:
nil L = L, con L lista.
(a L1) L2 = a (L1 L2), con L1 y L2 listas.
La implementaci
on de esta definici
on es directa:
conc(nil,L,L).
conc(L,L2,Z) :- L=cons(X,L1),conc(L1,L2,U),Z=cons(X,U).

Esta u
ltima definici
on se puede reemplazar por:
conc(nil,L,L).
conc(cons(X,L1),L2,cons(X,U)) :- conc(L1,L2,U).

La siguiente es una muestra de ejecuci


on:
Jorge Baier Aranda, PUC

<< Atras

209

?- conc(cons(a,nil),cons(b,cons(c,nil)),L).
L = cons(a, cons(b, cons(c, nil))) ;
No

Nuevamente, podemos usar los parametros como entrada salida, como en la


siguiente consulta:
?- conc(X,Y,cons(1,cons(2,cons(3,nil)))).
X = nil
Y = cons(1, cons(2, cons(3, nil))) ;
X = cons(1, nil)
Y = cons(2, cons(3, nil)) ;
X = cons(1, cons(2, nil))
Y = cons(3, nil) ;
X = cons(1, cons(2, cons(3, nil)))
Y = nil ;

Jorge Baier Aranda, PUC

<< Atras

210

No

Siguiendo estas mismas ideas es posible implementar otras estructuras de datos,


como por ejemplo arboles o colas.

Jorge Baier Aranda, PUC

<< Atras

211

Otra Aplicacin: Bsqueda y Clculo de Situaciones


El calculo de situaciones es una familia de lenguajes l
ogicos de primer orden mas
induccion.
Es una familia de lenguajes con tipos.
En las l
ogicas con tipos las variables pertenecen a un tipo especfico.
Este lenguaje ha sido usado en inteligencia artificial para modelar mundos
dinamicos.
En el calculo de situaciones se distinguen los siguientes elementos:
Situaciones. Hay una u
nica situaci
on inicial, S0. Todas las situaciones
siguientes se obtienen como resultado de ejecutar alguna secuencia de acciones
en S0.
Si s es una situaci
on, diremos que do(a, s) es la situaci
on que resulta de
ejecutar a en s.
Acciones. Son los elementos que sirven para cambiar de una situaci
on a otra.
Jorge Baier Aranda, PUC

<< Atras

212

Predicado especial P oss. P oss(a, s) es verdadero ssi la acci


on a es posible
en la situaci
on s.
Fluentes. Son predicados que sirven para representar las propiedades del
mundo. Estos predicados tienen siempre un u
nico argumento de situaci
on.
Por ejemplo,
sobreElP iso(x, s)
Puede significar que el objeto x se encuentra sobre el piso en la situaci
on s.
Tal como en los lenguajes ordinarios de primer orden tenemos objetos del dominio
y predicados sin terminos de situaci
on.

Estos
u
ltimos se utilizan para especificar propiedades que no cambian al ejecutar
acciones.

Jorge Baier Aranda, PUC

<< Atras

213

El mundo de Bloques
Modelaremos el mundo de bloques de la figura en el Calculo de Situaciones y
veremos que tareas de razonamiento podemos realizar.
C

M1

M2

M3

En el mundo de bloques de la figura, existen tres mesas (M1, M2 y M3 y un


conjunto de bloques.
Siempre es posible tomar un bloque libre (que no tiene bloques sobre el) y ubicarlo
sobre otro bloque.
Las mesas M1, M2 y M3 no son manipulables.
Jorge Baier Aranda, PUC

<< Atras

214

Llamaremos objeto tanto a mesas como bloques.


Para el modelo en el calculo de situaciones usaremos los el siguiente fluente:
sobre(x, y, s): Verdadero ssi el bloque x esta sobre el objeto y en la situaci
on
s.
Y la siguiente acci
on
mover(x, y): Mueve el objeto x sobre y.
La teora consta de una serie de axiomas.
Axiomas para propiedades estaticas:
manipulable(x) x = A x = B x = C x = D
objeto(x) x = A x = B x = C x = D x = M1 x = M2 x = M3
Jorge Baier Aranda, PUC

<< Atras

215

Axiomas de precondicion para acciones:


P oss(mover(x, y), s) x = y zsobre(z, x, s)
zsobre(z, y, s) manipulable(x)

Axiomas de efecto para el fluente sobre. Estos axiomas se usan para especificar
cuando cambian las propiedades dinamicas del dominio.
axyzs (P oss(a, s) a = mover(x, y, s) sobre(x, z, s) sobre(x, y, do(a, s))).
axyzs (P oss(a, s) a = mover(x, y, s) sobre(x, z, s) sobre(x, z, do(a, s))).

Estos axiomas no son suficientes para especificar completamente como cambia el


fluente sobre(x, y, s) (por que?)
Para ello, escribimos el siguiente axioma de estado sucesor :
Jorge Baier Aranda, PUC

<< Atras

216

as (P oss(a, s) (sobre(x,y, do(a, s))


a = mover(x, y)
sobre(x, y, s) za = mover(y, z)))

Axiomas para determinar la situaci


on inicial.
xy sobre(x, y, S0) (x = A y = M1
x = B y = A
x = C y = B
x = A y = M1
x = D y = M2 )

Ademas es necesario agregar axiomas de nombres u


nicos para objetos del dominio.
por que?
Jorge Baier Aranda, PUC

<< Atras

217

Si agrupamos todos estos axiomas dentro de una teora , es sencillo verificar


que:
|=sobre(C, D, do(mover(C, D), S0))
x sobre(x, B, do(mover(C, D), S0))

Jorge Baier Aranda, PUC

<< Atras

218

La especificacin en Prolog
La traducci
on de esta teora a un programa Prolog es directa.
El siguiente es el programa Prolog correspondiente:

% Predicados est
aticos
manipulable(X) :- X=a; X=b; X=c; X=d.
objeto(X) :- X=a; X=b; X=c; X=d; X=m1; X=m2;X=m3.
% Axioma de precondicion
poss(mover(X,Y),S) :manipulable(X),
objeto(Y),
\+ X=Y,
\+ sobre(Z,X,S),
\+ sobre(Z,Y,S).

% Axioma de estado sucesor


Jorge Baier Aranda, PUC

<< Atras

219

sobre(X,Y,do(A,S)) :poss(A,S),
sobre(X,Y,S),
\+ A=mover(X,Z).
sobre(X,Y,do(A,S)) :poss(A,S),
A=mover(X,Y).
% Descripci
on de la situaci
on inicial
sobre(a,m1,s0).
sobre(b,a,s0).
sobre(c,b,s0).
sobre(d,m2,s0).

% Situaciones legales
legal(s0).
legal(do(A,S)) :legal(S),
Jorge Baier Aranda, PUC

<< Atras

220

poss(A,S).

Ahora podemos hacer las siguientes consultas:


?- sobre(X,Y,do(mover(c,d),s0)).
X = a
Y = m1 ;
X = b
Y = a ;
X = d
Y = m2 ;
X = c
Y = d ;
No

Jorge Baier Aranda, PUC

<< Atras

221

?- legal(S),sobre(b,m1,S),sobre(a,b,S).
S = do(mover(a, b), do(mover(b, m1), do(mover(a, m3),
do(mover(b, c), do(mover(c, d), s0))))) ;
S = do(mover(a, b), do(mover(b, m1), do(mover(a, c),
do(mover(b, m3), do(mover(c, d), s0))))) ;
S = do(mover(a, b), do(mover(b, m1), do(mover(a, d),
do(mover(b, c), do(mover(c, m3), s0)))))

Hay inteligencia detras de esto?

Jorge Baier Aranda, PUC

<< Atras

222