2

MiniZinc で文字列連結演算子を使用して制約を定義し、変数aと を解決しようとしましたb

include "disjunctive.mzn";

var string:a;
var string:b;
constraint("var1/var2" = (a ++ "/" ++ b));

solve satisfy;
output ["\nx=", show(a)];

それにもかかわらず、これは構文エラーのようです:

MiniZinc: type error: type error in operator application for `++'. No matching operator found with left-hand side type `string' and right-hand side type `var string'

文字列または配列を変数として使用して MiniZinc の制約を解決することはまだ可能ですか?

4

1 に答える 1

5

文字列に対する直接の制約は、制約プログラミング コミュニティでは非常にまれです。これにはいくつかの研究がありますが、文字列変数をサポートする一般的な CP システムは見たことがありません。(非一般的な CP システムについては、以下を参照してください。)

MiniZinc では、文字列を整数 (たとえば、a=1、b=2 など) に変換してから、すべての演算を整数演算としてシミュレートすることをお勧めします。

簡単な例の 1 つはクロスワード ジェネレーターです: http://hakank.org/minizinc/crossword3/crossword3.mznで、これについてはhttp://hakank.org/minizinc/crossword3/で説明されています。

重要な文字列操作の 1 つは 2 つの文字列の連結ですが、MiniZinc は静的 (固定長) 配列のみをサポートするため、これは十分な大きさの「ターゲット配列」を定義して処理する必要があります。

Picat に関しては、cp/sat モジュールも文字列をサポートしていないため、整数への同じ変換を適用する必要があります。しかし、Picat はロジック プログラミング言語 (Prolog を考えてください) であるため、従来のロジック プログラミング アプローチを使用できます。

MiniZinc と Picat は、他のほとんどの CP システムと同様に、DFA (決定論的有限オートマトン) を使用して制約を作成するグローバル制約 "regular" をサポートしていることに注意してください。たとえば、ノノグラム ソルバーを参照してください: http://hakank.org/minizinc/nonogram_create_automaton2.mznおよびグローバルな隣接制約の分解: http://hakank.org/minizinc/contiguity_regular.mzn

MiniZinc は、通常の制約の NFA (非決定論的) バリアントもサポートしています。

そうは言っても、文字列変数をサポートする一種の制約解決アプローチを使用するシステムがありますが、知る限りでは、整数やセットなどの一般的なレパートリーではなく、文字列変数のみをサポートする傾向があります。たとえば、Hampi ( http://people. csail.mit.edu/akiezun/hampi/ )。注: これらの専用システムを調べてからかなり時間が経ちました。

于 2015-07-01T05:56:50.783 に答える