制約論理プログラミング
以下に制約論理プログラミング言語の例を挙げる:
B-Prolog (Prologベース、プロプライエタリ)
CHIP V5 (Prologベース、C++/C言語のライブラリも含む、プロプライエタリ)
Ciao Prolog (Prologベース、フリーソフトウェア: GPL/LGPL)
ECLiPSe (Prologベース、オープンソース)
GNU Prolog(Prologベース、フリーソフトウェア)
Mozart(Oz言語の処理系、フリーソフトウェア)
SICStus Prolog (Prologベース、プロプライエタリ)
YAP Prolog(Prologベース、オープンソース)
CAL (非線型代数方程式等を対象。ICOTで開発。オープンソース)
CHAL (階層制約論理型言語。ICOTで開発。オープンソース)
GDCC (並列制約論理型言語。ICOTで開発。オープンソース)
Cu Prolog (ICOTで開発。オープンソース)
そのまま遷移を続ける。
⟨ A , C , S ⟩ → s f a i l {\displaystyle \langle A,C,S\rangle \rightarrow _{s}fail}
能動的な制約の集まり C の一貫性チェックが成立しない場合( ¬ c o n s i s t e n t ( C ) {\displaystyle \neg consistent(C)} )。失敗(fail)する。
ここで i n f e r ( C , S ) {\displaystyle infer\left(C,S\right)} は制約評価の関数、 c o n s i s t e n t ( C ) {\displaystyle consistent\left(C\right)} は制約の一貫性チェック述語を表し、制約の領域ごとに異なる。 多くの制約論理プログラミングシステムの操作的意味は → r → i → s {\displaystyle \rightarrow _{r}\rightarrow _{i}\rightarrow _{s}} と → c → i → s {\displaystyle \rightarrow _{c}\rightarrow _{i}\rightarrow _{s}} の遷移の組み合わせで表される。
また、 A からの原子論理式や制約の取り出しと追加はLIFOの順番に行われることが多い。この場合はPrologと同様の深さ優先探索の動作になり、途中で失敗(fail)した場合はバックトラックが行われる。
失敗(fail)する。
⟨ A ∪ c , C , S ⟩ → c ⟨ A , C , S ∪ c ⟩ {\displaystyle \langle A\cup c,C,S\rangle \rightarrow _{c}\langle A,C,S\cup c\rangle }
A 内に制約 c があれば制約ストアに移動する。
⟨ A , C , S ⟩ → i ⟨ A , C ′ , S ′ ⟩ {\displaystyle \langle A,C,S\rangle \rightarrow _{i}\langle A,C',S'\rangle }
制約ストア内の制約を制約評価系で簡約化する( ( C ′ , S ′ ) = i n f e r ( C , S ) {\displaystyle \left(C',S'\right)=infer\left(C,S\right)} )。まだ利用できない受動的な制約の集まり S で利用可能なものがあれば C に移し、利用可能な制約の集まり C はより単純な制約に簡約化する。
⟨ A , C , S ⟩ → s ⟨ A , C , S ⟩ {\displaystyle \langle A,C,S\rangle \rightarrow _{s}\langle A,C,S\rangle }
能動的な制約の集まり C の一貫性チェック c o n s i s t e n t ( C ) {\displaystyle consistent\left(C\right)} に問題がない場合。