Z3 C++ API는 expr_vector
개체로부터의 n-ary 분리를 지원하지 않습니다. 이것이 유용한 기능이라는 데 동의하며 다음 Z3 버전에서 추가 할 예정입니다. 다음 코드를 사용하여이 기능을 시뮬레이션 할 수 있습니다. 다음 코드는 expr_vector의 "복사본"을 생성하므로 완벽하지는 않지만 임시 해결 방법으로 사용할 수 있습니다. 앞에서 말했듯이 다음 버전에서는 이러한 종류의 작업에 대한 지원 기능이 내장되어 있으므로 사본을 피할 수 있습니다. 하나 대신 하나의 n 차 하나의 바이너리 disjunctions의 긴 시퀀스를 생성하면 두 번째 질문에 대해서는
는
#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;
}
, 없는 상당한 성능 저하가있다. 내부적으로 Z3은 바이너리 형식과 n- 차원 형식을 매우 효율적으로 변환 할 수 있습니다.
나는 짐작 만하고 있지만 이것은 분명히 Microsoft Research의 [Z3 프로젝트] (http://research.microsoft.com/en-us/um/redmond/projects/z3/)를 참조한 것입니다. –