:- object(loop,
	implements(loopp)).


	:- info([
		version is 1.1,
		author is 'Paulo Moura',
		date is 2006/9/17,
		comment is 'Loop control structures predicates.']).


	:- meta_predicate(dowhile(::, ::)).

	:- meta_predicate(forto(*, *, ::)).

	:- meta_predicate(forto(*, *, *, ::)).

	:- meta_predicate(fordownto(*, *, ::)).

	:- meta_predicate(fordownto(*, *, *, ::)).

	:- meta_predicate(whiledo(::, ::)).


	dowhile(Action, Condition) :-
		\+ \+ call(Action),
		whiledo(Condition, Action).


	whiledo(Condition, Action) :-
		call(Condition) ->
			\+ \+ call(Action),
			whiledo(Condition, Action)
			;
			true.


	forto(First, Last, Call) :-
		First =< Last ->
			\+ \+ call(Call),
			Next is First + 1,
			forto(Next, Last, Call)
			;
			true.


	forto(Count, First, Last, Call) :-
		First =< Last ->
			\+ \+ (Count = First, call(Call)),
			Next is First + 1,
			forto(Count, Next, Last, Call)
			;
			true.


	fordownto(First, Last, Call) :-
		First >= Last ->
			\+ \+ call(Call),
			Next is First - 1,
			fordownto(Next, Last, Call)
			;
			true.


	fordownto(Count, First, Last, Call) :-
		First >= Last ->
			\+ \+ (Count = First, call(Call)),
			Next is First - 1,
			fordownto(Count, Next, Last, Call)
			;
			true.


:- end_object.