在给定的时间限制后,Z3中的TryFor不会停止检查

时间:2012-08-12 16:49:29

标签: .net z3

我使用的是Z3的.NET API。当我通过调用实例化解算器时:

Solver s = ctx.MkSolver(ctx.TryFor(ctx.MkTactic("qflia"), TimeLimit));

并为某些型号的语句赋予TimeLimit 60秒(60000毫秒)

s.Check()
60秒后

不返回。对于某些型号,它会在几秒后返回,在我的情况下不会出现问题,但对于某些型号它根本不会返回(我在3天后取消了该过程)。

如何在给定的时间限制后强制Z3停止检查?

1 个答案:

答案 0 :(得分:4)

使用“取消”标志实现TryFor组合子。新策略非常敏感,并且在设置“取消”标志时很快终止。不幸的是,通用策略smt是一个通用解算器的包装器。这个通用解算器响应不是很快。它可以在几个关键位置“丢失”:量词实例化,单纯形等等。qflia策略建立在smt和许多其他策略之上。因为,您正在尝试解决无量词问题。我假设smt策略在Simplex模块内循环。 smt策略中的Simplex模块使用任意精确有理数来实现。因此,对于非平凡的线性实数/整数问题可能非常耗时。

您无法解决此问题。如果你真的需要一个强大的运行时保证,我看到的唯一解决方案是创建一个运行Z3的独立进程,并在需要更多k秒来解决问题时终止它。

话虽这么说,Z3的未来版本将有一个完整的新算术模块。当设置取消标志时,这个新模块(如新策略)将很快终止。