Concurrent Prolog
読み出し専用標記が付加された変数へのアクセスは入力モードだけが許され、読み出し専用変数を変数以外の項に具体化しようとする試みは中断させられる。つまり、これにより変数が具体化されるまで待つという同期と、変数毎のデータ入出力の方向性の指定とができる。例えば、上記プログラムの最初の節では、最初の引数が[A|Xs]のようなリストの形になっていない場合は中断し、他のプロセスにより[A|Xs]の形に具体化された(具体的に値が決まった)場合に実行を再開する。この時点でXs自体は具体化されていなくても構わないため、リストの先頭からインクリメンタルに具体化されるストリームを素直に処理できる。
また、ガードの実行(ヘッドとガード部の実行)で行われた変数への書き込みは、その後の失敗により変更される可能性があるため、どれか1つの節がコミットされるまで他のプロセスに公開されない。例えば、上記マージプログラムの最初の節での [A|Zs] と2番目の節での [A|Zs] とは値が異なる可能性がある。Concurrent Prologでは、ガード実行時に節ごとで変数の値が異なる多重環境を管理する必要があり、全ての節の並行実行を行う際に管理が複雑になる。
生成されたプロセスは全て並行に実行される。また、各プロセスごとの書き換え条件のチェックも複数の節で並行に実行してよく、コミット時にただ1つの節が選択される(コミッティッド・チョイス)。Prologと異なりバックトラックの機能はない。
プロセス間の通信にはプロセス間で共有する論理変数を使用する。多くの場合、プロセス間の通信には論理変数を含んだリストで表現されたストリームを用いる。ストリームは [<メッセージ>|<変数>] のようなリストで実現する。 論理変数を共有するプロセスの数に制限はないため、ストリーム通信は1対1だけではなく1対Nのブロードキャストなど、様々な形態が可能である。
簡単なプログラム例を以下に示す。2本のストリームをマージして1本のストリームにするプログラムで、Prologと同様、A や Xs など英大文字や"_"で始まる項は変数を表す。mergeの最初の2引数が入力ストリーム、最後が出力ストリームである。
Concurrent Prologでは、プロセス間の同期のための中断のメカニズムとして読み出し専用標記 (Read Only Annotation)を用いる。読み出し専用標記は"?"で表され、任意の変数に付与することができる。