Práctica de Prolog: Varios (Paradigmas)

De Cuba-Wiki
Saltar a: navegación, buscar
Back.png Volver a la página de la materia

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Funciones de Listas - Comienzo  %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% map_tomar_uno_de_lista(-Reordenado, -Resto, +ListaDeListas)
% Requiere: true.
% Asegura: Reordenado es una lista formada agarrando un elemento de cada sublista
% de ListaDeListas y Resto es lo que queda despues de sacar eso.
% Uso:
map_tomar_uno_de_lista([], [], []).
map_tomar_uno_de_lista([H | T], [R | RS], [L | LS]) :- particion_doble_unicas_vacia([H], R, L),
map_tomar_uno_de_lista(T, RS, LS).

% particion(-ListaDeSublistas, +Lista).
% Requiere: true.
% Asegura: ListaDeSublistas es una lista de sublistas disjuntas que forman Lista.
% particion( XS, [X | XS]).
% particion([[X | XS], Y | YS], ZS) :- particion_doble_unicas([X | XS], WS, ZS), particion(Y | YS, WS).

% particion_doble_unicas(-Parte1, -Parte2, -Lista).
% Requiere: true.
% Asegura: Parte1 y Parte2 son una particion de Lista en dos listas (ninguna vacia),
% preservando en ellas el orden relativo original de los elementos.
particion_doble_unicas([X], [Y | YS], [X, Y | YS]).
particion_doble_unicas([X1, X2 | XS], [Y | YS], [X1 | ZS]) :- particion_doble_unicas([X2 | XS], [Y | YS], ZS).
particion_doble_unicas([X1, X2 | XS], [Y | YS], [X1 | ZS]) :- particion_doble_unicas([Y | YS], [X2 | XS], ZS).

% particiones_de_longuitud_n(-ListaDeSublistas, +Longuitud, +Lista)
% Requiere: true.
% Asegura: ListaDeSublistas es una lista de sublistas disjuntas que forman Lista cada una de longuitud Longuitud.
particiones_de_longuitud_n([XS], L, XS) :- length(XS, L).
particiones_de_longuitud_n([X | XS], L, ZS) :- not(length(ZS, L)), particion_doble_unicas(X, YS, ZS), length(X, L),
particiones_de_longuitud_n(XS, L, YS).

% map_particiones_de_longuitud_n(-Sublistas, +CantidadDeGrupos, +Listas)
% Requiere: true.
% Asegura: similar a Haskell: map particiones_de_longuitud_n.
map_particiones_de_longuitud_n([], N, []) :- N > 0.
map_particiones_de_longuitud_n([X | XS], N, [Y | YS]) :- map_particiones_de_longuitud_n(XS, N, YS),
particiones_de_longuitud_n(X, N, Y).

% iesimos_elementos(-Iesimos, +Indice, -ListaDeListas)
% Requiere: true.
% Asegura: Iesimos son los iesimos elementos de cada lista de ListaDeListas.
iesimos_elementos([], N, []) :- N >= 0.
iesimos_elementos([E | XS], I, [Y | YS]) :- nth0(I, Y, E), iesimos_elementos(XS, I, YS).


% generar_listas_tomando_de_listas_entre_iesimos(-Reordenado, +Desde, +Hasta, +ListaDeListas)
generar_listas_tomando_de_listas_entre_iesimos([], D, H, L) :- D > H, is_list(L).
generar_listas_tomando_de_listas_entre_iesimos([X | XS], D, H, YS) :- D =< H, D1 is D + 1, iesimos_elementos(X, D, YS),
generar_listas_tomando_de_listas_entre_iesimos(XS, D1, H, YS).

% last(+N, -Tail, -Lista).
% Requiere: true.
% Asegura: Tail son los ultimos n elementos de Lista.
last(N, Tail, Lista) :- length(Tail, N), append(_, Tail, Lista).

% sin_iesimo(-ListaSinIesimo, -Indice, -Lista)
% Requiere: true
% Asegura: ListaSinIesimo es la lista sin el elemento en la posicion Indice de Lista.
sin_iesimo(NL, I, L) :- append(Init, [_ | Tail], L), length(Init, I), append(Init, Tail, NL).

% sin_primera_aparicion(-ListaSinElemento, -Elemento, -Lista)
% Requiere: true.
% Asegura: ListaSinElemento es igual a Lista sin la primera aparicion del elemento.
sin_primera_aparicion(ZS, E, L) :- append(ZS1, [E | ZS2], L), append(ZS1, ZS2, ZS), not(member(E, ZS1)).

% concat(-Lista_de_Listas, -Listas_Unidas).
% Requiere: true.
% Asegura: Listas_Unidas son todas las listas de la listas unidas,
% en el orden en que aparecian en la lista de listas.
concat([], []).
concat([[X] | YS], [X | ZS]) :- concat(YS, ZS).
concat([[X1, X2 | XS] | YS], [X1 | ZS]) :- concat([[X2 | XS] | YS], ZS).

% map_concat(-ListaDeListasDeListas, +ListasMappeadas)
% Requiere: true.
% Asegura: similar a Haskell: map concat
map_concat([], []).
map_concat([X | XS], [Y | YS]) :- concat(X, Y), map_concat(XS, YS).

% take(+N, -Tail, -Lista).
% Requiere: true.
% Asegura: Tail son los elementos que quedan luego de sacar los n primeros
% elementos a Lista.
drop(N, Tail, Lista) :- length(Init, N), append(Init, Tail, Lista).

% pertenece(-Elemento, -Lista)
% Requiere: true
% Asegura: Elemento pertenece a Lista.
pertenece(E, L) :- append(_, [E | _], L).

% sin_un_elemento(-ListaSinElemento, -Elemento, -Lista)
% Requiere: true.
% Asegura: ListaSinElemento es igual a Lista sin una vez ese elemento.
sin_un_elemento(ZS, E, L) :- append(ZS1, [E | ZS2], L), append(ZS1, ZS2, ZS).

% sin_elemento(-ListaSinElementos, +Elemento, +Lista)
% Requiere: true.
% Asegura: ListaSinElementos es igual a Lista sin todas las apariciones del elemento.
sin_elemento([], _, []).
sin_elemento(L, H, [H | T]) :- sin_elemento(L, H, T).
sin_elemento([H | L], E, [H | T]) :- E \= H, sin_elemento(L, E, T).

% iesimo(-Elemento, -Indice, -Lista)
% Requiere: true
% Asegura: Elemento es el elemento en la posicion Indice de Lista.
iesimo(E, I, L) :- append(Init, [E | _], L), length(Init, I).

% interseccion(-Interseccion, +ListaL, +ListaR)
% Requiere: true.
% Asegura: Interseccion es la interseccion sin duplicados de ListaL y ListaR
% manteniendo el orden de los elementos en ListaL.
interseccion([], [], []).
interseccion([E | ZS], [E | LL], LRE) :- member(E, LRE), delete(LRE, E, LR),
interseccion(ZS, LL, LR).
interseccion(ZS, [E | LL], LR) :- not(member(E, LR)), interseccion(ZS, LL, LR).

% sin_repetidos(-ListaSinRepetidos, +Lista).
% Requiere: true.
% Asegura: ListaSinRepetidos es igual a Lista solo que no tiene repetidos.
sin_repetidos([], []).
sin_repetidos([E | XS], [E | YS]) :- not(member(E, YS)), sin_repetidos(XS, YS).
sin_repetidos(XS, [E | YS]) :- member(E, YS), sin_repetidos(XS, YS).
sin_repetidos([E | XS], [E | YS]) :- member(E, YS), sin_repetidos(XSE, YS),
select(E, XSE, XS).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Funciones de Listas - Fin  %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%