next up previous contents
Next: ユニフィケーション Up: 1.2.1 プログラムの形式と基本実行機構 Previous: 簡単なプログラム

プログラムの実行

KLIC で前掲のインバータのプログラムを実行するには, メイン・プログラム としての体裁を整えなければならない. たとえば以下のようなものを用意する.

:- module main.

main :- not(1, X), io:outstream([print(X),nl]).

not(In, Out):- In = 0 | Out = 1.
not(In, Out):- In = 1 | Out = 0.

最初の行で, これがメインプログラムのモジュールだということを宣言してい る. 次の main から始まる行がメインプログラムの本体である. そこには not という先ほど見たプログラムを呼び, その結果を書き出す, ということが 書いてある. 書き出すための io:outstream 云々というのは, ここでは無意 味なおまじないだと思っておいてよい.

ここでは not の引数に 1 と X を与えた. 整数 1 は普通の整数値 1 を表す. KL1 では大文字で始まる名前は変数を表す. ここでは他にはまだどこにも出 てこなかったまっさらの変数 X を第2引数に渡したわけである.

このプログラムのうち, not の呼び出しの部分の実行は以下のようになる.

  1. 第1引数の In は会話的な呼び出しの時に与えた引数 1 に対応する. これは, ふたつあった節のうち, 前の方の節のガードに書いた選択条件 `` In = 0'' は見たさないが, 後の節の条件 `` In = 1'' は満たしている. そ こで, この後の方の節を選ぶ.
  2. 節が選ばれたので, そのボディを実行する. ボディでは第2引数 Out (ここで は会話的に呼び出した時に書いた X に対応づけられている) の値を 0 と決め ている (`` Out = 0'').
  3. 他にすることはないので, これで実行を終わる.

この実行の結果, 引数に与えた X の値が 0 に決まったので, それが出力され, プログラムはつつがなく終了することになる.gif

KL1 の変数は C のような手続き型言語でいう『変数』とは大きく異なる. 手 続き型言語では『変数』は値の格納場所であって, 計算の進行に伴って格納さ れている値は 0 になったり 1 になったりと変化する. KL1 の変数はもっと 数学でいう変数に近く, 値は決まっていないか決まっているかのどちらかで, いったん値を決めたら後で変わることはない.

最初に与える第一引数を 0 に変えれば, 当然出力されるのは 1 になる.



next up previous contents
Next: ユニフィケーション Up: 1.2.1 プログラムの形式と基本実行機構 Previous: 簡単なプログラム



KLIC