/*
 * 04-lista_de_listas.pl
 *
 * Defina un predicado lista_de_listas/1 que compruebe si un objeto
 * es una lista de listas.
 *
 * ejecutar desde el shell con el siguiente mandato:
 * gprolog --entry-goal "consult('04-lista_de_listas.pl')" --query-goal 'pruebas'
 */

p01_lista_vacia_falla :- \+(lista_de_listas([])), !.
p01_lista_vacia_falla :- fallo('p01_lista_vacia_falla').

p02_atomo_falla :- \+(lista_de_listas(atomo)), !.
p02_atomo_falla :- fallo('p02_atomo_falla').

p03_lista_unitaria_falla :- \+(lista_de_listas([unico])), !.
p03_lista_unitaria_falla :- fallo('p03_lista_unitaria_falla').

p04_lista_comun_falla :- \+(lista_de_listas([uno,dos,tres])), !.
p04_lista_comun_falla :- fallo('p04_lista_comun_falla').

p05_lista_listas_y_atomos_falla :- \+(lista_de_listas([[uno],dos,tres])), !.
p05_lista_listas_y_atomos_falla :- fallo('p05_lista_listas_y_atomos_falla').

p06_lista_listas_y_atomos_falla :- \+(lista_de_listas([uno,[dos],tres])), !.
p06_lista_listas_y_atomos_falla :- fallo('p06_lista_listas_y_atomos_falla').

p07_lista_listas_y_atomos_falla :- \+(lista_de_listas([uno,[dos],tres])), !.
p07_lista_listas_y_atomos_falla :- fallo('p07_lista_listas_y_atomos_falla').

p08_lista_listas_y_atomos_falla :- \+(lista_de_listas([[uno,dos],tres])), !.
p08_lista_listas_y_atomos_falla :- fallo('p08_lista_listas_y_atomos_falla').

p09_lista_listas_y_functores_falla :- \+(lista_de_listas([[uno,dos],tres(algo)])), !.
p09_lista_listas_y_functores_falla :- fallo('p09_lista_listas_y_functores_falla').

p10_lista_lista_unitaria_vacia :- lista_de_listas([[]]), !.
p10_lista_lista_unitaria_vacia :- fallo('p10_lista_lista_unitaria_vacia').

p11_lista_lista_unitaria :- lista_de_listas([[unico]]), !.
p11_lista_lista_unitaria :- fallo('p11_lista_lista_unitaria').

p12_lista_listas_vacias :- lista_de_listas([[],[],[]]).
p13_lista_listas_unitarias :- lista_de_listas([[uno],[dos],[tres]]).
p14_lista_listas_comunes :- lista_de_listas([[unoa, unob],[dosa, dosb, dosc],[tres]]).

pruebas :-
	p01_lista_vacia_falla,
	p02_atomo_falla,
	p03_lista_unitaria_falla,
	p04_lista_comun_falla,
	p05_lista_listas_y_atomos_falla,
	p06_lista_listas_y_atomos_falla,
	p07_lista_listas_y_atomos_falla,
	p08_lista_listas_y_atomos_falla,
	p09_lista_listas_y_functores_falla,
	p10_lista_lista_unitaria_vacia,
	p11_lista_lista_unitaria,
	p12_lista_listas_vacias,
	p13_lista_listas_unitarias,
	p14_lista_listas_comunes,
	paso('todo'), !.
pruebas :- fallo.

paso(Msg)  :- msg(paso,Msg), !.
fallo(Msg) :- msg(fallo,Msg), !.
fallo      :- msg(fallo,''), !.
msg(paso, Msg) :- write('Paso: '), write(Msg), nl.
msg(fallo, '') :- write('Fallo algo.'), nl.
msg(fallo, Msg) :- write('Fallo: '), write(Msg), nl.

lista_de_listas([]) :- !, fail.
lista_de_listas(X) :- lista_de_listas_aux(X).

lista_de_listas_aux([]).
lista_de_listas_aux([X|Xs]) :- lista(X), lista_de_listas_aux(Xs).

lista([]).
lista([_|Xs]) :- lista(Xs).

/* EOF 04-lista_de_listas.pl */
