存在量词的Z3.NETAPI
我试图使用Z3.NETAPI来获取存在量词expr。 以下是我的代码:存在量词的Z3.NETAPI,.net,z3,quantifiers,.net,Z3,Quantifiers,我试图使用Z3.NETAPI来获取存在量词expr。 以下是我的代码: RealExpr c = ctx.MkRealConst("c"); BoolExpr Eqzero = ctx.MkGt(c,ctx.MkReal(0)); BoolExpr Gezero = ctx.MkGe(c,ctx.MkReal(0)); BoolExpr Lttwo = ctx.MkLt(c,ctx.MkReal(2)); BoolExpr Gtthree = ctx.MkGt(c,ctx.MkReal(
RealExpr c = ctx.MkRealConst("c");
BoolExpr Eqzero = ctx.MkGt(c,ctx.MkReal(0));
BoolExpr Gezero = ctx.MkGe(c,ctx.MkReal(0));
BoolExpr Lttwo = ctx.MkLt(c,ctx.MkReal(2));
BoolExpr Gtthree = ctx.MkGt(c,ctx.MkReal(3));
BoolExpr b1 = ctx.MkBoolConst("b1");
BoolExpr b2 = ctx.MkBoolConst("b2");
BoolExpr b3 = ctx.MkBoolConst("b3");
BoolExpr b0 = ctx.MkBoolConst("b0");
RealExpr[] lamb=new RealExpr[1];
lamb[0]=ctx.MkRealConst("lamb");
BoolExpr temp=ctx.MkAnd(
ctx.MkGt(lamb[0],ctx.MkReal(0)),
ctx.MkEq(b0,ctx.MkTrue()),
ctx.MkEq(b1,ctx.MkTrue()),
ctx.MkGe(ctx.MkAdd(c,lamb[0]),ctx.MkReal(0)),
ctx.MkLe(ctx.MkAdd(c,lamb[0]),ctx.MkReal(3)),
ctx.MkGe(c,ctx.MkReal(0)),
ctx.MkLe(c,ctx.MkReal(3))
);
BoolExpr exist = ctx.MkExists(lamb, temp, 1, null, null, ctx.MkSymbol("Q2"), ctx.MkSymbol("skid2"));
Console.WriteLine(exist.ToString());
Solver s1 = ctx.MkSolver();
s1.Assert(exist);
if (s1.Check() == Status.SATISFIABLE)
{
Console.WriteLine("get pre");
Console.Write(s1);
}
else
{
Console.WriteLine("Not reach");
}
Console.ReadKey();
"
对于该计划,我得到了以下结果:
(exists ((lamb Real))
(! (and (> lamb 0.0)
(= b0 true)
(= b1 true)
(>= (+ c lamb) 0.0)
(<= (+ c lamb) 3.0)
(>= c 0.0)
(<= c 3.0))
:skid skid2
:qid Q2))
Not reach
(存在((lamb Real))
(!(和(>羊肉0.0)
(=b0真)
(=b1真)
(>=(+c lamb)0.0)
(=c0.0)
((!…)函数的含义是将模式、量词和Skolem ID绑定到表达式的注释
BoolExpr exist = ctx.MkExists(lamb, temp, 1, null, null, ctx.MkSymbol("Q2"), ctx.MkSymbol("skid2"));
改为
BoolExpr exist = ctx.MkExists(lamb, temp, 1);
那么输出中就没有(!…)
我无法复制UNSAT结果:当我使用Z3 4.0运行此示例时,我得到了SAT和以下模型:
(define-fun lamb!0 () Real 1.0)
(define-fun c () Real 1.0)
(define-fun b1 () Bool true)
(define-fun b0 () Bool true)
谢谢你的回复。我已经试着将选项Auto-config设置为false。现在它可以工作了。