%i. ordenada(+L), que sera cierta si los elementos de L estan ordenados en forma a
scendente.
ordenada([]).
ordenada([_]).
ordenada([X, Y | XS]) :- X =< Y, ordenada([Y | XS]).
%ii. quicksort(+L, -L1), donde L1 es el resultado de ordenar L por el metodo de q
uicksort, que
%consiste en dividir a L en 2 sublistas con los menores y mayores al primer elem
ento, ordenar cada
%una de ellas y luego proceder a concatenarlas.
quicksort_partir([], _, [], []).
quicksort_partir([H | T], E, [H | Menores], Mayores) :- (H =< E), quicksort_part
ir(T, E, Menores, Mayores).
quicksort_partir([H | T], E, Menores, [H | Mayores]) :- H > E, quicksort_partir(
T, E, Menores, Mayores).
quicksort([], []).
quicksort([H | T], S) :- quicksort_partir(T, H, Menores, Mayores), quicksort(Men
ores, MenOrd),
quicksort(Mayores, MayOrd), append(MenOrd, [H | MayOrd], S).
%iii. inssort(+L, -L1), donde L1 es el resultado de ordenar L por el metodo de in
sercion, que
%consiste en insertar cada elemento en el lugar adecuado del resto de la lista y
a ordenada.
insertar_ordenado([], E, [E]).
insertar_ordenado([H | T], E, [E, H | T]) :- E =< H.
insertar_ordenado([H | T], E, [H | S]) :- E > H, insertar_ordenado(T, E, S).
inssort([], []).
inssort([H | T], S) :- inssort(T, SortT), insertar_ordenado(SortT, H, S).
% Ejercicio 9
% Definir un predicado rotar(+L, +N, -R), tal que R sea la lista L rotada N posi
ciones (la rotacion se
% debe hacer hacia la derecha si N>0 y hacia la izquierda si N<0).
% Ejemplos:
% rotar([1, a, 2, b, 3], 3, X) debe dar como respuesta X = [2, b, 3, 1, a]
% rotar([1, a, 2, b, 3], -3, X) debe dar como respuesta X = [b, 3, 1, a, 2]
modulus(N, Modulus, Result) :- Result is ((N mod Modulus) + Modulus) mod Modulus
.
rotar(L, N, R) :- length(L, Length), modulus(N, Length, Rotate), append(Init, Ta
il, L),
length(Tail, Rotate), append(Tail, Init, R).
% Ejercicio 10
% Definir un predicado que reciba una lista de numeros naturales y devuelva otra
lista de numeros
% naturales, en la que cada numero n de la primera lista aparezca repetido n vece
s en forma consecutiva,
% respetando su orden de aparicion. Considerar que la lista original siempre esta
instanciada.
% Ejemplo: para la lista [2, 3, 1, 0, 2] la salida es [2, 2, 3, 3, 3, 1, 2, 2].
repetir_n(_, 0, []).
repetir_n(E, Times, [E | T]) :- Times > 0, TimesMenos1 is Times - 1, repetir_n(E
, TimesMenos1, T).
repetir_numeros([], []).
repetir_numeros([H | T], Reps) :- repetir_n(H, H, Hs), repetir_numeros(T, Ts), a
ppend(Hs, Ts, Reps).
% Ejercicio 11
% Escribir en Prolog un predicado que devuelva la mediana de una lista (la media
na es el elemento que
% se halla en la posicion del medio de dicha lista, tras ser ordenada). Utilizar
los predicados definidos
% anteriormente. Considerar que la lista siempre esta instanciada.
mediana(L, M) :- quicksort(L, S), length(L, Length), Mitad is Length // 2,
append(Primeros, [M | _], S), length(Primeros, Mitad).
% Ejercicio 12
% Escribir en Prolog los siguientes predicados:
% interseccion(+X, +Y, -Z), tal que Z es la interseccion sin repeticiones de las
listas X e Y,
% % respetando en Z el orden en que aparecen los elementos en X.
interseccion_con_duplicados([], _, []).
interseccion_con_duplicados([H | T], Y, [H | IntTY]) :- pertenece(H, Y), interse
ccion_con_duplicados(T, Y, IntTY).
interseccion_con_duplicados([H | T], Y, IntTY) :- not(pertenece(H, Y)), intersec
cion_con_duplicados(T, Y, IntTY).
interseccion(X, Y, Z) :- interseccion_con_duplicados(X, Y, W), sacarDuplicados(W
, Z).