| 制約処理ルール(CHR) | |
|---|---|
| パラダイム | 制約ロジック、宣言型 |
| デザイン : | トム・フリューヴィルト |
| 初 登場 | 1991年 (1991年) |
| 影響を受けた | |
| プロローグ | |
制約処理ルール( CHR ) は、宣言型ルールベースのプログラミング言語で、1991 年にドイツのミュンヘンにある欧州コンピュータ産業研究センター (ECRC) の Thom Frühwirth によって導入されました。[ 1 ] [ 2 ]元々は制約プログラミングを目的としていましたが、CHR は文法誘導、[ 3 ]型システム、[ 4 ]アブダクティブ推論、マルチエージェントシステム、自然言語処理、コンパイル、スケジューリング、時空間推論、テスト、検証などの分野で応用されています。
CHR プログラム(制約ハンドラとも呼ばれる)は、論理式の多重集合である制約ストアを維持する一連のルールです。ルールの実行により、ストアに式が追加または削除され、プログラムの状態が変わります。特定の制約ストアでルールが「発火」する順序は、抽象意味論によれば非決定論的であり[ 5 ] 、洗練された意味論によれば決定論的(トップダウンのルール適用)です[ 6 ]。
CHR はチューリング完全であるが、[ 7 ]それ自体がプログラミング言語として一般的に使用されることはない。むしろ、制約によってホスト言語を拡張するために使用される。Prolog は圧倒的に人気のあるホスト言語であり、SICStusやSWI-Prologなど、いくつかの Prolog 実装に CHR が含まれているが、 Haskell、[ 8 ] Java、C、[ 9 ] SQL、[ 10 ] JavaScript [ 11 ]用の CHR 実装も存在する。Prolog とは対照的に、CHR ルールはマルチヘッドであり、前方連鎖アルゴリズムを使用してコミット選択方式で実行される。
CHRプログラムの具体的な構文はホスト言語に依存し、実際には、プログラムはホスト言語のステートメントを埋め込んで、いくつかのルールを処理するために実行されます。ホスト言語は、論理変数を含む項を表すためのデータ構造を提供します。項は制約を表し、プログラムの問題領域に関する「事実」と考えることができます。従来、ホスト言語としてはPrologが使用されてきたため、そのデータ構造と変数が使用されます。このセクションの残りの部分では、CHR文献でよく用いられる中立的な数学的表記法を使用します。
CHRプログラムは、制約ストアと呼ばれるこれらの用語のマルチセットを操作するルールで構成されます。ルールには3つのタイプがあります。[ 5 ]
シンパゲーション規則は単純化と伝播を包含するため、すべてのCHR規則は次の形式に従います。
それぞれのこれは制約の論理積です。そしてCHR制約を含み、ガード内蔵されています。空であってはならない。
ホスト言語は、項に対する組み込み制約も定義する必要があります。ルール内のガードは組み込み制約であるため、ホスト言語コードを効果的に実行します。組み込み制約理論には、少なくともtrue(常に成り立つ制約)、fail(決して成り立たず、失敗を通知するために使用される制約)、および項の等価性、つまり単一化が含まれている必要があります。[ 7 ]ホスト言語がこれらの機能をサポートしていない場合は、CHR とともに実装する必要があります。[ 9 ]
CHR プログラムの実行は、初期制約ストアから始まります。プログラムは、ストアに対してルールを照合しfailて適用し、一致するルールがなくなるか(成功)、制約が導出されるまで処理を進めます。前者の場合、制約ストアはホスト言語プログラムによって読み取られ、関心のある事実を検索できます。マッチングは「一方向統合」として定義されます。つまり、方程式の一方の側のみの変数を束縛します。パターンマッチングは、ホスト言語がサポートしている場合、統合として簡単に実装できます。[ 9 ]
以下の CHR プログラムは Prolog 構文で記述されており、小数点以下制約のソルバーを実装する 4 つのルールが含まれています。ルールには便宜上ラベルが付けられています (CHR ではラベルは省略可能です)。
% X leq Y は、変数 X が変数 Y 以下であることを意味します。 反射律 @ X leq X <=> true。 反対称性@ X leq Y、Y leq X <=> X = Y。 推移性@ X leq Y、Y leq Z ==> X leq Z。 冪等性 @ X leq Y \ X leq Y <=> true。 これらの規則は2通りの解釈が可能である。宣言的な解釈では、3つの規則が部分順序の公理を規定している。
これら3つのルールはすべて暗黙的に全称量化されています(大文字の識別子はProlog構文では変数です)。冪等性ルールは論理的には同義反復ですが、プログラムの2回目の解釈においては意味を持ちます。
上記を解釈する2つ目の方法は、制約ストア、つまりオブジェクトに関する事実(制約)の集合を維持するためのコンピュータプログラムとして捉えることです。制約ストアはこのプログラムの一部ではなく、別途提供する必要があります。ルールは、以下の計算ルールを表しています。
クエリが与えられた場合
A ≤ B、B ≤ C、C ≤ A
次のような変化が生じる可能性があります。
推移律により が追加されます。A leq C次に、反対称律を適用することで、A leq CとC leq Aが削除され、 に置き換えられますA = C。これで、反対称律は元のクエリの最初の 2 つの制約に適用できるようになります。これで、すべての CHR 制約が削除されたため、これ以上のルールは適用できず、答えA = B, A = Cが返されます。CHR は、3 つの変数すべてが同じオブジェクトを参照する必要があることを正しく推論しました。
特定の制約ストアに対してどのルールを「発火」させるかを決定するために、CHR の実装では何らかのパターンマッチングアルゴリズムを使用する必要があります。候補となるアルゴリズムにはRETEやTREAT [ 12 ]がありますが、ほとんどの実装ではLEAPSと呼ばれる遅延アルゴリズムを使用しています[ 13 ]。
CHRのセマンティクスの元の仕様は完全に非決定論的でしたが、Duckらによるいわゆる「洗練された操作セマンティクス」によって非決定論性の多くが取り除かれ、アプリケーション開発者はプログラムのパフォーマンスと正確性のために実行順序に頼ることができるようになりました。[ 5 ] [ 14 ]
CHRのほとんどのアプリケーションでは、書き換えプロセスが合流的である必要があります。そうでない場合、満足のいく割り当てを探す結果は非決定論的で予測不可能になります。合流性を確立するには、通常、次の3つの特性を使用します。[ 2 ]