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

まったり アイマス2

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

3124. PROLOG解説、その10

2020年07月29日 | 日記

 構造化プログラミングは、プログラムを3つの要素、逐次処理、判断・分岐処理、繰り返し処理にまとめて、可視性を良くします。構造化プログラミングは非常に強力で、フローチャートを過去のものにしてしまいました。

 逐次処理はPROLOGでは節のゴールを並べることになります。hello, world.もそうでしたが、念のため。

% p05.pl; 200729; author; 逐次実行例

try :- !, write('逐次実行例: try(5). 等入力'), nl.

try(X) :- !, write(X), write('**2 = '), Y is X**2, write(Y), nl.

などとなります。実行例は、

| ?-try.
逐次実行例: try(5). 等入力
yes
| ?-try(5).
5**2 = 25
yes
| ?-try(12).
12**2 = 144
yes
| ?-halt.

 まず、最初の%で始まる行は注釈です。練習用のプログラムでも最低限の説明は残しておきます。%から行末までがPROLOGの注釈です。私の好みは、一行目にプログラム名、日付、作者名、題名みたいなの、を書いておくことです。
 2行目も私の好みで、いきなりtry.と入力すると、入力案内が出てきます。
 実行結果は入力した数値の2乗を表示するだけです。try(1.2)などを試してみましょう。

 ところで、カット述語「!」が使用されています。カットはPROLOGの唯一の実行制御で、この述語(節ではなく)はここで確定した、との意味です。逐次実行例なので、他の可能性はありませんから、いきなりカットを使っています。

 次は判断と分岐。これには節を分岐の分だけ用意して、頭部と本体の最初の方に条件を書き、そこで判断が確定しますからカットを置いて、本体の残りで分岐後の処理を書きます。

% p06.pl; 200729; author; 判断と分岐

try :- !, write('判断と分岐の例、偶奇判断: try(5). 等入力'), nl.

try(X) :- X mod 2 =:= 0, !, write(X), write('は偶数'), nl.
try(X) :- X mod 2 =\= 0, !, write(X), write('は奇数'), nl.

 ここで「=:=」は数値の比較で、等値だと成功する述語で、「=\=」は非等値で成功する述語です。modは剰余です。
 「=:=」でなければ「=\=」ですから、2行目の「=\=」は一見不要で、取り除いてもこの場合は正しく動作しますが、PROLOGではデフォルト処理(C言語のELSE)をこの位置に置くのは危険だと言われています。ELSEの処理は前処理の述語に書くのが定石のようです。ですから、分岐する述語は必ず判断を!の前に書く、のが安全です。


コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 3123. PROLOG解説、その9 | トップ | 3125. PROLOG解説、その11 »
最新の画像もっと見る

コメントを投稿

サービス終了に伴い、10月1日にコメント投稿機能を終了させていただく予定です。
ブログ作成者から承認されるまでコメントは反映されません。

日記」カテゴリの最新記事