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

La programacin en prolog consiste en escribir clusulas

de Horn:
1. Hechos (facts): A .
2. Reglas (rules): A B
1
,,B
n
3. Consultas (queries): B
1
,,B
n
Un programa Prolog es una secuencia de Hechos y Reglas
PROGRAMA
Un programa Prolog es una lista ordenada de
clusulas, no un conjunto de clusulas.
PROLOG
Notacin:
[ ]: lista vaca
[a1 , a2, ... , an]: lista de n elementos
[X | Y]: X, primer elemento de la lista - Y, cola de la lista
[a1 , a2 | X]: a1, primer elemento de la lista
a2, segundo elemento de la lista
X, cola de la lista
Listas
Una lista es un par de elementos en donde el
primero es un trmino y el segundo es
recursivamente el resto de la lista.
1. Lista( [ ] ) .
2. Lista([X | Y]) :- Lista ( Y ).
CONSULTAS
( Lista([a , b , c]) )
Programas bsicos de listas
1. miembro(X, [X|Xs]).
2. miembro(X,[Y|Ys]):-miembro(X,Ys).
(miembro(a , [s , a , d]))
(miembro(a , [s , T , d]))
1. concatenar ([ ], Xs, Xs).
2. concatenar([X|Xs],Ys,[X|Zs]) :- concatenar(Xs,Ys,Zs).
( concatenar([a , d , c] , [s , a , d] , Z) )
(concatenar(T , [s , a , d] , [a , d , c , s , a , d]) )
Raiz , ArbolDer ) ArbolIzq ,
Un rbol binario es un grafo dirigido acclico, en el cual
cada nodo posee como mximo dos sucesores y un slo
predecesor.
a
b
c
d
e f
g
h
j k
n o
arbol(
Se podra representar empleando una funcin de tres argumentos.
rbol Binario
Programas bsicos
arbolBinario(A)
devuelve verdadero si
A es un rbol
1. miembro(X, [X|Xs]).
2. miembro(X,[Y|Ys]):-miembro(X,Ys).
miembro(X,A)
devuelve verdadero si X
es un nodo del rbol A
1. Lista( [ ] ) .
2. Lista([X | Y]) :- Lista ( Y ).
de Listas
de rboles
Arbol Binario
1. arbol_binario (nil).
2. arbol_binario(arbol( Raz , Sub_a_i , Sub_a_d) ):-
arbol_binario(Sub_a_i ) ,
arbol_binario(Sub_a_d ) .
Funcin
3. miembro(X , arbol(X , Der , Izq)).
4. miembro(X , arbol(Y , Der , Izq)) :- distinto (X , Y),
miembro(X , Der).
5. miembro(X , arbol(Y , Der , Izq)) :- distinto (X , Y),
miembro(X , Izq).
Programas bsicos
PROGRAMA
hombre(juan).
padre(jose , jorge)
padre(jorge,maria).
hombre(jorge).
padre(jose,juan)
mujer(mara).
dist(jorge,juan).
hermano(X , Y) :- padre(Z , X) , padre(Z , Y), dist(X , Y).
Los Programas Lgicos estn constituidos por un conjunto de
Reglas y Hechos que describen
QUE ES VERDADERO
Los hechos FALSOS no se expresan
EXPLCITAMENTE en un
Programa Lgico, se OMITEN.
En el PROGRAMA no se presenta
explcitamente que
hombre(mara) es FALSO,
solo se omite.
Negacin
En programacin lgica se utiliza una forma limitada de la
negacin, mediante el empleo del not
Una consulta not C
(o sea, verificar que C es FALSO)
ser consecuencia de un programa R, s
C no es consecuencia de R.
not hombre(mara)
es consecuencia del programa R, ya que
hombre(mara)
no es consecuecia lgica del programa R.
Negacin
? - hermano(juan , maria)
hermano(juan , maria)
padre(Z,juan) , padre(Z,maria) , dist(juan,maria)
(padre(jose,maria) , dist(juan,maria))
falla
En Prolog la negacin se trabaja como FALLA en los rboles
de bsqueda.
Un rbol de bsqueda para la consulta C con respecto
al programa R, se denomina
rbol finito sin solucin
si el rbol no posee:
1. nodo exitoso
2. ramas infinitas
rbol finito sin solucin
para la consulta
hermano(juan , maria)
La consulta not ( C ) se deduce de R, s C est en el
Conjunto de Consultas con
rbol Finito sin-solucin del Programa R.
Programa R
estudiante_libre(X):- not (rindio(X,2)) , estudiante(X).
rindio(juan,2).
estudiante(pedro).
estudiante(juan).
Consulta
f = estudiante_libre( pedro )
/ R |= f ? SI, ={X/pedro}
rindio(pedro,2) tiene un rbol finito sin-solucin en R
Programa R
estudiante_libre(X):- not (rindio(X,2)) , estudiante(X).
rindio(juan,2).
estudiante(pedro).
estudiante(juan).
Consulta
f = estudiante_libre( T )
/ R |= f ? NO
rindio(X,2) no tiene un rbol finito sin-solucin en R
La implementacin de la negacin no trabaja
correctamente con expresiones no-bsicas
(no-ground).
En la mayora de las implementaciones de
PROLOG, es responsabilidad del programador
asegurar que la consulta negada funcione
correctamente.
CORTE (CUT) !
! es un predicado del sistema.
Su funcin es reducir el espacio de bsqueda de PROLOG,
mediante la poda dinmica del rbol de bsqueda.
Consideremos el predicado
unir(L1 , L2 , Unida)
que consiste en unir dos lista ordenadas en una tercera,
tambin ordenada
unir([X|Xc] , [Y|Yc] , [X|Zc]) :- X < Y , unir(Xc , [Y|Yc] , Zc).
unir([X|Xc] , [Y|Yc] , [X|Zc]) :- X = Y , unir(Xc , Yc , Zc).
unir([X|Xc] , [Y|Yc] , [Y|Zc]) :- X > Y , unir([X|Xc] , Yc , Zc).
unir(X , [ ] , X).
unir([ ] , X , X).
En este caso solo una de las clusulas puede ser aplicable, es
decir, slo uno de los tests
< , = , >
puede verificarse.
Si uno de los tests ha tenido xito, no hay posibilidad que otro
sea exitoso.
Cut puede ser utilizado para expresar esto
unir([X|Xc] , [Y|Yc] , [X|Zc]) :- X < Y , ! , unir(Xc , [Y|Yc] , Zc).
unir([X|Xc] , [Y|Yc] , [X|Zc]) :- X = Y , ! , unir(Xc , Yc , Zc).
unir([X|Xc] , [Y|Yc] , [Y|Zc]) :- X > Y , ! , unir([X|Xc] , Yc , Zc).
! no permitir que PROLOG intente otra unificacin de
los objetivos previos a l.
Operacionalmente se lo puede definir de la siguiente forma:
Cut es un predicado que al ser evaluado siempre tiene
xito.
Cut hace que PROLOG asuma como ciertas y nicas las
elecciones realizadas desde que se unific un objetivo
con el lado izquierdo de la clusula en la que se halla y
ha sido inspeccionado.
1 = 3 , ! , unir([4] , [5] , Zc)
1 > 3 , ! , unir([3 , 4] , [5] , Zc)
A
B
unir([1,4] , [3,5] , X )
1 < 3 , ! , unir([4] , [3,5] , Zc)
! , unir([4] , [3,5] , Zc)
unir([4] , [3,5] , Zc)
. . . . . . . . . . . . . . . . .
No se retorna para
evaluar las ramas A
y B
Efectos del Cut:
Cut poda todas las clusula debajo de la que lo
contiene, y en la cual fue evaluado (en la definicin de
un dado predicado).
minimo(5,5,M)
5 =< 5, !
1.
1
= {X/5,Y/5,M/5} 2.
2
= {X/5,Y/5,M/5}
!
xito, {M/5}

5 =< 5
xito, {M/5}
No se recorre
No es una
Solucin
minimo(X,Y,X):- X=<Y,!.
minimo(X,Y,Y):- Y=<X.
minimo(5,5,M)
Efectos del Cut:
Cut poda todas las clusula debajo de la que lo
contiene, y en la cual fue evaluado (en la definicin de
un dado predicado).
Cut poda todas las soluciones alternativas a la
conjuncin de objetivos que aparecen a la izquierda
del mismo
P :- A , B , ! , C.
Se tomar la primer solucin exitosa para
A , B
p(a,1).
p(b,1).
q(1,a).
r(X,Y):- p(X,Z),!, q(Z,Y). r(V,W)
!, q(1,Y)
1.
1
= {V/X,W/Y}
2.
4
= {X/b,Y/1}
p(X,Z),!,q(Z,Y)
xito, {X/a, Y/a}

No se recorre
No es una
Solucin
1.
2
= {X/a,Z/1}
q(1,Y)
3.
3
= {Y/a}
!, q(1,Y)
xito, {X/b, Y/a}

q(1,Y)
3.
5
= {Y/a}
r(V,W)
Efectos del Cut:
Cut poda todas las clusula debajo de la que lo
contiene, y en la cual fue evaluado (en la definicin de
un dado predicado).
Cut poda todas las soluciones alternativas a la
conjuncin de objetivos que aparecen a la izquierda
del mismo
P :- A , B , ! , C.
Se tomar la primer solucin exitosa para
A , B
Cut no afecta los objetivos ubicados a su derecha. Se
podrn analizar ms de una solucin para ellos. Si
estos fallan, Prolog retornar a la clusula previa a la
que contiene el Cut.
p(a,1).
p(b,1).
q(1,a).
r(X,Y):- p(X,Z),!, q(Z,Y).
q(1,d).
r(V,W)
!, q(1,Y)
1.
1
= {V/X,W/Y}
2.
4
= {X/b,Y/1}
p(X,Z),!,q(Z,Y)
xito, {X/a, Y/a}

No se recorre
No es una
Solucin
1.
2
= {X/a,Z/1}
q(1,Y)
3.
3
= {Y/a}
!, q(1,Y)
xito, {X/b, Y/a}

q(1,Y)
3.
5
= {Y/a}
xito, {X/a, Y/d}

6.
3
= {Y/d}
No es afectada.
Es solucin
r(V,W)
1. concatenar([ ],X,X):- !.
2. concatenar([X|Xs],Ys,[X|Zs]):- concatenar(Xs,Ys,Zs).
La consulta:
concatenar(Z , T , [a d n])
Rta: Z = [ ]
T = [a d n]
Debido al ! no se hallan las otras soluciones
COMPORTAMIENTO DEL CUT
COMPORTAMIENTO DEL CUT
Si se pretende simplificar el programa R, considerando que
cuando se evalua la segunda clausula ya se verific que
X > Y
se puede generar R
1. minimo(X , Y , X) :- X =< Y , !.
2. minimo(X , Y , Y) :- X > Y , !.
RR
1. minimo(X , Y , X) :- X =< Y , !.
2. minimo(X , Y , Y).
R
La consulta
minimo(2 , 5 , 5)
es consecuencia lgica de R, lo cual no est de acuerdo con
el significado que se le pretende dar al programa.
SOLUCIONES REDUNDANTES
El significado de un programa PROLOG est dado por el
Conjunto de Objetivos Bsicos (Ground) que pueden ser
deducidos a partir de l.
En el contexto de la Programacin Lgica no importa que un
programa presente varios caminos para deducir un mismo
objetivo bsico.
Sin embargo, al considerar el proceso de bsqueda de la
solucin en Prolog, es importante mantener el rbol de bsqueda
lo ms pequeo posible, lo cual implica:
tratar de generar programas que minimicen el nmero de
soluciones redundantes.
CONSECUENCIAS DE LA ESTRATEGIA DE PROLOG
El orden de las clusulas en el programa y de los objetivos
(goals) en el cuerpo de las clusulas afectan a la
computacin.
1.padre(juan , pedro)
2.padre(juan , luisa).
3.padre(juan , jose).
4.hombre(pedro).
5.hombre(jose).
6.hijo(X , Y) :- hombre(X) , padre(Y , X).
1. padre(juan , pedro)
2. padre(juan , luisa).
3. padre(juan , jose).
4. hombre(pedro).
5. hombre(jose).
6. hijo(X , Y) :- padre(Y , X) , hombre(X).
1.padre(juan , pedro)
2.padre(juan , luisa).
3.padre(juan , jose).
4.hombre(jose).
5.hombre(pedro).
6.hijo(X , Y) :- hombre(X) , padre(Y , X).
Cambio del
orden de
objetivos
Cambio del
orden de
clusulas
1.padre(juan , pedro)
2.padre(juan , luisa).
3.padre(juan , jose).
4.hombre(pedro).
5.hombre(jose).
6.hijo(X , Y) :- hombre(X) , padre(Y , X).
hijo(Z , juan)
( hombre(X), padre(juan , X) )
padre(juan , pedro)
padre(juan , jose)
6
4 5
1.padre(juan , pedro)
2.padre(juan , luisa).
3.padre(juan , jose).
4.hombre(jose).
5.hombre(pedro).
6.hijo(X , Y) :- hombre(X) , padre(Y , X).
hijo(Z , juan)
( hombre(X), padre(juan , X) )
padre(juan , jose)
padre(juan , pedro)
6
4 5
1.padre(juan , pedro)
2.padre(juan , luisa).
3.padre(juan , jose).
4.hombre(pedro).
5.hombre(jose).
6.hijo(X , Y) :- padre(Y , X) , hombre(X).
hijo(Z , juan)
( padre(juan , X) , hombre(X) )
hombre(pedro)
hombre(luisa)
6
1
2
hombre(jose)
3
I
II
III
Los programas I y II generan el mismo rbol con diferente
recorrido, y entre ellos solo difieren en el orden de las clusula
hijo(Z , juan)
( hombre(X), padre(juan , X) )
padre(juan , pedro)
padre(juan , jose)
6
4 5
I
hijo(Z , juan)
( hombre(X), padre(juan , X) )
padre(juan , jose)
padre(juan , pedro)
6
4 5
II
hijo(Z , juan)
( hombre(X), padre(juan , X) )
padre(juan , pedro)
padre(juan , jose)
6
4 5
I
hijo(Z , juan)
( padre(juan , X) , hombre(X) )
hombre(pedro)
hombre(luisa)
6
1
2
hombre(jose)
3
III
Los programas I y III generan rbol diferentes, y entre ellos
difieren en el orden de los objetivos.
El orden de las clusulas determina el orden en que se
encuentran las soluciones.
solucin 1. hijo(pedro , juan)
solucin 2. hijo(jose , juan)
solucin 1. hijo(jose , juan)
solucin 2. hijo(pedro , juan)
hijo(Z , juan)
( hombre(X), padre(juan , X) )
padre(juan , pedro)
padre(juan , jose)
6
4 5
I
hijo(Z , juan)
( hombre(X), padre(juan , X) )
padre(juan , jose)
padre(juan , pedro)
6
4 5
II
Cuando hay ramas infinitas, el orden de las clusulas puede
causar que no se encuentren soluciones para objetivos que
tienen una computacin finita.
TERMINACIN
Prolog utiliza una estrategia de Bsqueda en Profundidad.
Si el rbol de bsqueda tiene alguna rama infinita, puede
ocurrir que la bsqueda no finalice para alguna consulta.
La no terminacin est asociada con las
Reglas y definiciones Recursivas
Si bien esta estructura es problemtica, no siempre es
posible eliminarla.
EJEMPLOS DE CASOS DE NO TERMINACIN
Definiciones circulares:
padre(X , Y) :- hijo(Y , X).
hijo(X , Y) :- padre(Y , X).
Representacin de conmutatividad por medio de reglas
recursivas:
matrimonio(X , Y) :- matrimonio(Y , X)
Existe una fuerte relacin entre No Terminacin y Reglas
Recursivas por Izquierda
(el primer objetivo a la der. es recursivo)
ancestro(X , Z) :- ancestro(X , K) , padre(K , Z).

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