構造化プログラミングの繰り返しは、PROLOGなど、繰り返し用の構文が無い言語では、末尾再帰を使います。自分を呼び出した(再帰)時に、最後なので他の処理が残っていない場合(末尾)で、わざとらしい例だと、
try :- write('無限 '), try.
です。やってしまったら、これは無限ループなので止まりませんから、コントロールキー(Ctrl)を押しながらCのキーを押します(割り込み)。この操作を以下、Ctrl-Cと記述します。AZ-Prologでは、Ctrl-Cで止めると、次どうしましょうか、の案内が出てくるので、aのabortを選びます。
なので、当然ながら普通はループ脱出用の判断・分岐を用意します。計数とリスト処理が代表的で、以下、説明。
計数の方は、C言語だとfor(i = 0; i < 10; i++){ };みたいな感じで、表作成が練習としては出てきますが、現実的には配列操作(ベクトルと行列)が主な応用だと思います。PROLOGには標準の配列がありませんから、とりあえず表作成で行きます。
% p07.pl; 200730; author; 計数繰り返し
try :- !, write('構造化風繰り返し、その1'), nl, do0.
do0 :- !, write('角度: sin, cos.'), nl,
do1(0, 181, 15), write('終了'), nl.
do1(X, Y, Z) :- X >= Y, !.
do1(X, Y, Z) :- X < Y, !,
write(X), write(': '),
S is sin(X * pi / 180), write(S), write(', '),
C is cos(X * pi / 180), write(C), write('.'), nl,
X1 is X + Z, do1(X1, Y, Z).
つまり、ループ本体の入り口に専用の述語(do1)を用意します。ループの設定は前座の述語、do0がやります(必要なら後始末も)。
これは私のやり方ですが、多分、PROLOGに構造化プログラミングを導入するなら、こうなると思います。後で多分、二重ループの例を書きますから、疑義のある方(特にPROLOGフリークの方々)はそれを見てから私に文句を言うかどうか、ご判断ください。
述語do1の最後の節の最後の項が末尾再帰です。do1述語の最初の節が終了条件です。処理内容は、三角関数sinとcosの値の表の作成です。実行してみると、あまり見やすいとは言えませんが、計算機が普及していなかった時代では実用と思います。
見やすさは重要なので、私に時間と意欲があれば工夫してみます。
なお、piが円周率なのはAZ-Prologのサービスです。無ければ、大昔のパソコンBASICみたいに、atan(1)*4で代用します。