Está en la página 1de 3

1

PONTIFICIA
UNIVERSIDAD CATOLICA DE VALPARAISO Escuela de Ingeniera Informtica
Desarrollado por
Ricardo Soto De Giorgis
Escuela de Ingeniera
Informtica
INF 152 Programacin en Lgica
Captulo 4 PROLOG
4.12 Recursividad
Para definir reglas ms generales y flexibles, es necesario un mecanismo
adicional. Para ello se utilizar el concepto de recursividad.
Para definir el concepto antecesor_de puede definirse de una forma iterativa:
antecesor_de(X,Y):-padre_de(X,Y). %padre
antecesor_de(X,Y):-padre_de (X,Z), padre_de (Z,Y). %abuelo
antecesor_de(X,Y):-padre_de (X,Z1). %bisabuelo
:-padre_de (Z1,Z2).
:-padre_de (Z2,Y).
antecesor_de(X,Y):-padre_de (X,Z1). %tatarabuelo
:-padre_de (Z1,Z2).
:-padre_de (Z2,Z3).
:-padre_de (Z3,Y).

PONTIFICIA
UNIVERSIDAD CATOLICA DE VALPARAISO Escuela de Ingeniera Informtica
Desarrollado por
Ricardo Soto De Giorgis
Escuela de Ingeniera
Informtica
INF 152 Programacin en Lgica
Captulo 4 PROLOG
4.12 Recursividad
Este mecanismo no es eficiente, dado que no nos permite generalizar fcilmente
el concepto de antecesor. Prolog permite utilizar definiciones recursivas, que
resuelven el problema de forma elegante.
En vez de:
antecesor_de(X,Y):-padre_de(X,Y). %padre
antecesor_de(X,Y):-padre_de (X,Z), padre_de (Z,Y). %abuelo
antecesor_de(X,Y):-padre_de (X,Z1). %bisabuelo
:-padre_de (Z1,Z2).
:-padre_de (Z2,Y).
antecesor_de(X,Y):-padre_de (X,Z1). %tatarabuelo
:-padre_de (Z1,Z2).
:-padre_de (Z2,Z3).
:-padre_de (Z3,Y).

antecesor_de(X,Y):-padre_de(X,Y).
antecesor_de(X,Y):-padre_de (X,Z), antecesor (Z,Y).
PONTIFICIA
UNIVERSIDAD CATOLICA DE VALPARAISO Escuela de Ingeniera Informtica
Desarrollado por
Ricardo Soto De Giorgis
Escuela de Ingeniera
Informtica
INF 152 Programacin en Lgica
Captulo 4 PROLOG
4.12.1 Problemas con el uso de la recursividad
Uno de los peligros que conlleva la recursividad, es la de realizar definiciones
circulares o que el intrprete de Prolog no sea capaz de resolver.
Esta clusula es declarativamente correcta, pero el intrprete de Prolog no podr
resolverla nunca y se quedar atrapado en un bucle infinito.
por ejemplo si se define la siguiente base de hechos sobre las amistades de una
persona:
PONTIFICIA
UNIVERSIDAD CATOLICA DE VALPARAISO Escuela de Ingeniera Informtica
Desarrollado por
Ricardo Soto De Giorgis
Escuela de Ingeniera
Informtica
INF 152 Programacin en Lgica
Captulo 4 PROLOG
4.12.1 Problemas con el uso de la recursividad
Si consideramos que el concepto amistad tiene una relacin conmutativa,
entonces posiblemente nos interesara definir la relacin de amistad inversa o
complementaria:
Esta definicin aparentemente lgica provoca un error. La forma correcta de
definirlo sera a travs de un nuevo predicado:
PONTIFICIA
UNIVERSIDAD CATOLICA DE VALPARAISO Escuela de Ingeniera Informtica
Desarrollado por
Ricardo Soto De Giorgis
Escuela de Ingeniera
Informtica
INF 152 Programacin en Lgica
Captulo 4 PROLOG
4.12.2 Directivas para el uso de la recursividad
El siguiente conjunto de directivas pueden utilizarse para lograr que la ejecucin
de nuestro programa Prolog sea lo ms eficiente posible.
Primero los objetivos ms sencillos
1 las ms especficas.
2 las ms generales (con recursividad).
Ordenacin de Clusulas
1 los trminos ms especficos.
2 los trminos ms generales (recursivos).
Ordenacin de Trminos
antecesor_de(X,Y):-padre_de(X,Y).
antecesor_de(X,Y):-padre_de (X,Z), antecesor (Z,Y).
antecesor_de(X,Y):-padre_de (X,Z), antecesor (Z,Y).
PONTIFICIA
UNIVERSIDAD CATOLICA DE VALPARAISO Escuela de Ingeniera Informtica
Desarrollado por
Ricardo Soto De Giorgis
Escuela de Ingeniera
Informtica
INF 152 Programacin en Lgica
Captulo 4 PROLOG
4.13 Mecanismo de resolucin
Prolog utiliza un mecanismo conocido como Resolucin lineal con unificacin
para resolver las preguntas que se le plantean.
1 Se extrae la primera meta eliminndola de la lista.
2 Mientras sea posible:
3 Buscar un hecho o una regla que satisfaga la meta.
4 Si se encuentra:
5 Si ListaMetas no est vaca llamar al procedimiento de bsqueda de forma
recursiva con ListaMetas y las variables equiparadas.
6 Si ListaMetas est vaca provocar un retorno con las metas satisfechas y las
variables equiparadas.
7 Si hay solucin de las metas al volver de la llamada en 5, provocar un retorno
con las soluciones.
8 En caso contrario, seguir en bucle, paso 3.
9 Si no se ha encontrado solucin alguna, provocar un retroceso, e.d. un retorno
sin solucin.
El mecanismo consiste en realizar una bsqueda en profundidad y retroceso
(backtracking) tratando de unificar la clusula objetivo con las contenidas en la
base de hechos, hasta lograr alcanzar la clusula vaca.
2
PONTIFICIA
UNIVERSIDAD CATOLICA DE VALPARAISO Escuela de Ingeniera Informtica
Desarrollado por
Ricardo Soto De Giorgis
Escuela de Ingeniera
Informtica
INF 152 Programacin en Lgica
Captulo 4 PROLOG
4.13 Mecanismo de resolucin
peligroso(zorro).
peligroso(oso).
grande(oso).
astuto(zorro).
?-peligroso(X), grande(X).
ListaMetas = { peligroso(X), grande(X) }
Resultado = Proc_Busqueda (ListaMetas, X)
Pmeta = primera (ListaMetas) = peligroso(X)
ListaMetas = resto (ListaMetas) = { grande(X) }
Mientras sea posible
Primer hecho: peligroso(zorro) satisface PMeta?,si;
Resultado = Proc_Busqueda (ListaMetas, x = zorro)
PMeta = primera (ListaMetas) = grande(X), X = zorro.
ListaMetas = resto (ListaMetas) = { }
Mientras sea posible
Primer hecho: grande(oso) satisface PMeta?, no;
Retroceso sin solucin para grande(X).
Resultado = Proc_Busqueda (ListaMetas) = False.
Siguiente hecho: peligroso(oso) satisface PMeta?, si;
Resultado = Proc_Busqueda (ListaMetas, X = oso)
PMeta = primera (ListaMetas) = grande(X), X = oso.
ListaMetas = resto (ListaMetas) = { }
Mientras sea posible
Primer hecho: grande(oso) satisface PMeta?, si;
ListaMetas vacia
Provocar retorno con Solucin { X = oso }
Provocar retorno con Solucin { X = oso }
Imprimir Solucin X = oso.
PONTIFICIA
UNIVERSIDAD CATOLICA DE VALPARAISO Escuela de Ingeniera Informtica
Desarrollado por
Ricardo Soto De Giorgis
Escuela de Ingeniera
Informtica
INF 152 Programacin en Lgica
Captulo 4 PROLOG
4.14 Listas
Una lista es una secuencia ordenada de elementos que pueden tener cualquier
longitud. Los elementos de una lista pueden ser cualquier tipo de trminos
(constantes, variables o estructuras), o incluso otra lista.
Una lista est formada por dos elementos: la cabeza (primer elemento de la
lista) y la cola (resto de elementos de la lista).
[a, b, c] Lista con los tres elementos a, b y c
[ ] Lista vaca.
[a | L] Lista con el elemento a en la cabecera y el resto en la variable L (cola).
[a, b | L] Lista con los elementos a y b en la cabecera y el resto en la variable L
(cola).
[X | L] Lista con el primer elemento instanciado en la variable X y el resto en la
variable L (cola).
[X, Y | L] Lista con el primer elemento instanciado en la variable X, el segundo en
Y y el resto en la variable L (cola).
[X|_] Lista con el primer elemento instanciado en la variable X
[_|L] Lista con el resto en la variable L.
PONTIFICIA
UNIVERSIDAD CATOLICA DE VALPARAISO Escuela de Ingeniera Informtica
Desarrollado por
Ricardo Soto De Giorgis
Escuela de Ingeniera
Informtica
INF 152 Programacin en Lgica
Captulo 4 PROLOG
4.14.1 Manejo de listas
longitud([ ], 0).
longitud([X | Xs], N) :- longitud(Xs, N1), N is N1+1.
pertenece(X, [X|_]).
pertenece(X, [_|L]) :- pertenece(X, L).
Algunos predicados tiles para el manejo de listas:
concatena([ ],L,L).
concatena(L,[ ],L).
concatena([X|L1],L2,[X|L3]):-concatena(L1,L2,L3).
ultimo([X],X).
ultimo([_|T],X):-ultimo(T,X).
PONTIFICIA
UNIVERSIDAD CATOLICA DE VALPARAISO Escuela de Ingeniera Informtica
Desarrollado por
Ricardo Soto De Giorgis
Escuela de Ingeniera
Informtica
INF 152 Programacin en Lgica
Captulo 4 PROLOG
vecinos(X,Y,[X,Y|_]).
vecinos(X,Y,[_|Z]):-vecinos(X,Y,Z)
elimina(X,[X|C],C).
elimina(X,[Y|C1],[Y|C2]) :- elimina(X,C1,C2).
ordenada([ ]).
ordenada([X]).
ordenada([X,Y|T]):-X<Y,ordenada([Y|T]).
4.14.1 Manejo de listas
agregar(X,[],[X]).
agregar(X,[X|T],[X|T]).
agregar(X,[H|T],[X,H|T]):-X<H.
agregar(X,[H|T],[H|L]):-agregar(X,T,L).
PONTIFICIA
UNIVERSIDAD CATOLICA DE VALPARAISO Escuela de Ingeniera Informtica
Desarrollado por
Ricardo Soto De Giorgis
Escuela de Ingeniera
Informtica
INF 152 Programacin en Lgica
Captulo 4 PROLOG
4.14.2 Ordenamiento de listas
ordenains([ ],[ ]).
ordenains([X|Y],Z):-ordenains(Y,W),agregar(X,W,Z).
Insercin
Quicksort
particion(X,[Y|Ys],[Y|Ps],Gs):-Y<X,particion(X,Ys,Ps,Gs).
particion(X,[Y|Ys],Ps,[Y|Gs]):-Y>=X,particion(X,Ys,Ps,Gs).
particion(X,[ ],[ ],[ ]).
quicksort([ ],[ ]).
quicksort([X|Xs],Ys):-particion(X,Xs,Ps,Gs),quicksort(Ps,PsO),quicksort(Gs,GsO),
concatena(PsO,[X|GsO],Ys).
PONTIFICIA
UNIVERSIDAD CATOLICA DE VALPARAISO Escuela de Ingeniera Informtica
Desarrollado por
Ricardo Soto De Giorgis
Escuela de Ingeniera
Informtica
INF 152 Programacin en Lgica
Captulo 4 PROLOG
4.14.2 Ordenamiento de listas
Mezcla (mezcla dos listas ordenadas)
mezcla(Xs,[ ],Xs).
mezcla([ ],[Y|Ys],[Y|Ys]).
mezcla([X|Xs],[Y|Ys],[X|Zs]):-X<Y,mezcla(Xs,[Y|Ys],Zs).
mezcla([X|Xs],[Y|Ys],[Y|Zs]):-X>=Y,mezcla([X|Xs],Ys,Zs).
3
PONTIFICIA
UNIVERSIDAD CATOLICA DE VALPARAISO Escuela de Ingeniera Informtica
Desarrollado por
Ricardo Soto De Giorgis
Escuela de Ingeniera
Informtica
INF 152 Programacin en Lgica
Captulo 4 PROLOG
4.15 Predicados sobre estructuras
Functor(estructura, functor, nmero de argumentos)
3 ?- functor(a*b,F,N).
F = *
N = 2
4 ?- functor(a-b,F,N).
F = -
N = 2
PONTIFICIA
UNIVERSIDAD CATOLICA DE VALPARAISO Escuela de Ingeniera Informtica
Desarrollado por
Ricardo Soto De Giorgis
Escuela de Ingeniera
Informtica
INF 152 Programacin en Lgica
Captulo 4 PROLOG
4.15 Predicados sobre estructuras
Arg(N,estructura,A)
1 ?- arg(2,a(a,s,r,ed),A).
A = s
2 ?- arg(4,a(a,s,r,ed),A).
A = ed
Permite retornar uno de los parmetros presentes en una estructura.
PONTIFICIA
UNIVERSIDAD CATOLICA DE VALPARAISO Escuela de Ingeniera Informtica
Desarrollado por
Ricardo Soto De Giorgis
Escuela de Ingeniera
Informtica
INF 152 Programacin en Lgica
Captulo 4 PROLOG
4.15 Predicados sobre estructuras
Univ
1 ?- 123=..L.
L = [123]
2 ?- a(d,f,d)=..L.
L = [a, d, f, d]
Permite transformar un estructura en una lista

También podría gustarte