/*
 * ej-01-10.pl
 *
 * Dadas las siguientes definiciones del predicado pegar/3
 * (este enunciado tiene una correccion en las causulas con
 * respecto al que aparece en la guia de practicas; si desea
 * ver el enunciado original, vea ej-01-10a.pl)
 */

pegar1( [], L, L ).
pegar1( [X|Y], Z, [X|T] ) :- pegar1(Y, Z, T).


pegar2( [X|Y], Z, [X|T] ) :- pegar2(Y, Z, T).
pegar2( [], L, L ).


pegar3( [], L, L ) :- !.
pegar3( [X|Y], Z, [X|T] ) :- pegar3(Y, Z, T).

/*
 * Indicar la(s) respuesta(s) de cada definicion ante
 * la siguiente consulta:
 *
 *         <- pegar( X, [a,b,c], [e,f,g,a,b,c] ).
 *
 * Justifique su respuesta.
 */

item_a :- pegar1( X, [a,b,c], [e,f,g,a,b,c] ).

/*

| ?- item_a.
      1    1  Call: item_a ?
      2    2  Call: pegar1(_38,[a,b,c],[e,f,g,a,b,c]) ?
      3    3  Call: pegar1(_83,[a,b,c],[f,g,a,b,c]) ?
      4    4  Call: pegar1(_110,[a,b,c],[g,a,b,c]) ?
      5    5  Call: pegar1(_137,[a,b,c],[a,b,c]) ?
      5    5  Exit: pegar1([],[a,b,c],[a,b,c]) ?
      4    4  Exit: pegar1([g],[a,b,c],[g,a,b,c]) ?
      3    3  Exit: pegar1([f,g],[a,b,c],[f,g,a,b,c]) ?
      2    2  Exit: pegar1([e,f,g],[a,b,c],[e,f,g,a,b,c]) ?
      1    1  Exit: item_a ?

true ? ;
      1    1  Redo: item_a ?
      2    2  Redo: pegar1([e,f,g],[a,b,c],[e,f,g,a,b,c]) ?
      3    3  Redo: pegar1([f,g],[a,b,c],[f,g,a,b,c]) ?
      4    4  Redo: pegar1([g],[a,b,c],[g,a,b,c]) ?
      5    5  Redo: pegar1([],[a,b,c],[a,b,c]) ?
      6    6  Call: pegar1(_164,[a,b,c],[b,c]) ?
      7    7  Call: pegar1(_191,[a,b,c],[c]) ?
      8    8  Call: pegar1(_218,[a,b,c],[]) ?
      8    8  Fail: pegar1(_218,[a,b,c],[]) ?
      7    7  Fail: pegar1(_191,[a,b,c],[c]) ?
      6    6  Fail: pegar1(_164,[a,b,c],[b,c]) ?
      5    5  Fail: pegar1(_137,[a,b,c],[a,b,c]) ?
      4    4  Fail: pegar1(_110,[a,b,c],[g,a,b,c]) ?
      3    3  Fail: pegar1(_83,[a,b,c],[f,g,a,b,c]) ?
      2    2  Fail: pegar1(_38,[a,b,c],[e,f,g,a,b,c]) ?
      1    1  Fail: item_a ?

(10 ms) no

*/

item_b :- pegar2( X, [a,b,c], [e,f,g,a,b,c] ).

/*

| ?- item_b.
      1    1  Call: item_b ?
      2    2  Call: pegar2(_38,[a,b,c],[e,f,g,a,b,c]) ?
      3    3  Call: pegar2(_83,[a,b,c],[f,g,a,b,c]) ?
      4    4  Call: pegar2(_110,[a,b,c],[g,a,b,c]) ?
      5    5  Call: pegar2(_137,[a,b,c],[a,b,c]) ?
      6    6  Call: pegar2(_164,[a,b,c],[b,c]) ?
      7    7  Call: pegar2(_191,[a,b,c],[c]) ?
      8    8  Call: pegar2(_218,[a,b,c],[]) ?
      8    8  Fail: pegar2(_218,[a,b,c],[]) ?
      7    7  Fail: pegar2(_191,[a,b,c],[c]) ?
      6    6  Fail: pegar2(_164,[a,b,c],[b,c]) ?
      5    5  Exit: pegar2([],[a,b,c],[a,b,c]) ?
      4    4  Exit: pegar2([g],[a,b,c],[g,a,b,c]) ?
      3    3  Exit: pegar2([f,g],[a,b,c],[f,g,a,b,c]) ?
      2    2  Exit: pegar2([e,f,g],[a,b,c],[e,f,g,a,b,c]) ?
      1    1  Exit: item_b ?

true ? ;
      1    1  Redo: item_b ?
      2    2  Redo: pegar2([e,f,g],[a,b,c],[e,f,g,a,b,c]) ?
      3    3  Redo: pegar2([f,g],[a,b,c],[f,g,a,b,c]) ?
      4    4  Redo: pegar2([g],[a,b,c],[g,a,b,c]) ?
      4    4  Fail: pegar2(_110,[a,b,c],[g,a,b,c]) ?
      3    3  Fail: pegar2(_83,[a,b,c],[f,g,a,b,c]) ?
      2    2  Fail: pegar2(_38,[a,b,c],[e,f,g,a,b,c]) ?
      1    1  Fail: item_b ?

no

*/

item_c :- pegar3( X, [a,b,c], [e,f,g,a,b,c] ).

/*

| ?- item_c.
      1    1  Call: item_c ?
      2    2  Call: pegar3(_38,[a,b,c],[e,f,g,a,b,c]) ?
      3    3  Call: pegar3(_83,[a,b,c],[f,g,a,b,c]) ?
      4    4  Call: pegar3(_110,[a,b,c],[g,a,b,c]) ?
      5    5  Call: pegar3(_137,[a,b,c],[a,b,c]) ?
      5    5  Exit: pegar3([],[a,b,c],[a,b,c]) ?
      4    4  Exit: pegar3([g],[a,b,c],[g,a,b,c]) ?
      3    3  Exit: pegar3([f,g],[a,b,c],[f,g,a,b,c]) ?
      2    2  Exit: pegar3([e,f,g],[a,b,c],[e,f,g,a,b,c]) ?
      1    1  Exit: item_c ?

yes

*/
