私はQF_AUFBVの問題を解決するためにZ3-3.2のc-api(on Linux)を使用しています。配列式の評価
式が充足可能な場合は、モデルから空き配列変数の値を読みたいと思います。
私は次のコードの線に沿って何かを試してみましたが、私はこれを行う方法の一般的な考えが正しいかどうかを知りたいのです:
void evaluate(Z3_context context, Z3_model model, Z3_ast array)
{
Z3_ast value;
Z3_bool success = Z3_eval(context, model, array, &value);
if (success) {
unsigned num_entries;
if (Z3_is_array_value(context, model, value, &num_entries)) {
Z3_ast indices[num_entries];
Z3_ast values[num_entries];
Z3_ast def;
Z3_get_array_value(context, model, array, num_entries, indices, values, &def);
// do something with indices, values, and def
}
}
}
入力Z3_ast配列は間違いなく自由な配列式であります。 Z3_evalはtrueを返します。したがって、式を正常に評価したようですが、Z3_is_array_valueはfalseを返します。私は、配列式のZ3_evalが成功した結果を配列の値にすると予想していたでしょうが、なぜそうではないのでしょうか?
ところで、私たちは、すべてのmodel_func_declsを繰り返し処理し、get_symbol_stringを比較することによってその配列の正しいものを見つけることによって、望ましい情報を得ることができました。情報はZ3のどこかで利用できるように見えますが、それはすてきな解決策とはみなされません。
ありがとうございました。
敬具は、 フロリアン