混合bitvectors和简单的布尔变量

时间:2014-03-30 13:14:44

标签: c# z3

使用c# API求解器的Z3,我想组合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));

SMT型号筹集了similar question

是否有更简单,也许更有效的方法将bitvector元素与布尔变量相关联,而不是通过Context.MkExtractContext.MkEq

1 个答案:

答案 0 :(得分:1)

我认为就解算器性能而言,这几乎是最有效的方法。在内部,大多数位向量问题都被转换为布尔问题,并且编码中没有任何内容会导致任何不成比例的爆炸。在实现简单性方面,您可以考虑使用命名断言(参见例如here),但我认为这不会大大简化您的示例。