制約処理

MINERVAは、制約処理のための先進の機能を持つと共に、あなた自身のユーザー定義制約処理を加えることができます。

制約処理は、例えば以下のような難しい管理問題ために非常に強い力を発揮します: 資源配分、スケジューリング、計画。

MINERVAは、制約処理のために2つの述語を定義します:

        co_add(+Var, +Constraint)
        co_get(+Var, -Constraint)
The programmer is has to supply two user defined predicates:
        co_merge(+Var, +ConstraintList)
        co_check(+Term, +Constraint)

co_add(+Var, +Constraint)
制約を変数にまたは制約変数に加えます。 "Constraint"は、変数以外のいかなる項でありえます。

"Var"が変数であるならば、それは制約変数になります。

"Var"が制約変数であるならば、制約は追加の制約としてマークされます、そして、ユーザー定義述語co_merge(+Var,[NewConstraint,OldConstraint])は起動されます。

"Var"が変数でないならば、ユーザー定義述語co_check(+Var, NewConstraint)は起動されます。

co_get(+Var, -Constraint)
co_get(+Var、-Constraint)は、制約変数と関連する現在の制約を復帰します。 "Var"が制約変数でないならば、述語は失敗します。

co_merge(+Var, +ConstraintList)
制約変数が単一化されるとき、それらの付随する制約も単一化されなければなりません。 これは、co_merge/2のジョブです。 個々の制約のリストは新しい制約に結合されなければなりません。そして、新しい制約はそれからco_add/2で再び制約変数と関連することができます。 個々の制約が矛盾を引き起こすならば、述語は失敗します。

co_merge/2が起動される前に、関連する制約変数は普通の変数に変えられます。 co_add/2の以下の呼び出しの後でのみ、そして、もちろんバックトラックの場合だけでのみそれは、再び制約変数になります。

co_check(+Term, +Constraint)
制約変数が値を与えられるとき、すなわち、変数でない項に連結される時に、ユーザー定義述語co_check/2は起動されます。 この結合が与えられた制約"Constraint"の下で許される場合のみ、co_check/2は成功しなければならなりません。

例題

例題は、例題プログラムのセクションを参照して下さい。

規格

これらの述語は、ISO-Prolog Standardの要件ではありません。


co_add/2
co_get/2
co_merge/2
co_check/2

戻る 続く..