% Az alábbi program "bizonyítja", hogy a Prolog nem mindenható!

% Ugyanis ez a Prolog program egy olyan aritmetikai kifejezést
% generál a másodperc töredéke alatt, amelyet az `is´ beépített
% eljárás évezredek alatt sem tud kiértékelni.




:- use_module(library(between)).    % SWI Prologban hibát jelez, nem szükséges

% akif(N, Kif): Kif egy olyan Prolog aritmetikai kifejezés, amely 2^n
% darab 1 összegét írja le.
akif(0, 1).
akif(N, X+X) :-
	N > 0, N1 is N-1,
	akif(N1, X).

% N = 1..Max értékre kiírja a fenti eljárás futásához szükséges időt.
time_akif(Max) :-
	between(1, Max, N),
	time(akif(N,...), akif(N, _)), nl,
	fail.
time_akif(_).

% N = 1..Max értékre kiírja az akif(N, X) eljárás által generált X
% aritmetikai kifejezés is/2-vel való kiszámításához szükséges időt.
time_is(Max) :-
	between(1, Max, N),
	akif(N, AKif),
	time('... is 1+1+...'(N), X is AKif),
	write(' '), write(X), nl,	
	fail.
time_is(_).

% Kiírja Goal első megoldásának előállításához vagy a meghiúsuláshoz
% szükséges T időt, a Txt szöveg kiséretében.
time(Txt, Goal, T) :-
	statistics(runtime, [T0,_]),  % T0 a Prolog rendszer indítása óta
	                              % eltelt CPU idő, msec-ban.
	(   call(Goal) -> Res = true
	;   Res = false
	),
	statistics(runtime, [T1,_]),
	T is T1-T0,
	format('~w run time =~|~t~3d~9+ sec', [Txt,T]), 
	Res = true.


time(Txt, Goal) :-
	time(Txt, Goal, _).

end_of_file.
