/*  The naive reverse benchmark */

:- main.

q:-	statistics(runtime,[S|_]), 
	bench(250),
	statistics(runtime,[S1|_]), Y is S1-S,
	write('time : '), write(Y), nl,
	halt_or_else(0,true).





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).




bench(Count):-
	statistics(runtime,[T0|_]),
	dodummy(Count),
	statistics(runtime,[T1|_]),
	dobench(Count),
	statistics(runtime,[T2|_]),
	report(Count,T0,T1,T2).



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.



:- q.


syntax highlighted by Code2HTML, v. 0.9.1