expr_vector
Z3 C ++ APIは、オブジェクトからのn-ary論理和の作成をサポートしていません。これが便利な機能であることに同意します。次のZ3リリースで追加する予定です。次のコードを使用して、この機能をシミュレートできます。次のコードは、expr_vectorの「コピー」を作成するため完全ではありませんが、一時的な回避策として使用できます。上で述べたように、次のバージョンにはこの種の操作のサポートが組み込まれ、コピーは回避されます。
#include<vector>
#include<z3++.h>
using namespace z3;
expr mk_or(expr_vector args) {
std::vector<Z3_ast> array;
for (unsigned i = 0; i < args.size(); i++)
array.push_back(args[i]);
return to_expr(args.ctx(), Z3_mk_or(args.ctx(), array.size(), &(array[0])));
}
int main() {
context c;
expr_vector args(c);
args.push_back(c.bool_const("p"));
args.push_back(c.bool_const("q"));
args.push_back(c.bool_const("r"));
std::cout << mk_or(args) << std::endl;
return 0;
}
2番目の質問に関しては、単一のn-ary分離ではなく、長いシーケンスのバイナリ分離を作成しても、パフォーマンスが大幅に低下することはありません。内部的には、Z3はバイナリ形式とn-ary形式の間で非常に効率的に変換できます。