ボディに同じ述語を呼び出すゴールをひとつ含むような節は, (引数は変わる が) 同じことを繰り返し行なうループと見ることができる. たとえば, 与え られた引数から始めて, 0 になるまでカウントダウンしていくような述語は
というふたつの節で定義できる.count_down(0). count_down(N) :- N>0 | M:=N-1, count_down(M).
この例で `` N:=N-1'' とはなっていないことには気をつけていただきた い. 前にも説明したが, KL1 の変数は値の置き場所を示すものではなく, む しろ値そのものにつけた名前なのである. だから N-1 の演算結果であ る新しい値には, M という N とは異なる名前をつけているので ある.
この例のボディには `` M:=N-1'', つまり引き算を行なうゴールと, `` count_down(M)'' という再帰呼び出しのゴールのふたつがある. KL1 ではボディ中のゴールの記述順序には特に意味がないので, 両者の実行順 はどうなるかわからない. 引き算よりも前に再帰呼び出しの実行を始めるこ ともあるし, 両方同時に実行することもある. しかし, 述語 count_down を 定義するふたつの節は, 両方とも選択条件として引数の値を調べているので, その値が決まるまで実行は待たされる. この引数の値は引き算の結果なのだか ら, 実際には必ず引き算の方が先に実行されることになる.
基本的な実行機構であるひとつひとつの簡約化は細切れの操作なのだが, この
繰り返し全体を見ると, ある程度の大きさを持った連続性のある計算過程と考
えることができる. このような計算過程を プロセスと呼ぶ.
プロセスとみな
せるような, まとまった計算を行なう述語の例をいくつかあげて, KL1 のプロ
セスとはどんな概念なのか, どういう特徴を持つのかを, もう少し詳しく説明
していこう.