Ejercicios PROLOG
Ejercicios PROLOG
Ejercicios PROLOG
Año 2006
a d
e
Una representación para el mismo en Prolog podría consistir en una lista que contenga dos sublistas:
una representando el conjunto de nodos (o vértices) 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:
Otra representación válida 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:
Una tercera representación, basada en la idea de (B), considera que cada sublista contiene el nodo en
primer lugar seguido de la lista de nodos con los cuales está conectado (sin colocar estos dentro de otra
lista), por ejemplo:
Resolución:
La transformación entre la representación (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.
pasarAB_sublista([],_,[]).
pasarAB_sublista([Nodo|Ns], Arcos, [[Nodo, Conectados]|Rs]):-
pasarAB_arcos(Nodo, Arcos, Conectados), pasarAB_sublista(Ns, Arcos, Rs).
concatenar([], L, L).
concatenar([X|Xs], Y, [X|Zs]):- concatenar(Xs, Y, Zs).
grafoA( [[a,b,c,d,e],[[a,b],[b,c],[b,d],[c,e],[d,a],[d,e],[e,a]]] ).
grafoB( [[a,[b]],[b,[c,d]],[c,[e]],[d,[a,e]],[e,[a]]] ).
grafoC( [[a,b],[b,c,d],[c,e],[d,a,e],[e,a]] ).
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, evalúe True si el
segundo argumento es otra lista cuyos elementos están 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 paréntesis. Se
deben considerar listas de cualquier nivel de anidamiento.
Resolución:
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([[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 intercalación. Es decir, para cada lista se indicará
la cantidad de elementos de la misma que se intercalarán 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.
Resolución:
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).
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
Ejercicio N° 4
Un árbol n-ario es un árbol donde cada nodo puede tener cero o más descendientes. Dado un árbol de
este tipo, cuyas aristas tendrán un costo asociado, se pretende desarrollar un predicado en Prolog que
permita obtener un camino valido desde la raíz hasta un nodo hoja y el costo total asociado al mismo.
Por ejemplo:
a
3 4
2
b c d
3 5
e f
En este árbol el camino desde el nodo raíz ‘a’ hasta el nodo ‘f’ tiene costo 2+5=7.
Para representar el árbol se utilizará la función:
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.
L = [a, b], C = 3 ;
L = [a, c, e], C = 3 ;
L = [a, c, f], C = 7 ;
L = [a, d], C = 4 ;
no.
Resolución:
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 d 5 6
a 4
f 3
e 2
c 1
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:
La representación para los grafos deberá ser por medio de una lista de la forma:
Resolución:
permutacion([], []).
permutacion(Xs,[Z|Zs]):- desarma(Z, Xs, Ys), permutacion(Ys, Zs).
desarma(X, [X|Xs], Xs).
desarma(X, [Y|Ys], [Y|Zs]):- desarma(X, Ys, Zs).
conjuntosIguales([], []).
conjuntosIguales([X|Xs], Y):-
desarma(X, Y, R),
conjuntosIguales(Xs, R).
miembro(X, [X|_]).
miembro(X, [_|Y]):- miembro(X, Y).
longitud([], 0).
longitud([_|Y], N):- longitud(Y, N2), N is N2 + 1.
Ejemplos de consultas:
?– 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