我使用的是Z3的.NET API。当我通过调用实例化解算器时:
Solver s = ctx.MkSolver(ctx.TryFor(ctx.MkTactic("qflia"), TimeLimit));
并为某些型号的语句赋予TimeLimit 60秒(60000毫秒)
s.Check()
60秒后不返回。对于某些型号,它会在几秒后返回,在我的情况下不会出现问题,但对于某些型号它根本不会返回(我在3天后取消了该过程)。
如何在给定的时间限制后强制Z3停止检查?
答案 0 :(得分:4)
使用“取消”标志实现TryFor
组合子。新策略非常敏感,并且在设置“取消”标志时很快终止。不幸的是,通用策略smt
是一个通用解算器的包装器。这个通用解算器响应不是很快。它可以在几个关键位置“丢失”:量词实例化,单纯形等等。qflia
策略建立在smt
和许多其他策略之上。因为,您正在尝试解决无量词问题。我假设smt
策略在Simplex模块内循环。 smt
策略中的Simplex模块使用任意精确有理数来实现。因此,对于非平凡的线性实数/整数问题可能非常耗时。
您无法解决此问题。如果你真的需要一个强大的运行时保证,我看到的唯一解决方案是创建一个运行Z3的独立进程,并在需要更多k
秒来解决问题时终止它。
话虽这么说,Z3的未来版本将有一个完整的新算术模块。当设置取消标志时,这个新模块(如新策略)将很快终止。