1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
|
:- object(loop,
implements(loopp)).
:- info([
version is 1.0,
author is 'Paulo Moura',
date is 2000/7/24,
comment is 'Loop control structures predicates.']).
:- metapredicate(dowhile(::, ::)).
:- metapredicate(forto(*, *, ::)).
:- metapredicate(forto(*, *, *, ::)).
:- metapredicate(fordownto(*, *, ::)).
:- metapredicate(fordownto(*, *, *, ::)).
:- metapredicate(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.
|