5

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

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

并为某些模型指定 60 秒(60000 毫秒)的 TimeLimit

s.Check()

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

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

4

1 回答 1

4

TryFor组合器是使用“取消”标志实现的。新战术反应迅速,并在设置“取消”标志时很快终止。不幸的是,通用策略smt是通用求解器的封装。这个通用求解器反应不灵敏。它可能会在几个关键地方“丢失”:量词实例化、Simplex 等。该策略建立在和许多其他策略qflia之上。smt因为,您正在尝试解决无量词问题。我假设该smt策略在 Simplex 模块内部的循环中。策略中的 Simplex 模块smt是使用任意精度有理数实现的。因此,对于非平凡的线性实数/整数问题可能非常耗时。

要解决此问题,您无能为力。如果你真的需要一个强有力的运行时间保证,我看到的唯一解决方案是创建一个运行 Z3 的单独进程,并在需要更多k秒来解决问题时将其杀死。

话虽如此,Z3 的未来版本将拥有一个全新的算术模块。当取消标志设置时,这个新模块(如新战术)将迅速终止。

于 2012-08-12T17:16:37.770 回答