Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Prolog y Sus Aplicaciones
Prolog y Sus Aplicaciones
Ao 2006
c
d
Una representacin para el mismo en Prolog podra consistir en una lista que contenga dos sublistas:
una representando el conjunto de nodos (o vrtices) y otra representando el conjunto de arcos, donde
cada arco es a su vez una lista de dos elementos, el nodo inicial y el final. Por ejemplo:
(A)
Otra representacin vlida consiste en una lista de listas, donde cada sublista contiene como elementos
un nodo y una lista de los nodos hacia los cuales ste est conectado, por ejemplo:
(B)
[[a b] [b c d] [c e] [d a e] [e a]]
Resolucin:
La transformacin entre la representacin (A) y otra tal como (B) no puede definirse con un nico
predicado que brinde ambos servicios, por lo cual ser necesario definir cada sentido de la consulta en
forma separada.
% Pasar de (A) ---> (B)
pasarAB([Nodos, Arcos], Resultado):pasarAB_sublista(Nodos, Arcos, Resultado).
pasarAB_sublista([],_,[]).
pasarAB_sublista([Nodo|Ns], Arcos, [[Nodo, Conectados]|Rs]):pasarAB_arcos(Nodo, Arcos, Conectados), pasarAB_sublista(Ns, Arcos, Rs).
? grafoX( X ), pasarXY( X, Y ).
donde X e Y sern A, B o C, segn el caso que se desee probar.
Ejemplos:
? grafoA( A ), pasarAB( A, B ).
A = [[a, b, c, d, e], [[a, b], [b, c], [b, d], [c, e], [d, a], [d, e], [e, a]]]
B = [[a, [b]], [b, [c, d]], [c, [e]], [d, [a, e]], [e, [a]]] ;
No
? grafoB( B ), pasarBC( B, C ).
B = [[a, [b]], [b, [c, d]], [c, [e]], [d, [a, e]], [e, [a]]]
C = [[a, b], [b, c, d], [c, e], [d, a, e], [e, a]] ;
No
? grafoC( C ), pasarCA( C, A ).
C = [[a, b], [b, c, d], [c, e], [d, a, e], [e, a]]
A = [[a, b, c, d, e], [[a, b], [b, c], [b, d], [c, e], [d, a], [d, e], [e, a]]] ;
No
Ejercicio N 2
Realizar un predicado invertir que dada una lista de listas de longitud 2 o mayor, evale True si el
segundo argumento es otra lista cuyos elementos estn invertidos.
invertir([[a, 1], [a, 2], [b, 1], [b, 2]], [[2, b], [1, b], [2, a], [1, a]])
True
Las listas que deben ser tratadas no se deben limitar a una profundidad de dos niveles de parntesis. Se
deben considerar listas de cualquier nivel de anidamiento.
Resolucin:
concatenar([], L, L).
concatenar([X|Xs], Y, [X|Zs]):- concatenar(Xs, Y, Zs).
invertir([], []).
invertir([X|Y], A):atomic(X), invertir(Y, B), concatenar(B, [X], A).
invertir([X|Y], A):not(atomic(X)), invertir(X, X1), invertir(Y, B), concatenar(B, [X1], A).
Ejemplos de consultas:
? invertir([[a, 1], [a, 2], [b, 1], [b, 2]], [[2, b], [1, b], [2, a], [1, a]]).
Yes
? invertir([[r,o,m,a], [n,e,u,q,u,e,n], [h,o,n,o,l,u,l,u]], X).
X = [[u, l, u, l, o, n, o, h], [n, e, u, q, u, e, n], [a, m, o, r]] ;
No
? invertir([[a, [b, [c], d, [e, f, [g, h], i, j], [k]], l, m]], X).
X = [[m, l, [[k], [j, i, [h, g], f, e], d, [c], b], a]] ;
No
Ejercicio N 3
Se desea desarrollar un programa Prolog que permita intercalar los elementos de dos listas
considerando longitudes distintas para cada tramo de intercalacin. Es decir, para cada lista se indicar
la cantidad de elementos de la misma que se intercalarn sucesivamente para formar la lista resultante,
por ejemplo:
intercala([a1, a2, a3, a4, a5, a6], [b1, b2, b3, b4], 3, 2, [a1, a2, a3, b1, b2, a4, a5, a6, b3, b4]).
True
intercala([a1, a2, a3, a4], [b1, b2], 4, 1, X).
X = [b1, a1, a2, a3, a4, b2]
Debe tenerse en cuenta que cada lista incluya la cantidad de elementos necesaria para ser intercalada
correctamente y que cualquiera de ellas puede intercalar el tramo inicial o el tramo final.
Resolucin:
intercala(L1, L2, N1, N2, R):- intercalar_lista(L1, L2, N1, N2, R).
intercala(L1, L2, N1, N2, R):- intercalar_lista(L2, L1, N2, N1, R).
intercalar_lista([], [], _N1, _N2, []).
intercalar_lista(L1, L2, N1, N2, Result):concatenar(PreL1, RestoL1, L1),
largo(PreL1, N1),
intercalar_lista(L2, RestoL1, N2, N1, X),
concatenar(PreL1, X, Result).
% las listas deben tener al menos 1 elemento:
largo([_X], 1).
largo([_X|Xs], N):- largo(Xs, N2), N is N2 + 1.
Ejemplos de consultas:
? intercala([a1, a2, a3, a4, a5, a6], [b1, b2, b3, b4], 3, 2, [a1, a2, a3, b1, b2, a4, a5, a6, b3, b4]).
Yes
? intercala([a1, a2, a3, a4, a5, a6], [b1, b2, b3, b4], 2, N, X).
N = 2, X = [a1, a2, b1, b2, a3, a4, b3, b4, a5, a6] ;
N = 1, X = [b1, a1, a2, b2, a3, a4, b3, a5, a6, b4] ;
No
? intercala([a1, a2, a3, a4], [b1, b2], N, 1, X).
N = 2, X = [a1, a2, b1, a3, a4, b2] ;
N = 2, X = [b1, a1, a2, b2, a3, a4] ;
N = 4, X = [b1, a1, a2, a3, a4, b2] ;
No
Ejercicio N 4
Un rbol n-ario es un rbol donde cada nodo puede tener cero o ms descendientes. Dado un rbol de
este tipo, cuyas aristas tendrn un costo asociado, se pretende desarrollar un predicado en Prolog que
permita obtener un camino valido desde la raz hasta un nodo hoja y el costo total asociado al mismo.
Por ejemplo:
a
3
2
c
b
3
e
d
5
f
En este rbol el camino desde el nodo raz a hasta el nodo f tiene costo 2+5=7.
Para representar el rbol se utilizar la funcin:
arbol(r, ListaHijos, ListaCostos)
en donde ListaHijos = [h1, h2, ..., hn]
y ListaCostos = [c1, c2, ..., cn], siendo ci el costo asociado a la arista que une r con hi.
Se le solicita que defina el predicado camino(Arbol, Camino, Costo)
Segn el ejemplo anterior debe verificarse la siguiente consulta:
?- camino(arbol(a, [ arbol(b, [], []),
arbol(c, [arbol(e, [], []), arbol(f, [], [])], [3, 5]),
arbol(d, [], []) ],
[ 3, 2, 4 ]), L, C).
L = [a, b], C = 3 ;
L = [a, c, e], C = 3 ;
L = [a, c, f], C = 7 ;
L = [a, d], C = 4 ;
no.
Donde la expresin remarcada representa el rbol dado.
Nota: observe que un nodo hoja tendr la forma: arbol(N, [], [])
Resolucin:
camino(arbol(Raiz, [], []), [Raiz], 0).
camino(arbol(Raiz, Hijos, Costos), [Raiz|L], CostoTotal):hijo(Hijos, Costos, Hijo, CostoHijo),
camino(Hijo, L, CostoL),
CostoTotal is CostoHijo + CostoL.
hijo([Hijo|_], [Costo|_], Hijo, Costo).
hijo([_|Hs], [_|Cs], Hijo, Costo):- hijo(Hs, Cs, Hijo, Costo).
Ejercicio N 5
Dos grafos son isomorfos si tienen la misma cantidad de nodos y tipos de relaciones,
independientemente de los valores de nodos.
Por ejemplo:
b
f
e
3
2
Los dos grafos anteriores son isomorfos, ya que tienen la misma cantidad de nodos y los mismos tipos
de relaciones entre nodos, independientemente de los valores de nodos. La tabla siguiente muestra lo
dicho:
Nodos grafo 1
A
B
C
D
E
F
Relaciones grafo 1
(a, b) (a, e)
(b, a)
(c, f)
(d, e) (d ,f)
(e, a) (e, d)
(f, d) (f, c)
Nodos grafo 2
1
2
3
4
5
6
Relaciones grafo 2
(1,2) (1, 5)
(2,1)
(3, 6)
(4, 5) (4, 6)
(5, 1) (5, 4)
(6, 4) (6, 3)
Ejemplos de consultas:
? nodosIsomorfos([[a,b,c], [[a,b],[b,c]]], [[1,2,3],[[2,3],[3,1]]], P).
P = [[a, 2], [b, 3], [c, 1]] ;
No
? nodosIsomorfos([[a,b,c,d], [[a,b],[b,c],[b,d]]], [[1,2,3,4],[[2,3],[3,1],[3,4]]], P).
P = [[a, 2], [b, 3], [c, 1], [d, 4]] ;
P = [[a, 2], [b, 3], [c, 4], [d, 1]] ;
No
? nodosIsomorfos([[a,b,c,d,e,f],[[b,a],[a,e],[e,d],[d,f],[f,c]]],
[[1,2,3,4,5,6],[[6,5],[5,4],[4,3],[3,1],[1,2]]], ListaPares).
ListaPares = [[a, 5], [b, 6], [c, 2], [d, 3], [e, 4], [f, 1]] ;
No