/*
 * ej-04.pl
 *
 * Se le solicita que defina el predicado 
 *            ocurrencias(+atomo, +lista, ?lista_posiciones)
 *
 * Donde atomo es un elemento que puede aparecer una o más veces
 * en el segundo argumento lista.  El tercer argumento es una lista
 * de enteros que indican las posiciones en que ocurre atomo en lista.
 *
 * La restricción que se impone es que _no_podrán_utilizarse_
 * _predicados_con_más_de_tres_argumentos_ en la definición de
 * ocurrencias/3, es decir, no utilizar predicados empleando argumentos
 * contadores que siempre requieran ser evaluados con ese argumento
 * con un valor, pudiéndose evaluar con ese argumento como variable.
 *
 * Ejemplos de empleo del predicado:
 *
 * | ?- ocurrencias(a, [s,1,3,a,a,2,d,a], T).
 *   T = [4,5,8]
 *
 * | ?- ocurrencias(2, [2,1,3,a,a,2,d,a], [1,6]).
 *   true
 *
 * | ?- ocurrencias(4, [s,1,3,a,a,2,d,a], T).
 *   T = []
 */

prueba_1 :-
	write('prueba 1: Se espera como resultado: T = [4,5,8] ==> '),
	ocurrencias(a, [s,1,3,a,a,2,d,a], T), !,
	write(T), nl.

prueba_1 :-
	write('fallo'), nl.


prueba_2 :-
	write('prueba 2: '),
	ocurrencias(2, [2,1,3,a,a,2,d,a], [1,6]), !,
	write('correcto'), nl.

prueba_2 :-
	write('fallo'), nl.


prueba_3 :-
	write('prueba 3: Se espera como resultado: T = [] ==> '),
	ocurrencias(4, [s,1,3,a,a,2,d,a], T), !,
	write(T), nl.

prueba_3 :-
	write('fallo'), nl.


ocurrencias(_, [], []) :- !.

ocurrencias(X, [X|Xs], [1|Zs]) :- !,
	ocurrencias(X, Xs, Ys),
	map_sume_uno(Ys, Zs).


ocurrencias(E, [X|Xs], Zs) :-
	E \= X,
	ocurrencias(E, Xs, Ys),
	map_sume_uno(Ys, Zs).



map_sume_uno([], []) :- !.

map_sume_uno([X|Xs], [Y|Ys]) :-
	Y is X + 1,
	map_sume_uno(Xs, Ys).



/* EOF ej-04.pl */
