整数を要素とするリストに対して, 要素の総和を計算するような述語は以下の ように書ける.
このプログラムはふたつの述語の定義からなる. 両者は同じ sum という名前 だが, 引数個数が異なる. KL1 では同じ名前でも引数個数が異なれば違う述 語として扱う. この例でもそうだが, 同じ名前で引数個数が異なる述語は補 助的な述語の名前として使うことが多い.sum([],PSum,Sum) :- Sum=PSum. sum([One|Rest],PSum,Sum) :- NewPSum:=PSum+One, sum(Rest,NewPSum,Sum). sum(List,Sum) :- sum(List,0,Sum).
最初のふたつの節で定義する3引数の述語が, 実際の計算をする述語である. この述語を単独に見ると, 第1引数に与えられるリストの要素すべてと, 第2引 数に渡される数とを足し合わせ, 第3引数にその結果を返すものになっている. 最初の節は, 空のリストについては要素がないのだから第2引数をそのまま返 せば良い, ということを表している. もうひとつの節は, リストが空でない 場合, 最初の要素が One なら, この One と第2引数 PSum との和 NewPSum を 求め, これとリストの残り部分 Rest の各要素との和が, 求める総和である, ということを表す.
最後の節で定義する2引数の述語がもともと定義したかった述語で, リストの 要素の総和と 0 の和を計算すれば, リストの要素の総和そのものを計算する ことになる, という意味になる.
注意されたいのは, 2番目の節のボディにある, 足し算と再帰呼び出しのふた
つのゴールは, 並列に動いてもまったくかまわないということである. 再帰
呼び出しの実行では, 節の選択条件は第1引数のリストが空かどうかだけに依っ
ており, 足し算の結果は節の選択に関係しない. だから, 再帰呼び出しだけ
先にどんどん実行してしまい, 足し算は後からやっても構わないのである.
ただし, 次々に呼ばれる足し算の引数のひとつ (PSum) は, 一段前の呼
び出し時に呼んだ足し算の結果になっている. だから, 要素個数と同じ回数
行なわれる足し算については, 実行順が自動的に決まってしまう.
このように KL1 でプロセスと呼び慣わしている計算過程は必ずしも逐次的な 過程ではなく, それ自体の中に並列性を持っていることも少なくない. プロ セスという概念は, プログラムを読む側の解釈に過ぎないのである.