/*  The naive reverse benchmark */



nrev(ShowResult) :-
	bench(250, ShowResult).



nrev([],[]).

nrev([X|Rest],Ans):-
	nrev(Rest,L), app(L,[X],Ans).




app([],L,L).

app([X|L1],L2,[X|L3]):-
	app(L1,L2,L3).


/* commented since it is defined in common.pl
get_cpu_time(T) :- 
	statistics(runtime,[T|_]).
*/


bench(Count, ShowResult):-
	get_cpu_time(T0),
	dodummy(Count),
	get_cpu_time(T1),
	dobench(Count),
	get_cpu_time(T2),
	(   ShowResult = true ->
	    report(Count,T0,T1,T2)
	;   true).



dobench(Count):-
	data(List),
	repeat(Count),
	nrev(List,_),
	fail.

dobench(_).




dodummy(Count):-
	data(List),
	repeat(Count),
	dummy(List,_),
	fail.

dodummy(_).




dummy(_,_).




data(X):-
	data(X,30).


data([],0).

data([a|Y],N):-
	N > 0, 
	N1 is N-1, 
	data(Y,N1).




repeat(_N).

repeat(N):-
	N > 1, 
	N1 is N-1, 
	repeat(N1).




report(Count,T0,T1,T2) :-
	Time1 is T1-T0,
	Time2 is T2-T1,
	Time  is Time2-Time1,		/* Time spent on nreving lists */
        Lips is (496*Count*1000)//Time,
 	write(Lips), write(' lips for '), write(Count),
	write(' iterations taking '), write(Time),
	write(' msec ('),
	write(Time2-Time1), write(')'),
	nl.



% benchmark interface

benchmark(ShowResult) :-
	nrev(ShowResult).

:- include(common).

