QF_AUFBV の問題を解決するために、Z3-3.2 の c-api (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_decl を反復処理し、get_symbol_string を比較してその配列に適したものを見つけようとすることで、目的の情報を取得することができました。そのため、情報は Z3 のどこかで入手できるようですが、それは優れた解決策とは言えません。
これについて助けてくれてありがとう。
よろしく、フロリアン