/*
 * 06-conjuntos_iguales.pl
 *
 * defina un predicado conjuntos_iguales/2 que compruebe si dos listas
 * corresponden al mismo conjunto.  Por ejemplo, las listas [a,b,a,c] y
 * [b,c,c,c,a] corresponden al mismo conjunto {a,b,c}.
 *
 * ejecutar desde el shell con el siguiente mandato:
 * gprolog --entry-goal "consult('06-conjuntos_iguales.pl')" --query-goal 'pruebas'
 */

p1_dos_listas_vacias :- conjuntos_iguales([],[]), !.
p1_dos_listas_vacias :- fallo('p1_dos_listas_vacias').

p2_alguno_no_es_lista_falla :-
	\+(conjuntos_iguales(uno,dos)), !,
	\+(conjuntos_iguales(uno,[])),
	\+(conjuntos_iguales([],dos)).
p2_alguno_no_es_lista_falla :- fallo('p2_alguno_no_es_lista_falla').

p3_acierta :- conjuntos_iguales([a,b,a,c], [b,c,c,c,a]), !.
p3_acierta :- fallo('p3_acierta'). 

pruebas :-
	p1_dos_listas_vacias,
	p2_alguno_no_es_lista_falla,
	p3_acierta,
	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.

conjuntos_iguales(X,Y) :- subconjunto(X,Y), subconjunto(Y,X).

subconjunto([], _).
subconjunto([X|Xs],Y) :- memberchk(X,Y), subconjunto(Xs,Y).

/* EOF 06-conjuntos_iguales.pl */
