/*
 * Guia 3 - Ejercicio 2
 *
 * Realizar un predicado Prolog secuenciaFaltante(Lista1, Lista2),
 * tal que para una lista Lista1 dada que contiene una secuencia de
 * números enteros ordenados ascendentemente, se obtenga en Lista2
 * una secuencia ascendente de los números faltantes en Lista1.
 * Los números faltantes que pertenecen a Lista2 son aquellos que
 * deberían encontrarse entre números consecutivos de Lista1 pero
 * no se encuentran.  Por ejemplo:
 *
 *     secuenciaFaltante(+lista_flotantes, ?lista_flotantes)
 *
 * | ?- secuenciaFaltante([1,4,6,12], L2).
 * L2=[2,3,5,7,8,9,10,11]
 *
 * | ?- secuenciaFaltante([-2,3,6,8], L2).
 * L2=[-1,0,1,2,4,5,7]
 *
 */

prueba_sf_1([1,4,6,12], [2,3,5,7,8,9,10,11], 'acerto').
prueba_sf_2([-2,3,6,8], [-1,0,1,2,4,5,7], 'acerto').

prueba_sf_cte_var(Nro, L1, R, AcertoFallo) :-
	write('prueba '), write(Nro), write(' : secuenciaFaltante('),
	write(L1), write(', '), write(L2), write('). esperado='),
	write(AcertoFallo), write('/real='),
	secuenciaFaltante(L1, L2), !,
	write('acerto/L2='), write(L2), write('/R='), write(R), nl, nl.

prueba_sf_cte_var(_, _, _, _) :- write('fallo'), nl, nl.

prueba_1 :-
	prueba_sf_1(L1, R, AcertoFallo),
	prueba_sf_cte_var(1, L1, R, AcertoFallo).

prueba_2 :-
	prueba_sf_2(L1, R, AcertoFallo),
	prueba_sf_cte_var(2, L1, R, AcertoFallo).

/* ------------------------------------------------------
 * el predicado solicitado
 */

secuenciaFaltante([X,Y], Faltante) :-
	secuencia_enteros(X,Y,Faltante).

secuenciaFaltante([X,Y|Z], F1) :-
	X < Y,               /* la lista está ordenada*/
	X1 is X + 1,         /* no son consecutivos */
	X1 =\= Y,
	secuencia_enteros(X,Y,Faltante),
	secuenciaFaltante([Y|Z], F2),
	append(Faltante, F2, F1).


secuencia_enteros(X, Y, []) :-
	Y is X + 1.

secuencia_enteros(X, Y, [Z|Zs]) :-
	Z is X + 1,     /* el sucesor de X */
	Z =\= Y,         /* que no es Y */
	secuencia_enteros(Z, Y, Zs).


/* EOF ej-02.pl */
