You are on page 1of 6

Agenda

Lenguajes Formales y
Autmatas
Introduccin a PROLOG

2 cuatrimestre de 2007
Departamento de Cs. e Ing. De la computacin
Universidad Nacional del Sur

PROLOG
Hechos

y Reglas (reglas recursivas)


se hace con un programa Prolog: Consultas
Intrprete Prolog: SWI-PROLOG
Variables, unificacin, is/2
Datos: constantes (tomos, nmeros), estructuras,
variables
Listas
Negacin por falla (diferencia con negacin lgica)
...
Qu

PROLOG
Lenguaje

Cmo es un programa Prolog

para programacin/computacin

simblica
Adecuado para la resolucin de problemas que
involucra objetos y relaciones entre objetos

Un

programa Prolog est conformado por clusulas o


reglas.
Las clusulas o reglas tienen la siguiente forma
<Cabeza> :- <Cuerpo>
El cuerpo de la regla puede ser vaco, en cuyo caso se dice
que la regla es un Hecho.
Al

cuerpo de una regla se lo denomina antecedente, y


a la cabeza conclusin
Una regla se puede leer informalmente como:
 Si se verifica el antecedente entonces vale la conclusin
 Ejemplo: si llueve entonces est nublado

nublado :- llueve

Qu dice el programa

Ejemplo de un programa Prolog


profesor(ana).
profesor(guillermo).
profesor(alejandro).
asistente(sergio).
asistente(jessica).
ayudante(guadalupe).
ayudante(sebastian).
ayudante(nicolas).
recibido(sebastian).
recibido(nicolas).

profesor(pedro).
si el trmino pedro lo utilizamos para
hechos

docente(X):- profesor(X).
docente(X):- asistente(X).
docente(X):- ayudante(X).

reglas

representar a alguien que conocemos y que se


llama Pedro, y el predicado profesor(X) lo
usamos para expresar que X es profesor/a,
entonces el hecho est expresando que Pedro
es profesor.
Idem asistente, ayudante, recibido.

Qu dice el programa
docente(X):- profesor(X).
si el predicado docente(X) lo utilizamos
para representar que X es docente, y como
antes el predicado profesor(X) lo usamos
para expresar que X es profesor/a, entonces,
la regla est diciendo que
Si X es profesor entonces X es docente.
profesor(X)  docente(X)

Varias reglas
docente(X):- profesor(X).
docente(X):- asistente(X).
docente(X):- ayudante(X).

Definimos docente(X) a travs de tres reglas.


Estamos diciendo que X es docente si es
profesor, o si es asistente, o si es ayudante.
profesor(X) asistente(X) ayudante(X)  docente(X)

Otra regla

Resumiendo

Supongamos

que definimos el concepto


ayudante A a travs de las siguientes reglas:

p(1).
q(1).
q(3).

Decimos que vale o es cierto


p(1), q(1), y q(3).

ayudanteA(X):- ayudante(X), recibido(X).

Estamos diciendo que X es ayudante categora A,


si es ayudante y est recibido.

r(X) :- p(X), s(X).


r(X):- t(X).

Decimos que vale


t(X) (p(X) s(X))  r(X)

s(X,Y):- p(X),r(Y).

Decimos que vale


p(X) r(Y)  s(X,Y)

ayudante(X) recibido(X)  ayudanteA(X)

Qu hago con un programa PROLOG?


Cuando

escribo un programa PROLOG, escribo mi


conocimiento sobre el dominio de algn problema que
quiero modelar.

Grafos y caminos
Supongamos
arco(a,b).
arco(b,c).
arco(b,d).
arco(d,c).

Escribo

a travs de reglas y hechos, lo que se conoce


de la situacin.
me va a interesar realizar consultas a ese
programa (base de conocimiento) para ver si ciertas
piezas de informacin valen segn lo que expres en
mi programa.

Luego,

bob

ann

liz

pat

jim
[Bratko- Prolog programming for AI]

Puedo estar interesado en averiguar cosas como:


hay un arco de a hacia c?
hay un camino de a hacia d?
hay un arco saliente desde c?
llega algn arco hacia b y algn arco hacia a ?

Veamos

estos ejemplos en un intrprete


PROLOG.
Usaremos SWI-Prolog (http://www.swi-prolog.org/)

Family tree
parent(tom,
parent(pam,
parent(tom,
parent(tom,
parent(bob,
parent(bob,
parent(pat,

Intrprete PROLOG

hay un arco de a hacia c?


?- arco(a,c).
no
hay un camino de a hacia d?
?- arco(a,d).
no
hay un arco saliente desde c?
?- arco(c,X).
no
llega algn arco hacia b y algn arco hacia a ?
?- arco(X,b), arco(Y,a).
no

tom

camino(X,Y):- arco(X,Y).
camino(X,Y):- arco(X,Z), camino(Z,Y).

Consultas Prolog

pam

que tengo el siguiente programa PROLOG

Hechos
bob).
bob).
bob).
liz).
ann).
pat).
jim).

Tenemos

un programa
de 6 clusulas. Cada una
declara un hecho
sobre la relacin
parent
Podemos hacer
consultas sobre lo que
establece este programa

parent(tom,
parent(pam,
parent(tom,
parent(tom,
parent(bob,
parent(bob,
parent(pat,

bob).
bob).
bob).
liz).
ann).
pat).
jim).

Consultas (1)
Es padre bob de pat?
?- parent(bob, pat).

Consultas (2)
Encuentre un X y un Y tal que X sea padre de Y?

Es padre liz de pat?


?- parent(X, Y).

?- parent(liz, pat).

Es padre tom de ben?


?- parent(tom, ben).

Quin es padre de liz?


?- parent(X, liz).

Quines son los hijos de bob?

Quin es abuelo/a de jim? O dicho de otra forma:


- Quin es padre de Jim? Supongamos que es Y.
- Quin es padre de ese Y? Supongamos que es X.

?- parent(bob, X).
?- parent(Y, jim), parent(X,Y).
OBS: X es una variable. En cambio, bob, liz, pat,etc. son tomos e identifican
objetos fijos.

Reglas

Ms consultas
Quines son los nietos de tom?
Tienen un mismo padre ann y pat?
Tiene hijos liz?

offspring( Y, X)

:- parent( X, Y).

Para todo X e Y:
Y es offspring (hijo) de X si X es parent (padre) de Y

Reglas: P :- Q
Especifican que una conclusin P es cierta la condicin Q
se satisface
P :- Q
Cabeza
(conclusin)

pam).
liz).
ann).
pat).

male( tom).
male( bob).
male( jim).

mother( X, Y) :- parent( X, Y),female( X).


% X es la madre de Y si X es padre de Y y X es
% mujer
% <- para hacer comentarios :)

sister/2
sister(X,Y):-

parent( Z, X),
female( X).

?- sister( X, pat).
X = ann;
X = pat

Cuerpo
(condicin)

Ms definiciones

Ms Hechos y Reglas
female(
female(
female(
female(

:-

grandparent(X,Z):- parent( X, Y), parent( Y,Z).

sister(X,Y):-

parent( Z, X),
parent( Z, Y),
female( X).

Consultas
?- sister( ann, pat).
?- sister( X, pat).

Reglas recursivas

parent( Z, Y),

% sister(pat,pat) :(

Definicin de ancestro o predecesor


predecessor(X,Z):-

parent(X,Z).

predecessor(X,Z):-

parent(X,Y), %caso gral.


predecessor(Y,Z).

Asumamos la definicin de different/2


different(X,Y) :-

X\=Y.

Otra definicin de sister/2


sister(X,Y):-

%ojo!

parent( Z, X), parent( Z, Y),


different( X, Y), female( X).

?- predecessor(tom,pat).
yes
Cmo se obtiene esa respuesta? (pizarrn)

%caso base

Datos

Objetos.simples.CONSTANTES
constantes

objetos
estructurados

tomos:
pam
hola_mundo
Tom
Miss Jones

simples
variables
constantes
tomos
nmeros

nmeros

Objetos.simples.VARIABLES
Empiezan con Mayscula
No se declaran.

Variables e Instanciacin
Ver

intrprete

Son locales a la clusula donde aparecen


Pueden estar instanciadas o sin instanciar. Una vez que se
instancian completamente NO pierde ms su
INSTANCIACIN :)
No puedo cambiarle el valor a una variable
El concepto de variable es el mismo que en matemtica o
lgica, i.e NO ES la misma nocin de variable (contenedor)
de la programacin imperativa (pascal, java, etc)

is /2

Unificacin (=)
No es igualdad !

No es asignacin !

Una variable SIN INSTANCIARunifica con cualquier cosa

No es ni igualdad, ni asignacin, ni unificacin !


La consulta o meta T is E es exitosa si T unifica con el
resultado de la evaluacin de la expresin numrica E

Predicado de unificacin: =/2

X = a.
5 = 2+3.
ciao = chau.
Hola = Ciao.
W = a, W = b.

yes
no
no
yes
no

Una variable INSTANCIADA ya no se desinstancia

Listas
Son secuencias de elementos

Predicado: is/2

2
2
R
R
W

is 2+0
= 2+0
is 2*3
= 5, R is 2*3
is [1,2,3]

yes
no
yes
no
no

Definiendo predicados sobre listas


(cualquier trmino

Longitud

de una lista

sintcticamente vlido: ie. Casi cquier cosa!)

Elementos entre corchetes [, ]


El trmino constante [ ] representa la lista vaca
El trmino [X|Xs] representa la lista con cabeza X
y cola Xs
Ver ejemplos de matching en el intrprete

Ejemplos de listas:
[ ] , [a,b,1,hola,chau], [p(x),q(R,S),[3,a],[]], etc.

longitud([],0).
longitud([X|Xs],N):- longitud(Xs,Ns),
N is Ns+1.
Concatenar

dos listas

concatenar([],X,X).
concatenar([X|Xs],Y,[X|Z]):- concatenar(Xs,Y,Z).
X

Xs
X

Xs

Y
Z

Ver interprete
uso inverso

Ejercicios
Definir







InsertSort
Algoritmo

predicados

visto en teoria

Ordenamiento por insercin


sort ([] ) = [] ,
sort (x :: L) = insert (x, sort (L)) .

cantidad_As(L,As)
pertenece(X,L)
reverso(L, Lr)
ultimoElemento(
...

insert (x, S) =
if S = []
then [x]
else if x head(S)
then x :: S
else head (S) :: insert(x, tail(S))

Veamos cmo lo escribimos en PROLOG

Negacin por falla (not)

menor(L,M)
Definamos

menor(L,M) de forma tal que sea


exitoso si M es el menor elemento de la lista L

Arg no puede ser probado

a:
b, p.
b:
q.
b:
e.
e.

menor([X],X).
menor([Y|Ys],Y):-

not(Arg)
Es exitoso (i.e responde yes) cuando

menor(Ys,Menor),
Y < Menor.

menor([Y|Ys],Menor):-menor(Ys, Menor).

Dada

una lista L, decimos que X es el menor o


mnimo de L, si X pertenece a la lista y no existe
otro elemento Y que pertence a L que sea
distinto a X y que sea menor a X.

existeOtroMenor(L,X):- pertenece(Y,L),
Y\=X,
Y<X.

Cmo funciona el intrprete PROLOG?


Resolucin y Backtracking
C1)
C2)
C3)
C4)
C5)

a : b, p.
b : q.
b : e.
e.
a : e.

: a.

C5

b,p
C2

q,p

e
C4

C3

e,p
C4

fail

p
fail

pertenece(X,L):- append(As,[X|Bs],L)
X pertenece a L si existen As y Bs tales que
As concatenado con X.Bs es L
intersectan(A,B):- pertenece(X,A),
pertenece(X,B).
A y B se intersectan si existe un X tal que
X pertenezca a A y a B

pertenece(X,L),
not(existeOtroMenor(L,X)).

C1

?- not(p).
yes
?- not(e).
no

Otros ejemplos

Otra forma de definir menor

minimo(L,X):-

?- p.
no
?- e.
yes

Objetos.ESTRUCTURADOS
Son objetos con muchas componentes. Los componentes
pueden, a su vez, ser estructurados.
Ejemplos:
fecha(4, abril, 2006)
functor

argumentos

Obs: un da cualquiera de abril de 2006  fecha(D,abril, 2006)

Ms ejemplos:
Prueba, de
arriba para
abajo, de
izquierda a
derecha

1 ?- P1=point(1,2), P2=point(3,4), S=segmento(P1,P2).


P1 = point(1, 2)
P2 = point(3, 4)
S = segmento(point(1, 2), point(3, 4))

Trminos

Matching

En Prolog, los objetos mencionados se denominan trminos.


Son trminos las variables, las constantes, los objetos
estructurados

La operacin ms importante entre trminos es la operacin


de matching, a veces denominada unificacin ya que se
origina la nocin de unificacin conocida en lgica aunque
no se exactamente lo mismo.

Un trmino estructurado se identifica por su functor/nombre


y su aridad. As, punto(X,Y) es una estructura distinta a
punto(X,Y,Z)

Es un proceso que toma dos trminos y chequea si


coinciden o unifican. Si los trminos no unifican el proceso
falla. Si los trminos unifican el proceso es exitoso y se
instancian las variables en ambos trminos de forma tal que
ambos trminos sean idnticos.

Matching (2)
1 ?- fecha(D, M, 1983) = fecha(D1, mayo, A1).
D = _G429
M = mayo
D1 = _G429
A1 = 1983 ;

Matching (3)
Algoritmo de Matching
(1) Si S y T son constantes, entonces S y T unifican ssi son el mismo objeto
(2) Si S es una variable y T es un trmino, unifican si S se puede instanciarse
a T (idem. Viceversa)
(3) Si S y T son estructuras, unifican solo si
(1) S y T tienen el mismo functor principal y,
(2) todos los componentes correspondientes (argumentos) unifican

Observacin: En Prolog la operacin de matching resulta en la instanciacin


ms general

Fin

You might also like