Lunes 24 de marzo de 2008 a las 17:40
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).
intercalar_lista([], [], _N1, _N2, []).
intercalar_lista(L1, L2, N1, N2, Result):-
concatenar(PreL1, RestoL1, L1),
largo(PreL1, N1),
intercalar_lista(L2, RestoL1, N2, N1, X),
concatenar(PreL1, X, Result).
% las listas deben tener al menos 1 elemento:
largo([_X], 1).
largo([_X|Xs], N):- largo(Xs, N2), N is N2 + 1.
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
?– intercala([a1, a2, a3, a4], [b1, b2], N, 1, X).
N = 2, X = [a1, a2, b1, a3, a4, b2] ;
N = 2, X = [b1, a1, a2, b2, a3, a4] ;
N = 4, X = [b1, a1, a2, a3, a4, b2] ;
No