そのような単純なループをエミュレートするには:
start = something;
incr = something_else;
end = yet_something_else; /* all three are numerical values, int or float */
while (start <= end) {
/* do something for its side effect, for example: */
printf("%d %d\n", start, start*start);
start += incr;
}
私はどちらかを書くことができます:
loop1(Start, End, _Incr) :-
Start > End, !. % yes, the cut is necessary!
loop1(Start, End, Incr) :-
Start =< End,
/* do something for its side effect, for example */
format('~d ~d~n', [Start, Start*Start]),
Next is Start + Incr,
loop1(Next, End, Incr).
また:
loop2(Start, End, Incr) :-
( Start =< End
-> format('~d ~d~n, [Start, Start*Start]),
Next is Start + Incr,
loop2(Next, End, Incr)
; true
).
loop/3
すべての引数を数値にインスタンス化して呼び出す必要があります (常に呼び出されます)。
2 番目のバージョンを使用する必要がありますよね?疑問がある唯一の理由は、if-then-else 構造が Prolog の入門資料にほとんど含まれていないことであり、その理由がわかりません (「今すぐ Prolog を学ぼう!」など、それ以外の場合は優れた入門資料ではありません)。言及することすらありません!)。同時に、片道ずつ無造作に飛んでいるカットがあります。
助けてくれてありがとう!