在Z3和Unsat核心案例中建模约束

时间:2015-02-17 09:33:02

标签: c# z3 smt

我正在使用Z3求解器并在C#中实现。我在他们的.Net API(http://z3.codeplex.com/SourceControl/latest#examples/dotnet/Program.cs)的描述中使用了Microsoft提供的示例。在这个例子中,我试图用我自己的模型替换函数“UnsatCoreAndProofExample”中的模型:

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());

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

Status result = solver.Check();

我期待的结果是在Unsat Code中返回Constraint1和Constraint4。我知道返回Unsatcore的设置是正确的,因为当我运行原始的“UnsatCoreAndProofExample”函数时,返回不满的Core。但是当我只是将模型更改为上面的模型时虽然结果是Unsat但没有返回Unsatcore。 所以我的问题是,是不是因为我正在编写模型的方式,还是我正在制造另一个错误?

1 个答案:

答案 0 :(得分:1)

基础设施确实存在一个错误,因此很难正确使用AssertAndTrack。现在,这已在不稳定分支中修复(修复为here)。我还在使用AssertAndTrack获取核心的.NET和Java示例中添加了另一个示例。