0
使用Z3
求解器的c# API
,我想結合bitvectors和普通的布爾變量。爲了做到這一點,我試圖表達矢量元素和布爾值之間的等價:混合位向量和簡單的布爾變量
Context ctx = new Context();
BitVecSort bvs = ctx.MkBitVecSort(729);
BitVecNum bvTrue = ctx.MkBV(1, 1); // single-bit vector true
BitVecExpr x = (BitVecExpr)ctx.MkConst("x", bvs);
BitVecExpr y = (BitVecExpr)ctx.MkConst("y", bvs);
BoolExpr eq = ctx.MkEq(x, y);
BoolExpr bx = ctx.MkBoolConst("bx");
BoolExpr by = ctx.MkBoolConst("by");
Solver s = ctx.MkSolver("QF_BV");
BitVecExpr exx = ctx.MkExtract(0, 0, x);
BoolExpr x1 = ctx.MkEq(exx, bvTrue);
BoolExpr bx0 = ctx.MkEq(bx, x1);
BitVecExpr exy = ctx.MkExtract(0, 0, y);
BoolExpr y1 = ctx.MkEq(exy, bvTrue);
BoolExpr by0 = ctx.MkEq(by, y1);
s.Assert(by);
s.Assert(bx0);
s.Assert(by0);
s.Assert(eq);
Status res = s.Check();
Console.WriteLine("bx " + s.Model.Eval(bx));
Console.WriteLine("by " + s.Model.Eval(by));
一個similar question有人提出了SMT
模型。
將bitvector元素與布爾變量相關聯,而不是通過Context.MkExtract
和Context.MkEq
來更容易或更有效嗎?