Concurrent Prolog
エラストテネスのふるいを使い素数生成を行うプログラム例を示す。
gen_primes/2を実行すると、integers/3とsift/2の2つのプロセスが生成される。integers/3はMaxまでの自然数のストリームを生成し、sift/2はそれをふるいにかけ素数のストリームをPrimesに返す。integers/3とsift/2とはそれぞれ並行して動き、integers/3で生成された自然数のストリームは変数Nsを介して順次sift/2に渡される。読み出し専用標記により変数Nsによるintegers/3からsift/2へのデータフローの方向が表現され、プロセス間の同期はストリームの各要素が具体化されるまで待つという形で自然に表現される。
integers/3、sift/2の各プログラムはそれぞれ以下のようになる。integers/3は、自然数のストリームを順次生成しMaxを超えたら終了する。sift/2は、2,3,5,7,..などの各素数の倍数をストリームから取り除くfilterプロセス(ふるい)を順に生成しながら、求まった素数を順次ストリームの要素として返す。各filterプロセスは変数を介して直列につながれていくため、自然数のストリームから素数のみのストリームを求めることができる。