Práctica de Prolog: Funciones Varias (Paradigmas)

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

%repeat(-Elemento, -Lista).
% Requiere: true.
% Asegura: Lista es una lista que contiene solamente a Elem (cero o mas veces).
repeat(_, []).
repeat(Elem, [Elem | Tail]) :- repeat(Elem, Tail).

%multi_length(-Lista_de_Listas, -Lista_de_Longuitudes).
% Requiere: Lista_de_Listas es una lista de listas, y Lista_de_Longuitudes es una lista de naturales.
% Asegura: Lista_de_Longuitudes es una lista que contiene las longuitudes de los elementos de Lista_de_Listas.
multi_length([], []).
multi_length([X | XS], [L | LS]) :- length(X, L), multi_length(XS, LS).

%multi_append(-Lista_de_Listas, -Listas_Unidas).
% Requiere: Lista_de_Listas no contiene ninguna lista vacia, pero ella si puede ser la lista vacia.
% Asegura: Listas_Unidas son todas las listas de la listas unidas,
% en el orden en que aparecian en la lista de listas.
multi_append([], []).
multi_append([[X] | YS], [X | ZS]) :- multi_append(YS, ZS).
multi_append([[X1, X2 | XS] | YS], [X1 | ZS]) :- multi_append([[X2 | XS] | YS], ZS).

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

%particion_doble_sin_vacio(-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_sin_vacio([X], [Y | YS], [X, Y | YS]).
particion_doble_sin_vacio([X1, X2 | XS], [Y | YS], [X1 | ZS]) :- particion_doble_sin_vacio([X2 | XS], [Y | YS], ZS).
particion_doble_sin_vacio([X1, X2 | XS], [Y | YS], [X1 | ZS]) :- particion_doble_sin_vacio([Y | YS], [X2 | XS], ZS).


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


%particion_de_longuitud_n(+Lista, +Longuitud, -ListaDeSublistas)
% Requiere: Lista es una Lista de longuitud multiplo de Longuitud, ListaDeSublistas una lista de listas.
% Asegura: ListaDeSublistas es una lista de sublistas disjuntas que forman Lista cada una de longuitud Longuitud.
particion_de_longuitud_n(Lista, Longuitud, ListaDeSublistas) :- particion(ListaDeSublistas, Lista),
length(Lista, Length_Lista), Cantidad is Length_Lista // Longuitud,
repeat(Longuitud, Lista_Longs), length(Lista_Longs, Cantidad),
multi_length(ListaDeSublistas, Lista_Longs).

%lista_de_grupos(+Lista_de_Paises_en_Grupos, +Ids, -Grupos).
lista_de_grupos([], [], []).
lista_de_grupos([P | PS], [I | IS], [grupo(I, P) | GS]) :- lista_de_grupos(PS, IS, GS).
% Requiere: length(Lista_de_Paises_en_Grupos) == length(Ids).
% Asegura: Grupos es la formacion de grupos asignando un id a cada grupo de paises de la lista.

%mesclar_particiones_de_listas(-Particiones, +Listas_de_Listas).
grupos(Ps, Ids, Grupos) :- lista_de_grupos(Lista_de_Paises_en_Grupos, Ids, Grupos).

%grupos(+Ps, +Ids, -Grupos)
grupos(Ps, Ids, Grupos) :- lista_de_grupos(Lista_de_Paises_en_Grupos, Ids, Grupos).

paises([[argentina, brasil], [mejico,canada],
[sudafrica, egipto]]).
listas([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]).
listas2([1, 2, 3]).