使用Z3和c#获得不饱和核心示例



我正试图在C#实现中使用Z3-sat求解器。此代码与Microsoft在"http://z3.codeplex.com/SourceControl/latest#examples/dotnet/Program.cs".我的代码是:

using (Context ctx = new Context(new Dictionary<string, string>() { { "proof", "true" } }))
{
...
Expr x = ctx.MkConst("x", ctx.MkIntSort());
Expr y = ctx.MkConst("y", ctx.MkIntSort());
Expr zero = ctx.MkNumeral(0, ctx.MkIntSort());
Expr one = ctx.MkNumeral(1, ctx.MkIntSort());
Expr five = ctx.MkNumeral(5, ctx.MkIntSort());
Solver s = ctx.MkSolver();
s.Assert(ctx.MkGt((ArithExpr)x, (ArithExpr)zero)); // x > 0
s.Assert(ctx.MkLt((ArithExpr)y, (ArithExpr)five)); // y < 5
s.Assert(ctx.MkLt((ArithExpr)x, (ArithExpr)zero)); // x < 0
s.Assert(ctx.MkEq((ArithExpr)y, ctx.MkAdd((ArithExpr)x, (ArithExpr)one))); // y = x + 1
 Status result = s.Check();
 if (result == Status.UNSATISFIABLE)
 {
     Console.WriteLine("unsat");
     Console.WriteLine("proof: {0}", s.Proof);
     Console.WriteLine("core: ");
     foreach (Expr c in s.UnsatCore)
     {
         Console.WriteLine("{0}", c);
     }
 }

但当我到达这个模型的"s.UnsatureCore"时,它仍然是空的。

我还试图输入这样的断言:

BoolExpr constraint1 = ctx.MkBoolConst("Constraint1");
s.AssertAndTrack(ctx.MkGt((ArithExpr)x, (ArithExpr)zero), constraint1);
BoolExpr constraint2 = ctx.MkBoolConst("Constraint2");
s.AssertAndTrack(ctx.MkLt((ArithExpr)y, (ArithExpr)five), constraint2);
BoolExpr constraint3 = ctx.MkBoolConst("Constraint3");
s.AssertAndTrack(ctx.MkLt((ArithExpr)x, (ArithExpr)zero), constraint3);
BoolExpr constraint4 = ctx.MkBoolConst("Constraint4");
s.AssertAndTrack(ctx.MkEq((ArithExpr)y, ctx.MkAdd((ArithExpr)x, (ArithExpr)one)), constraint4);

我希望UnsatureCore返回"constraint1,constrain3"。有人能帮我做错事吗?

在创建ctx时是否启用了证明生成(Solver.UnsubsatCore的文档指出,如果禁用,则结果为空)?您需要将Dictionary("proof->"true")传递给Context的构造函数才能执行此操作。

相关内容

  • 没有找到相关文章

最新更新