【问题标题】:An error appears when running exist quantifier and fixedpoint Z3 in C#在 C# 中运行存在量词和定点 Z3 时出现错误
【发布时间】:2012-06-29 15:46:07
【问题描述】:

我尝试在定点中使用ctx.mkExist,但是出现错误“contains recursive predicate”,不知道为什么?以及如何在定点中使用 ctx.MkExists?例如: 存在(lamda real)那lamb>=0 AND inv(c,i) AND phi(c+lamb,i) => phi(c,i)

        using (Context ctx = new Context())
        {
            var s = ctx.MkFixedpoint();

            IntSort B = ctx.IntSort;
            BoolSort T = ctx.BoolSort;
            RealSort R = ctx.RealSort;

            FuncDecl phi = ctx.MkFuncDecl("phi", new Sort[] { R,B }, T);
            s.RegisterRelation(phi);
            FuncDecl Inv = ctx.MkFuncDecl("inv", new Sort[] { R, B }, T);
            s.RegisterRelation(Inv);

            RealExpr c= (RealExpr)ctx.MkBound(0, R);
            IntExpr i = (IntExpr) ctx.MkBound(1, B);

            Expr[] InvArg=new Expr[2];
            InvArg[0] = ctx.MkConst("inv0" , Inv.Domain[0]);
            InvArg[1] = ctx.MkConst("inv1", Inv.Domain[1]);

            Expr invExpr = ctx.MkImplies(ctx.MkOr(
                 ctx.MkAnd(ctx.MkEq(InvArg[1], ctx.MkInt(0)), ctx.MkGe((RealExpr)InvArg[0], ctx.MkReal(0))),
                 ctx.MkAnd(ctx.MkEq(InvArg[1], ctx.MkInt(1)), ctx.MkGe((RealExpr)InvArg[0], ctx.MkReal(2)))
                 ),
              (BoolExpr)Inv[InvArg]);
            Quantifier invQ = ctx.MkForall(InvArg, invExpr, 1);
            s.AddRule(invQ);

            RealExpr[] lamb = new RealExpr[1];
            lamb[0] = ctx.MkRealConst("lamb");
            Expr existExpr = ctx.MkAnd(
                (BoolExpr)Inv[c,i],
                (BoolExpr)phi[ctx.MkAdd(c,lamb[0]),i],
                ctx.MkGe(lamb[0], ctx.MkReal(0)));
            BoolExpr t= ctx.MkExists(lamb, existExpr, 1);
            s.AddRule(ctx.MkImplies(t,(BoolExpr)phi[c,i]));
        }

有时,会出现错误提示“AccessViolationException 未处理,试图读取或写入受保护的内存。这通常表明其他内存已损坏。”当运行到 ctx.MkExists()

【问题讨论】:

    标签: z3 z3-fixedpoint


    【解决方案1】:

    定点求解器仅支持顶层的通用量词。 你应该重写规则如下:

            s.AddRule(ctx.MkForall(lamb, 
              ctx.MkImplies((BoolExpr)existExpr,(BoolExpr)phi[c,i])));
    

    Z3 理想情况下不应导致任何访问冲突。这通常表明存在错误。 当/如果您遇到此类错误,我将非常感谢他们的重现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-10
      • 2019-08-29
      • 2012-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-11
      相关资源
      最近更新 更多