/*
 * ej1.pl
 * Parcial logica, primer cuatrimestre 2004
 *
 * Defina el predicado:
 *       suma_par_impar(L, Spar, Simpar).
 *
 * que dada una lista de enteros L, devuelve en Spar la suma
 * de los números pares, y en Simpar la suma de los números
 * impares.
 * 
 * Ejemplo:
 * ?- suma_par_impar( [1,2,4,3,7,8], A, B ).
 * A = 14
 * B = 11
 * No
 */

inicial :-
	ejemplo,
	halt.

ejemplo :-
	suma_par_impar( [1,2,4,3,7,8], A, B ),
	write(A), nl,
	write(B), nl.

ejemplo :-
	write('fallo'), nl.


suma_par_impar(L, Suma_pares, Suma_impares) :-
	obtener_pares(L, L_pares),
	obtener_impares(L, L_impares),
	suma_lista(L_pares, Suma_pares),
	suma_lista(L_impares, Suma_impares).

/*
 * obtener_pares(ListaEnteros, ListaPares).
 * en ListaPares figuran los enteros pares que hay
 * en ListaEnteros.
 */
obtener_pares([], []).

obtener_pares([N|Ns], [N|Pares]) :-
	es_par(N),
	obtener_pares(Ns, Pares).

obtener_pares([N|Ns], Pares) :-
	es_impar(N),
	obtener_pares(Ns, Pares).


/*
 * obtener_impares(ListaEnteros, ListaImpares).
 * en ListaImpares figuran los enteros impares que hay
 * en ListaEnteros.
 */
obtener_impares([], []).

obtener_impares([N|Ns], [N|Impares]) :-
	es_impar(N),
	obtener_impares(Ns, Impares).

obtener_impares([N|Ns], Impares) :-
	es_par(N),
	obtener_impares(Ns, Impares).


es_par(N) :- N mod 2 =:= 0.

es_impar(N) :- \+(es_par(N)).

/*
 * suma_lista(ListaNumeros, Suma).
 * El primer argumento es una lista de números, el
 * segundo es la suma de los mismos.
 */

suma_lista([], 0).
suma_lista([X|Xs], Suma) :-
	suma_lista(Xs, SumaParcial),
	Suma is X + SumaParcial.


/*
 * Comprobado con GNU Prolog.
 * Correr mediante el mandato:
 * /usr/bin/gprolog --entry-goal "consult('pp.pl')" --query-goal 'inicial'
 */

/* ej1.pl */
