Используйте ==
, а не =
. То есть z == x + y
. И тогда вам, конечно, придется применить тактику:
#include<z3++.h>
#include<iostream>
using namespace std;
using namespace z3;
int main()
{ context c;
tactic t = tactic(c, "bit-blast");
expr x = c.bv_const("x", 16);
expr y = c.bv_const("y", 16);
expr z = c.bv_const("z", 16);
goal g(c);
g.add(z == x + y);
apply_result r = t(g);
std::cout << r << endl;
return 0;
}
Это печатает убитую битой цель; это довольно долго, поэтому я не буду здесь это вставлять.
Если вы хотите извлечь фактическое выражение, вам нужно немного больше программировать. (Между прочим: вам действительно нужно сначала изучить API https://z3prover.github.io/api/html/z3_09_09_8h_source.html.)
Вот пример (я меняю исходное выражение, чтобы вывод был достаточно маленьким, чтобы его можно было понять.):
#include<z3++.h>
#include<iostream>
using namespace std;
using namespace z3;
int main()
{ context c;
tactic t = tactic(c, "bit-blast");
expr x = c.bv_const("x", 2);
expr y = c.bv_const("y", 2);
goal g(c);
g.add(y == ~x);
apply_result r = t(g);
if(r.size() > 0)
{
expr res = r[0].as_expr();
cout << res << endl;
}
else
{
cout << "tactic failed" << endl;
}
return 0;
}
Это печатает:
$ c++ a.cpp -lz3; ./a.out
(and (not (= k!0 k!2)) (not (= k!1 k!3)))
И да, вы получите k!0
и т. Д. В качестве индексов, которые вам будет довольно сложно соотнести с вашими x
и y
; но это неизбежно: бит-бластер представит новые переменные, а в API есть все кусочки, чтобы восстановить то, что вам нужно: https://z3prover.github.io/api/html/z3_09_09_8h_source.html