/*
 * 02-diferente.pl
 *
 * Defina un predicado diferente/3 tal que para una lista L sin repeticiones
 * diferente(X,Y,L) significa que X e Y son miembros diferentes de L.
 *
 * Pista: use select/3 y member/2
 *
 * ejecutar desde el shell con el siguiente mandato:
 * gprolog --entry-goal "consult('02-diferente.pl')" --query-goal 'pruebas'
 */

/* select(Elemento, Lista1, Lista2) elimina un Elemento de Lista1
 * y el resultado queda en Lista2.
 * Es un predicado GNU Prolog
 */

/* member(?Termino, ?Lista) acierta si Termino pertenece a la Lista.
 * Este predicado es re-ejecutable por backtracking, y por ende sirve para
 * enumerar los elementos de una lista.
 * Es un predicado GNU Prolog
 */

p1_lista_vacia_falla :- \+(diferente(_,_,[])).
p1_lista_vacia_falla :- fallo('p1_lista_vacia_falla'), fail.

p2_lista_unitaria_falla :- \+(diferente(_,_,[unico])), fail.
p2_lista_unitaria_falla :- fallo('p2_lista_unitaria_falla').

p3_lista_de_dos :- diferente(X,Y,[uno,dos]), X = uno, Y = dos.
p4_lista_de_dos :- diferente(X,Y,[uno,dos]), Y = uno, X = dos.
p5_lista_de_dos_falla :- \+((diferente(X,Y,[uno,dos]), Y = uno, X = uno)).
p6_lista_de_dos_falla :- \+((diferente(X,Y,[uno,dos]), Y = dos, X = dos)).
p7_lista_de_tres :- diferente(X,Y,[uno,dos,tres]),
	write(X), write('/'), write(Y),nl, fail.
p7_lista_de_tres.

pruebas :-
	p1_lista_vacia_falla,
	p2_lista_unitaria_falla,
	p3_lista_de_dos,
	p4_lista_de_dos,
	p5_lista_de_dos_falla,
	p6_lista_de_dos_falla,
	p7_lista_de_tres,
	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.


diferente(X,Y,Lista) :-
	select(X, Lista, Lista1),
	select(Y, Lista1, _).

/* EOF 02-diferente.pl */
