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 cl´ ausulas de horn definitivas de primer orden. Una cl´ ausula de horn definitiva de primer orden es una cl´ ausula, 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 cl´ ausula 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 << Atr´ as 174

Prolog de Primer Orden - jabaier.sitios.ing.uc.cljabaier.sitios.ing.uc.cl/iic2212/prolog.pdf · Prolog de Primer Orden •Prolog es un ejemplo de un paradigma de programaci´on llamado

  • Upload
    lamnhu

  • View
    223

  • Download
    1

Embed Size (px)

Citation preview

Page 1: Prolog de Primer Orden - jabaier.sitios.ing.uc.cljabaier.sitios.ing.uc.cl/iic2212/prolog.pdf · Prolog de Primer Orden •Prolog es un ejemplo de un paradigma de programaci´on llamado

Prolog de Primer Orden

• Prolog es un ejemplo de un paradigma de programacion llamado programacionen logica.

• Un programa en Prolog puro de primer orden es un conjunto de clausulas dehorn definitivas de primer orden.

• Una clausula de horn definitiva de primer orden es una clausula, cuantificadauniversalmente y que contiene exactamente un literal positivo. Por ejemplo:∀xyz (P (x, y) ∨ ¬Q(x, y) ∨ ¬R(x, y, z))

• En programacion en logica, esta clausula se anota simplemente como:

P (x, y)← Q(x, y), R(x, y, z)

• Los predicados se anotan con letras minusculas. Si p de aridad n, se acostumbraa llamarlo por p/n.

Jorge Baier Aranda, PUC << Atras 174

Page 2: Prolog de Primer Orden - jabaier.sitios.ing.uc.cljabaier.sitios.ing.uc.cl/iic2212/prolog.pdf · Prolog de Primer Orden •Prolog es un ejemplo de un paradigma de programaci´on llamado

• Al igual que en logica de predicados, un termino puede ser:

Constantes: Estas pueden ser:Atomos: Sımbolos que comienzan con letra minuscula, por ej. x, y, a,

etc. Sımbolos encerrados en comillas simples, por ej. ’X’, ’ 5’, ’ x23’,’a’,, etc.

Numeros: 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: Sımbolos que comiencen con letra mayuscula o con un guion bajo

’ ’. Por ej., X, 5, x23.Functores: Son terminos de funcion. Por ej., padre(X,bonifacio), etc.

Un functor tiene una aridad asociada. Si f es el nombre de un functor, f/mdenota 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

Page 3: Prolog de Primer Orden - jabaier.sitios.ing.uc.cljabaier.sitios.ing.uc.cl/iic2212/prolog.pdf · Prolog de Primer Orden •Prolog es un ejemplo de un paradigma de programaci´on llamado

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

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:

∀x∀y∀z (progenitor(x, z) ∧ ancestro(z, y)→ ancestro(x, y))

que, a su vez, es equivalente a:

∀x∀y (∃z (progenitor(x, z) ∧ ancestro(z, y))→ ancestro(x, y))

Esto significa que toda variable que no se menciona en forma explıcita en lacabeza de una regla se debe suponer como cuantificada existencialmente en lacola de ella.

Jorge Baier Aranda, PUC << Atras 176

Page 4: Prolog de Primer Orden - jabaier.sitios.ing.uc.cljabaier.sitios.ing.uc.cl/iic2212/prolog.pdf · Prolog de Primer Orden •Prolog es un ejemplo de un paradigma de programaci´on llamado

• 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 teorıa de primer orden. Prolog permite consultar que cosasse deducen de el. La respuesta la entrega usando un mecanismo de demostracionque veremos mas adelante.

Jorge Baier Aranda, PUC << Atras 177

Page 5: Prolog de Primer Orden - jabaier.sitios.ing.uc.cljabaier.sitios.ing.uc.cl/iic2212/prolog.pdf · Prolog de Primer Orden •Prolog es un ejemplo de un paradigma de programaci´on llamado

• Las siguientes son consultas que se pueden hacer al interprete.

?- progenitor(juan,olga).Yes.

?- progenitor(X,juan).X = albertoYes

• La segunda consulta se puede leer como “¿existe un X tal queprogenitor(X,juan)?”.

• Al ingresar ; Prolog busca otra respuesta.

• Estas son todas las respuestas que se obtienen de la consultaprogenitor(X,juan).

X = alberto ;X = julia ;No

Jorge Baier Aranda, PUC << Atras 178

Page 6: Prolog de Primer Orden - jabaier.sitios.ing.uc.cljabaier.sitios.ing.uc.cl/iic2212/prolog.pdf · Prolog de Primer Orden •Prolog es un ejemplo de un paradigma de programaci´on llamado

• 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 logico?

• 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 unacorrespondencia entre |= y `p?

Jorge Baier Aranda, PUC << Atras 179

Page 7: Prolog de Primer Orden - jabaier.sitios.ing.uc.cljabaier.sitios.ing.uc.cl/iic2212/prolog.pdf · Prolog de Primer Orden •Prolog es un ejemplo de un paradigma de programaci´on llamado

Algoritmo de Resolución de PROLOG

• A continuacion presentamos una simplificacion del algoritmo de resolucion deProlog de primer orden.

• En el pseudo codigo 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 variablescon nombres nuevos. Es usual que estos nombres sean de la forma n donden es un numero entero.

PP y PP aux: Dos procedimientos que reciben una lista de objetivos y retornanuna sustitucion o #Falso si no hay sustitucion posible. PP aux recibe ademasde 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 trataesto).

Jorge Baier Aranda, PUC << Atras 180

Page 8: Prolog de Primer Orden - jabaier.sitios.ing.uc.cljabaier.sitios.ing.uc.cl/iic2212/prolog.pdf · Prolog de Primer Orden •Prolog es un ejemplo de un paradigma de programaci´on llamado

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

#m: Constante que se inicializa como el numero de clausulas del programa.

Cabeza y Cola: dos funciones sobre reglas o listas de objetivos. Si x es unalista, entonces Cabeza(x) es el primer literal de x y Cola(x) es el resto de lalista. Si x es una clausula, Cabeza(x) es la cabeza de la clausula y Cola(x)es el cuerpo.

aplicarSust : Aplica una sustitucion a un conjunto de variables clausulas.

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

Page 9: Prolog de Primer Orden - jabaier.sitios.ing.uc.cljabaier.sitios.ing.uc.cl/iic2212/prolog.pdf · Prolog de Primer Orden •Prolog es un ejemplo de un paradigma de programaci´on llamado

• A continuacion se muestra la implementacion de las funciones necesarias para laresolucion:

function PP(GL,S)/* devuelve una sustitucion que satisfaga GL o devuelve #Falso */

{if GL=nil return(S);PP_aux(GL,S,1)

}

function PP aux(GL,S,i)/* devuelve sustitucion que satisfaga GL o #Falso */

{clausula C’; /* variables auxiliares */sustitucion 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))),

composicion(S,S’));if S’’=#Falso return(PP_aux(GL,S,i+1));return(S’’);

Jorge Baier Aranda, PUC << Atras 182

Page 10: Prolog de Primer Orden - jabaier.sitios.ing.uc.cljabaier.sitios.ing.uc.cl/iic2212/prolog.pdf · Prolog de Primer Orden •Prolog es un ejemplo de un paradigma de programaci´on llamado

}

• Tal como sugerimos en resolucion de primer orden, este algoritmo renombravariables antes de aplicar la regla de resolucion.

• Si Prolog responde NO cuando este algoritmo retorna #Falso, ¿que significa queProlog responda NO?

• ¿que le falta a este algoritmo?

– Resatisfaccion de consultas. ¿como podemos implementar esto?– ¿Como podemos incorporar negacion?

Jorge Baier Aranda, PUC << Atras 183

Page 11: Prolog de Primer Orden - jabaier.sitios.ing.uc.cljabaier.sitios.ing.uc.cl/iic2212/prolog.pdf · Prolog de Primer Orden •Prolog es un ejemplo de un paradigma de programaci´on llamado

Árboles de demostración

• En Prolog es posible rastrear la demostracion de un objetivo a traves delcomando trace.

• Una vez que el interprete esta en modo trace, toda demostracion de una consultaes mostrada paso a paso.

• Volvamos a considerar el ejemplo de la base de datos familiar.

• El siguiente ejemplo muestra un trace de la ejecucion de la consultaancestro(alberto,olga). [trace] ?- progenitor(maria,X).Call: (6) progenitor(maria, G384) ? creepCall: (7) padre(maria, G384) ? creepFail: (7) padre(maria, G384) ? creepRedo: (6) progenitor(maria, G384) ? creepCall: (7) madre(maria, G384) ? creepExit: (7) madre(maria, olga) ? creepExit: (6) progenitor(maria, olga) ? creep

X = olga ;

Jorge Baier Aranda, PUC << Atras 184

Page 12: Prolog de Primer Orden - jabaier.sitios.ing.uc.cljabaier.sitios.ing.uc.cl/iic2212/prolog.pdf · Prolog de Primer Orden •Prolog es un ejemplo de un paradigma de programaci´on llamado

Fail: (7) madre(maria, G384) ? creepFail: (6) progenitor(maria, G384) ? creepNo

• Esta demostracion se puede resumir en el siguiente arbol de demostracion:

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

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

..

progenitor(maria,X)

progenitor(maria, G384)

padre(maria, G384) madre(maria, G384)

G384=olga

X= G384

× �

• En forma resumida, en un arbol de demostracion:

– Cada nodo no hoja tiene como etiqueta un objetivo a demostrar o los sımbolos.– 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 resolucion entre n y alguna clausula del programa.

Jorge Baier Aranda, PUC << Atras 185

Page 13: Prolog de Primer Orden - jabaier.sitios.ing.uc.cljabaier.sitios.ing.uc.cl/iic2212/prolog.pdf · Prolog de Primer Orden •Prolog es un ejemplo de un paradigma de programaci´on llamado

– La etiqueta que une a n con h es la sustitucion aplicada en la resolucion.– Una demostracion exitosa de un objetivo esta dada por las resoluciones que dan

origen a una rama que termina en un nodo hoja etiquetado con � (clausulavacıa).

– Ejercicio: construya un arbol de demostracion para ancestro(olga,X).

• Una observacion interesante es que Prolog siempre recorre el arbol dedemostracion en profundidad.

Jorge Baier Aranda, PUC << Atras 186

Page 14: Prolog de Primer Orden - jabaier.sitios.ing.uc.cljabaier.sitios.ing.uc.cl/iic2212/prolog.pdf · Prolog de Primer Orden •Prolog es un ejemplo de un paradigma de programaci´on llamado

¿Es un Programa Prolog un Programa en Lógica?

• ¿Por que nos hacemos esta pregunta?

• Serıa ideal que Prolog el metodo de resolucion de Prolog representaraexactamente la nocion de consecuencia logica.

• 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 formulaes satisfacible!

Jorge Baier Aranda, PUC << Atras 187

Page 15: Prolog de Primer Orden - jabaier.sitios.ing.uc.cljabaier.sitios.ing.uc.cl/iic2212/prolog.pdf · Prolog de Primer Orden •Prolog es un ejemplo de un paradigma de programaci´on llamado

• 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 conclusion directa del siguiente teorema.

Teorema 7. Un conjunto de clausulas de Horn de primer orden es siempreconsistente.

Demostracion: Basta con encontrar una interpretacion con un dominio A enque las extensiones de todo predicado n-ario contiene exactamente a An. Talinterpretacion es un modelo para el conjunto, porque todas las clausulas tienenun literal positivo.

• Cabe preguntarnos que relacion hay entre la logica de primer orden y Prolog.

• Si la correspondencia no es exacta, ¿podemos, al menos dar a Prolog unasemantica precisa?

Jorge Baier Aranda, PUC << Atras 188

Page 16: Prolog de Primer Orden - jabaier.sitios.ing.uc.cljabaier.sitios.ing.uc.cl/iic2212/prolog.pdf · Prolog de Primer Orden •Prolog es un ejemplo de un paradigma de programaci´on llamado

• A continuacion veremos como hacer esto.

Jorge Baier Aranda, PUC << Atras 189

Page 17: Prolog de Primer Orden - jabaier.sitios.ing.uc.cljabaier.sitios.ing.uc.cl/iic2212/prolog.pdf · Prolog de Primer Orden •Prolog es un ejemplo de un paradigma de programaci´on llamado

Significado Declarativo de una Respuesta de PROLOG

• Hasta el momento hemos visto que Prolog puede responder a preguntas convariables libres.

• ¿Que significa desde el punto de vista logico que Prolog demuestre p(X,Y)?

• Recordemos que en logica de primer orden es posible tener un sinfin deinterpretaciones distintas.

• Para dar semantica a Prolog, utilizaremos una nocion restringida deinterpretacion.

• Estas interpretaciones tendran como universo a los universos de Herbrand.

Jorge Baier Aranda, PUC << Atras 190

Page 18: Prolog de Primer Orden - jabaier.sitios.ing.uc.cljabaier.sitios.ing.uc.cl/iic2212/prolog.pdf · Prolog de Primer Orden •Prolog es un ejemplo de un paradigma de programaci´on llamado

Modelos de Herbrand

• Un universo de Herbrand es una estructura que se origina de la sintaxis dellenguaje.

• Veamos antes un par de definiciones.

Definicion 26. Un termino instanciado (ground term) de un lenguaje de primerorden, es un termino que no contiene variables.

Definicion 27. Un universo de Herbrand esta formado por todos los terminosinstanciados 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

Page 19: Prolog de Primer Orden - jabaier.sitios.ing.uc.cljabaier.sitios.ing.uc.cl/iic2212/prolog.pdf · Prolog de Primer Orden •Prolog es un ejemplo de un paradigma de programaci´on llamado

• En este programa tenemos los terminos de funcion 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 mınimopues no tiene elementos que no se pueden nombrar usando la sintaxis del lenguaje.

• Si P es un programa construido sobre los sımbolos S =〈{R1, . . . , Rn}, {f1, . . . , fn}, {C1, . . . , Cn}〉, entonces

H = 〈DH, {RH1 , . . . , RH

n}, {fH1 , . . . , fH

n}, {CH1 , . . . , CH

n}〉,donde DH es el universo de Herbrand de P, es una estructura de Herbrand paraese lenguaje.

• La interpretacion de los terminos del lenguaje da una correspondencia unıvocaentre los terminos del lenguaje y los objetos del universo. Ası, una interpretacion

Jorge Baier Aranda, PUC << Atras 192

Page 20: Prolog de Primer Orden - jabaier.sitios.ing.uc.cljabaier.sitios.ing.uc.cl/iic2212/prolog.pdf · Prolog de Primer Orden •Prolog es un ejemplo de un paradigma de programaci´on llamado

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

• 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 unicos hechos que podrıamos 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

Page 21: Prolog de Primer Orden - jabaier.sitios.ing.uc.cljabaier.sitios.ing.uc.cl/iic2212/prolog.pdf · Prolog de Primer Orden •Prolog es un ejemplo de un paradigma de programaci´on llamado

• Esta secuencia de propiedades de objetos concretos es lo que se conoce comouna base de Herbrand.

• Formalmente,

Definicion 28. [Base de Herbrand] Sea P un programa en logica construidosobre los sımbolos S = 〈{R1, . . . , Rn}, {f1, . . . , fn}, {C1, . . . , Cn}〉

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

tj es un termino instanciado (1 ≤ j ≤ n)}

• Un Modelo de Herbrand mınimo para P, escrito por IH(P), es un subconjuntode B(P), pero que contiene exactamente los hechos que se deducen de unprograma.

Jorge Baier Aranda, PUC << Atras 194

Page 22: Prolog de Primer Orden - jabaier.sitios.ing.uc.cljabaier.sitios.ing.uc.cl/iic2212/prolog.pdf · Prolog de Primer Orden •Prolog es un ejemplo de un paradigma de programaci´on llamado

• En el programa ejemplo, un modelo mınimo 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,

Definicion 29. Un Modelo mınimo de Herbrand IH(P) para un programa enlogica P es un subconjunto de B(P) tal que si r ∈ IH(P) entonces existe unaclausula

ch : −c1, . . . , cnen 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 esverdadero si existe una sustitucion θ tal que para cada g ∈ GL, se cumple quegθ ∈ IH(P)

Jorge Baier Aranda, PUC << Atras 195

Page 23: Prolog de Primer Orden - jabaier.sitios.ing.uc.cljabaier.sitios.ing.uc.cl/iic2212/prolog.pdf · Prolog de Primer Orden •Prolog es un ejemplo de un paradigma de programaci´on llamado

• 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 unobjetivo p(X,Y) es encontrar una demostracion constructiva

∃X∃Y p(X, Y)

• La demostracion es constructiva porque Prolog encuentra valores para X e Ypara los que p(X,Y) es consecuencia logica del programa.

• En el area de bases de datos deductivas es comun tratar a las consultas querequieren valores como respuesta como consultas con variables libres.

De esta manera la consulta

∃Rut alumno(Nombre,Rut,Dir)

Se interpreta como una consulta en la que se pregunta por el Nombre y Dir delas tuplas de la tabla alumno.

Jorge Baier Aranda, PUC << Atras 196

Page 24: Prolog de Primer Orden - jabaier.sitios.ing.uc.cljabaier.sitios.ing.uc.cl/iic2212/prolog.pdf · Prolog de Primer Orden •Prolog es un ejemplo de un paradigma de programaci´on llamado

Propiedades de la Resolución Prolog

• ¿Es Prolog correcto?

La resolucion Prolog serıa correcta si es que corresponde exactamente a laregla de primer orden.

Lamentablemente, el mecanismo de resolucion de Prolog no realiza occurscheck .Esto hace que el interprete no reconozca casos en los cuales no se puederealizar unificacion:

?- 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

Page 25: Prolog de Primer Orden - jabaier.sitios.ing.uc.cljabaier.sitios.ing.uc.cl/iic2212/prolog.pdf · Prolog de Primer Orden •Prolog es un ejemplo de un paradigma de programaci´on llamado

• Prolog tampoco es completo.

• La fuente de incomplecion de Prolog es:

– La manera en que se recorre el arbol (en profundidad) de demostracion haceque 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 stackSi 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

Page 26: Prolog de Primer Orden - jabaier.sitios.ing.uc.cljabaier.sitios.ing.uc.cl/iic2212/prolog.pdf · Prolog de Primer Orden •Prolog es un ejemplo de un paradigma de programaci´on llamado

En otras palabras, esto significa que el significado declarativo de Prolog esdistinto al significado procedural de prolog.En ambos programas, el significadodeclarativo es el mismo, pero el interprete no entrega las mismas respuestas.

Jorge Baier Aranda, PUC << Atras 199

Page 27: Prolog de Primer Orden - jabaier.sitios.ing.uc.cljabaier.sitios.ing.uc.cl/iic2212/prolog.pdf · Prolog de Primer Orden •Prolog es un ejemplo de un paradigma de programaci´on llamado

Negación como Falla

• Hasta ahora, nuestros programas Prolog son incapaces de representar la nocionde negacion.

• Por ejemplo, supongamos que quisieramos agregar la siguiente informacion comouna regla:

“Maria adora a los animales, excepto a las gatos”

• Una forma natural de hacer esto en primer orden serıa:

∀x (animal(x) ∧ ¬gato(x)→ adora(Maria, 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 esque no pudo demostrar G usando resolucion a partir del programa.

Jorge Baier Aranda, PUC << Atras 200

Page 28: Prolog de Primer Orden - jabaier.sitios.ing.uc.cljabaier.sitios.ing.uc.cl/iic2212/prolog.pdf · Prolog de Primer Orden •Prolog es un ejemplo de un paradigma de programaci´on llamado

Problemas con Negación como Falla

• Es necesario ser extremadamente cuidadoso cuando se utiliza negacion comofalla.

• En general, hay que evitar que hayan variables no unificadas en objetivosprecedidos 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

Page 29: Prolog de Primer Orden - jabaier.sitios.ing.uc.cljabaier.sitios.ing.uc.cl/iic2212/prolog.pdf · Prolog de Primer Orden •Prolog es un ejemplo de un paradigma de programaci´on llamado

• Cambiemos ahora la ultima 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

Page 30: Prolog de Primer Orden - jabaier.sitios.ing.uc.cljabaier.sitios.ing.uc.cl/iic2212/prolog.pdf · Prolog de Primer Orden •Prolog es un ejemplo de un paradigma de programaci´on llamado

Estructuras de Datos en Prolog

• La semantica de modelos mınimos subyacente de Prolog, permite expresar enforma sencilla estructuras de datos que no se pueden modelar en primer orden.

• Por ejemplo, mas adelante veremos que no es posible construir un conjunto deaxiomas 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 predicadonumero para identificar a los naturales.

• Podemos considerar al primer numero como 0, al sucesor de 0 como s(0), alsucesor de este como s(s(0)).

• Si bien los nombres que usamos para los numeros son distintos (no usamos1, 2, 3, . . .), esta representacion es suficiente.

• El predicado numero se puede expresar facilmente como:

Jorge Baier Aranda, PUC << Atras 203

Page 31: Prolog de Primer Orden - jabaier.sitios.ing.uc.cljabaier.sitios.ing.uc.cl/iic2212/prolog.pdf · Prolog de Primer Orden •Prolog es un ejemplo de un paradigma de programaci´on llamado

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

• Supongamos ahora que queremos construir un predicado suma(X,Y,Z) que esverdadero cuando Z es la suma de X e Y en esta representacion.

• 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 ejecucion 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 podrıamos haber pensado como entradas,tambien pueden ser parametros de salida.

Jorge Baier Aranda, PUC << Atras 204

Page 32: Prolog de Primer Orden - jabaier.sitios.ing.uc.cljabaier.sitios.ing.uc.cl/iic2212/prolog.pdf · Prolog de Primer Orden •Prolog es un ejemplo de un paradigma de programaci´on llamado

• Por ejemplo la consulta suma(s(s(0)),X,s(s(s(0)))) significa “¿que numerodebo sumarle a 2 para que de 3?” puede ser respondida por Prolog usando laimplementacion 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 sumaen los naturales. Prolog se limita simplemente a demostrar.

• ¿Como podemos implementar la multiplicacion?

mult(0,X,0).mult(s(X),Y,Z) :- mult(X,Y,U),suma(U,Y,Z).

• ¿En que propiedad de la multiplicacion esta basada esta regla?

• Podremos ahora usar a Prolog para resolver la ecuacion:

3x + 1 = 7

Jorge Baier Aranda, PUC << Atras 205

Page 33: Prolog de Primer Orden - jabaier.sitios.ing.uc.cljabaier.sitios.ing.uc.cl/iic2212/prolog.pdf · Prolog de Primer Orden •Prolog es un ejemplo de un paradigma de programaci´on llamado

• 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

Page 34: Prolog de Primer Orden - jabaier.sitios.ing.uc.cljabaier.sitios.ing.uc.cl/iic2212/prolog.pdf · Prolog de Primer Orden •Prolog es un ejemplo de un paradigma de programaci´on llamado

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 conclusion: Prolog no resuelve todo (esto es consecuencia de que esincompleto).

• Para que encuentre las respuestas es necesario que el programador se preocupede ordenar la busqueda, que no es lo ideal.

Jorge Baier Aranda, PUC << Atras 207

Page 35: Prolog de Primer Orden - jabaier.sitios.ing.uc.cljabaier.sitios.ing.uc.cl/iic2212/prolog.pdf · Prolog de Primer Orden •Prolog es un ejemplo de un paradigma de programaci´on llamado

Manejo de Listas

• Es posible tambien manejar listas en Prolog.

• La siguiente es una definicion inductiva de lista.

– La lista vacıa nil, es una lista.– Si L es una lista, entonces a · L tambien es una lista.

• De esta manera, la lista formada por los numeros 1,2 y 3 se ve bajo esta definicioncomo

1 · 2 · 3 · nily que en la representacion grafica usual se verıa como:

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

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

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

31 2

• 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

Page 36: Prolog de Primer Orden - jabaier.sitios.ing.uc.cljabaier.sitios.ing.uc.cl/iic2212/prolog.pdf · Prolog de Primer Orden •Prolog es un ejemplo de un paradigma de programaci´on llamado

Concatenación de Listas

• La operacion de concatenacion de lista ◦ sirve para juntar dos listas en una sola.

• La concatenacion se puede definir inductivamente por:

– nil ◦ L = L, con L lista.– (a · L1) ◦ L2 = a · (L1 ◦ L2), con L1 y L2 listas.

• La implementacion de esta definicion es directa:

conc(nil,L,L).conc(L,L2,Z) :- L=cons(X,L1),conc(L1,L2,U),Z=cons(X,U).

• Esta ultima definicion 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 ejecucion:

Jorge Baier Aranda, PUC << Atras 209

Page 37: Prolog de Primer Orden - jabaier.sitios.ing.uc.cljabaier.sitios.ing.uc.cl/iic2212/prolog.pdf · Prolog de Primer Orden •Prolog es un ejemplo de un paradigma de programaci´on llamado

?- 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 lasiguiente consulta:

?- conc(X,Y,cons(1,cons(2,cons(3,nil)))).

X = nilY = 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

Page 38: Prolog de Primer Orden - jabaier.sitios.ing.uc.cljabaier.sitios.ing.uc.cl/iic2212/prolog.pdf · Prolog de Primer Orden •Prolog es un ejemplo de un paradigma de programaci´on llamado

No

• Siguiendo estas mismas ideas es posible implementar otras estructuras de datos,como por ejemplo arboles o colas.

Jorge Baier Aranda, PUC << Atras 211

Page 39: Prolog de Primer Orden - jabaier.sitios.ing.uc.cljabaier.sitios.ing.uc.cl/iic2212/prolog.pdf · Prolog de Primer Orden •Prolog es un ejemplo de un paradigma de programaci´on llamado

Otra Aplicación: Búsqueda y Cálculo de Situaciones

• El calculo de situaciones es una familia de lenguajes logicos de primer orden masinduccion.

• Es una familia de lenguajes con tipos.

• En las logicas con tipos las variables pertenecen a un tipo especıfico.

• Este lenguaje ha sido usado en inteligencia artificial para modelar mundosdinamicos.

• En el calculo de situaciones se distinguen los siguientes elementos:

– Situaciones. Hay una unica situacion inicial, S0. Todas las situacionessiguientes se obtienen como resultado de ejecutar alguna secuencia de accionesen S0.Si s es una situacion, diremos que do(a, s) es la situacion que resulta deejecutar a en s.

– Acciones. Son los elementos que sirven para cambiar de una situacion a otra.

Jorge Baier Aranda, PUC << Atras 212

Page 40: Prolog de Primer Orden - jabaier.sitios.ing.uc.cljabaier.sitios.ing.uc.cl/iic2212/prolog.pdf · Prolog de Primer Orden •Prolog es un ejemplo de un paradigma de programaci´on llamado

– Predicado especial Poss. Poss(a, s) es verdadero ssi la accion a es posibleen la situacion s.

– Fluentes. Son predicados que sirven para representar las propiedades delmundo. Estos predicados tienen siempre un unico argumento de situacion.Por ejemplo,

sobreElP iso(x, s)

Puede significar que el objeto x se encuentra sobre el piso en la situacion s.

• Tal como en los lenguajes ordinarios de primer orden tenemos objetos del dominioy predicados sin terminos de situacion.

• Estos ultimos se utilizan para especificar propiedades que no cambian al ejecutaracciones.

Jorge Baier Aranda, PUC << Atras 213

Page 41: Prolog de Primer Orden - jabaier.sitios.ing.uc.cljabaier.sitios.ing.uc.cl/iic2212/prolog.pdf · Prolog de Primer Orden •Prolog es un ejemplo de un paradigma de programaci´on llamado

El mundo de Bloques

• Modelaremos el mundo de bloques de la figura en el Calculo de Situaciones yveremos que tareas de razonamiento podemos realizar.

D

B

C

A

M2M1 M3

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

• Siempre es posible tomar un bloque libre (que no tiene bloques sobre el) y ubicarlosobre otro bloque.

• Las mesas M1, M2 y M3 no son manipulables.

Jorge Baier Aranda, PUC << Atras 214

Page 42: Prolog de Primer Orden - jabaier.sitios.ing.uc.cljabaier.sitios.ing.uc.cl/iic2212/prolog.pdf · Prolog de Primer Orden •Prolog es un ejemplo de un paradigma de programaci´on llamado

• 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 situacions.

• Y la siguiente accion

– mover(x, y): Mueve el objeto x sobre y.

• La teorıa 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

Page 43: Prolog de Primer Orden - jabaier.sitios.ing.uc.cljabaier.sitios.ing.uc.cl/iic2212/prolog.pdf · Prolog de Primer Orden •Prolog es un ejemplo de un paradigma de programaci´on llamado

• Axiomas de precondicion para acciones:

Poss(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 especificarcuando cambian las propiedades dinamicas del dominio.

∀axyzs (Poss(a, s) ∧ a = mover(x, y, s) ∧ sobre(x, z, s)→ sobre(x, y, do(a, s))).

∀axyzs (Poss(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 elfluente sobre(x, y, s) (¿por que?)

Para ello, escribimos el siguiente axioma de estado sucesor :

Jorge Baier Aranda, PUC << Atras 216

Page 44: Prolog de Primer Orden - jabaier.sitios.ing.uc.cljabaier.sitios.ing.uc.cl/iic2212/prolog.pdf · Prolog de Primer Orden •Prolog es un ejemplo de un paradigma de programaci´on llamado

∀as (Poss(a, s)→ (sobre(x,y, do(a, s))↔a = mover(x, y)∨sobre(x, y, s) ∧ ¬∃ za = mover(y, z)))

• Axiomas para determinar la situacion 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 unicos para objetos del dominio.¿por que?

Jorge Baier Aranda, PUC << Atras 217

Page 45: Prolog de Primer Orden - jabaier.sitios.ing.uc.cljabaier.sitios.ing.uc.cl/iic2212/prolog.pdf · Prolog de Primer Orden •Prolog es un ejemplo de un paradigma de programaci´on llamado

• Si agrupamos todos estos axiomas dentro de una teorıa Σ, es sencillo verificarque:

Σ |=sobre(C,D, do(mover(C,D), S0))∧¬∃x sobre(x,B, do(mover(C,D), S0))

Jorge Baier Aranda, PUC << Atras 218

Page 46: Prolog de Primer Orden - jabaier.sitios.ing.uc.cljabaier.sitios.ing.uc.cl/iic2212/prolog.pdf · Prolog de Primer Orden •Prolog es un ejemplo de un paradigma de programaci´on llamado

La especificación en Prolog

• La traduccion de esta teorıa a un programa Prolog es directa.

• El siguiente es el programa Prolog correspondiente:

% Predicados estaticosmanipulable(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

Page 47: Prolog de Primer Orden - jabaier.sitios.ing.uc.cljabaier.sitios.ing.uc.cl/iic2212/prolog.pdf · Prolog de Primer Orden •Prolog es un ejemplo de un paradigma de programaci´on llamado

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

% Descripcion de la situacion 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

Page 48: Prolog de Primer Orden - jabaier.sitios.ing.uc.cljabaier.sitios.ing.uc.cl/iic2212/prolog.pdf · Prolog de Primer Orden •Prolog es un ejemplo de un paradigma de programaci´on llamado

poss(A,S).

• Ahora podemos hacer las siguientes consultas:

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

Jorge Baier Aranda, PUC << Atras 221

Page 49: Prolog de Primer Orden - jabaier.sitios.ing.uc.cljabaier.sitios.ing.uc.cl/iic2212/prolog.pdf · Prolog de Primer Orden •Prolog es un ejemplo de un paradigma de programaci´on llamado

?- 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