/*
 Ejercicio 3
 Se desea desarrollar un programa Prolog que permita intercalar los elementos
 de dos listas considerando tramos de intercalación de distintas longitudes:

 	intercala( L1, L2, LongTramoL1, LongTramoL2, Resultado )

 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]

 Nota: 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.
*/

/* ------------------------------------------------------- */
/* exito */
p1 :- intercala([a1, a2, a3, a4, a5, a6], 
             [b1, b2, b3, b4], 
	     3,
	     2,
             [a1, a2, a3, b1, b2, a4, a5, a6, b3, b4]).

/* exito */
p2 :- intercala([a1, a2, a3, a4], [b1, b2], 4, 1, X),
      Y = [b1, a1, a2, a3, a4, b2],
      write(X), nl,
      write(Y),nl.

/* ------------------------------------------------------- */

intercala(L1, L2, Largo1, Largo2, Resultado) :-
	intercala_primera(L1, L2, Largo1, Largo2, Resultado).

intercala(L1, L2, Largo1, Largo2, Resultado) :-
	intercala_segunda(L1, L2, Largo1, Largo2, Resultado).


intercala_primera([], [], _, _, []).

intercala_primera(L1, L2, Largo1, Largo2, Resultado) :-
	partir_lista_en_largo(L1, Largo1, Prefijo1, Resto1),
	partir_lista_en_largo(L2, Largo2, Prefijo2, Resto2),
	intercala_primera(Resto1, Resto2, Largo1, Largo2, RestosIntercalados),
	concatena(Prefijo1, Prefijo2, X),
	concatena(X, RestosIntercalados, Resultado).

intercala_segunda([], [], _, _, []).
intercala_segunda( X, [], _, _,  X).
intercala_segunda([],  X, _, _,  X).

intercala_segunda(L1, L2, Largo1, Largo2, Resultado) :-
	partir_lista_en_largo(L1, Largo1, Prefijo1, Resto1),
	partir_lista_en_largo(L2, Largo2, Prefijo2, Resto2),
	intercala_segunda(Resto1, Resto2, Largo1, Largo2, RestosIntercalados),
	concatena(Prefijo2, Prefijo1, X),
	concatena(X, RestosIntercalados, Resultado).


/* ------------------------------------------------------- */
partir_lista_en_largo(Resto, 0, [], Resto) :- !.

partir_lista_en_largo([X|Xs], Largo, [X|Ps], Resto) :-
	NuevoLargo is Largo - 1,
	partir_lista_en_largo(Xs, NuevoLargo, Ps, Resto).


/* ------------------------------------------------------- */
concatena([], Y, Y).

concatena([X|Xs], Y, [X|Zs]) :-
	concatena(Xs, Y, Zs).

/* ------------------------------------------------------- */
/* EOF gxej03.pl */
