構造化プログラミングは、プログラムを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の処理は前処理の述語に書くのが定石のようです。ですから、分岐する述語は必ず判断を!の前に書く、のが安全です。