2

ご挨拶、

このアイデアは、例を挙げて説明するのが最適です。

ベクトルがあるとしvec(a:{FD.int 1#100} b:{FD.int 1#100} c:{FD.int 1#100})ます。このベクトルに制約を追加できるようにしたいのですが、追加するすべての制約がそれ以上の情報を追加しなくなるまで、たとえば、制約vec.avec.bありませんvec.c

Mozart / Ozでそれを行うことは可能ですか?

そう考えたいと思います。

ループ内:

  1. 制約ストアにアクセスし、
  2. 変更されているか確認してください
  3. 変更がない場合は終了します。
4

1 に答える 1

2

モジュール内の関数を使用して、有限ドメイン変数の状態を確認できFD.reflectます。このFD.reflect.dom関数は、このコンテキストで特に役立つようです。

レコード内のすべてのフィールドの現在のドメインを取得するには、この関数をレコードにマップします。

declare

fun {GetDomains Vec}
   {Record.map Vec FD.reflect.dom}
end

この例の最初の結果は次のようになります。

vec(a:[1#100] b:[1#100] c:[1#100])

これで、制約を追加する前後のこの関数の結果を比較して、何かが発生するかどうかを確認できます。

2つの制限:

  1. これは、少なくとも1つの変数のドメインを実際に変更する制約でのみ機能します。一部の制約は制約ストアを変更しますが、ドメインは変更しません。たとえば、バインドされていない変数を持つ等式制約などです。
  2. このようにリフレクションを使用すると、同時実行ではうまく機能しません。つまり、複数のスレッドから制約が追加された場合、競合状態が発生します。

GetDomainsループで関数を使用する方法の例が必要な場合は、私に知らせてください...

編集:古いメーリングリストメッセージからのヒントで、私はすべてのタイプの制約で機能するはずのこの一般的な解決策を思いつきました。これは、従属計算スペースで制約を投機的に実行することによって機能します。

declare

Vec = vec(a:{FD.int 1#100} b:{FD.int 1#100} c:{FD.int 1#100})

%% A number of constraints as a list of procedures
Constraints =
[proc {$} Vec.a <: 50 end
 proc {$} Vec.b =: Vec.a end
 proc {$} Vec.b <: 50 end
 proc {$} Vec.a =: Vec.b end
]


%% Tentatively executes a constraint C (represented as a procedure).
%% If it is already entailed by the current constraint store, returns false.
%% Otherwise merges the space (and thereby finally executes the constraint)
%% and returns true.
fun {ExecuteConstraint C}
   %% create a compuation space which tentatively executes C
   S = {Space.new
        proc {$ Root}
           {C}
           Root = unit
        end
       }
in
   %% check whether the computation space is entailed
   case {Space.askVerbose S}
   of succeeded(entailed) then false
   else
      {Wait {Space.merge S}}
      true
   end
end


for C in Constraints I in 1..4 break:Break do
   {System.showInfo "Trying constraint "#I#" ..."}
   if {Not {ExecuteConstraint C}} then
      {System.showInfo "Constraint "#I#" is already entailed. Stopping."}
      {Break}
   end
   {Show Vec}
end

{Show Vec}
于 2011-05-08T18:51:21.413 に答える