goo blog サービス終了のお知らせ 

まったり アイマス2

アイドルマスター2 超ライトユーザーのプレイ日記

3125. PROLOG解説、その11

2020年07月30日 | 日記

 構造化プログラミングの繰り返しは、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で代用します。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする