/*
 * ej2.pl
 *
 * para ejecutar con GNU Prolog use:
 * gprolog --init-goal "consult('ej2.pl')" --query-goal "inicial"
 */

subset(L1, L2) :-  not(p(L1, L2)).

p(L1, L2) :-  miembro(X, L1), not(miembro(X, L2)).

miembro(X, [X|L] ).
miembro(X, [Y|L] ) :- miembro(X, L).

inicial :-
	trace, leash(none),
	subset([1,2], [1]).

inicial :-
	halt.


/*
 * Para la consulta subset([1,2], [1])  el interprete resuelve:
 *

| ?- inicial.
The debugger will first creep -- showing everything (trace)
No leashing
      1    1  Call: subset([1,2],[1])
      2    2  Call: not(p([1,2],[1]))
      3    3  Call: \+p([1,2],[1])
      4    4  Call: p([1,2],[1])
      5    5  Call: miembro(_170,[1,2])
      5    5  Exit: miembro(1,[1,2])
      6    5  Call: not(miembro(1,[1]))
      7    6  Call: \+miembro(1,[1])
      8    7  Call: miembro(1,[1])
      8    7  Exit: miembro(1,[1])
      7    6  Fail: \+miembro(1,[1])
      6    5  Fail: not(miembro(1,[1]))
      5    5  Redo: miembro(1,[1,2])
      6    6  Call: miembro(_194,[2])
      6    6  Exit: miembro(2,[2])
      5    5  Exit: miembro(2,[1,2])
      7    5  Call: not(miembro(2,[1]))
      8    6  Call: \+miembro(2,[1])
      9    7  Call: miembro(2,[1])
     10    8  Call: miembro(2,[])
     10    8  Fail: miembro(2,[])
      9    7  Fail: miembro(2,[1])
      8    6  Exit: \+miembro(2,[1])
      7    5  Exit: not(miembro(2,[1]))
      4    4  Exit: p([1,2],[1])
      3    3  Fail: \+p([1,2],[1])
      2    2  Fail: not(p([1,2],[1]))
      1    1  Fail: subset([1,2],[1])

      1    1  Call: halt

 */

/*
 * not/1 es definido mediante la primitiva \+/1
 */
not(X) :- \+(X).


/* EOF ej2.pl */

