z3py 有时会挂在 Solver.check() 它可以解决的公式上

z3py sometimes hangs on Solver.check() on formulas that it can solve

在我的用例中,我尝试使用求解器一个接一个地求解多个公式。有时,求解器会挂在某个公式上,但当我尝试 运行 再次使用相同的公式时,它会立即成功。 下面是一个最小的示例,其中我 运行 对同一个公式多次求解,尝试几次后它无限期地挂起。

from z3 import *

def test_solve():
    s, s1, s2 = Strings('s s1 s2')
    i, t = Ints('i t')
    sl = Solver()
    start = datetime.now()
    sl.add(Not(Implies(And(i < t,
                           Contains(s, s1),
                           Not(SuffixOf(s1, s)),
                           Or(0 < i, PrefixOf(s1, s))),
                       Or(PrefixOf(s2, s), PrefixOf(s1, s)))))
    print(f"{attempt}: {sl.check()}. Solved in {datetime.now() - start}")

for attempt in range(20):
    test_solve()

这是它的输出:

0: sat. Solved in 0:00:00.504905
1: sat. Solved in 0:00:01.313257
2: sat. Solved in 0:00:00.543546
3: sat. Solved in 0:00:00.137668
4: sat. Solved in 0:00:00.268307
5: sat. Solved in 0:00:00.189427

它在第 6 次尝试时挂起。这是预期的行为吗?我能做些什么来缓解这种情况吗?

不,我会说这是预期的。确实有“随机”种子等在发挥作用,这会影响每个 运行 的表现;但是你看到的差异(我可以复制)太多了,无法将其归因于随机种子。您使用的字符串求解器存在问题,我认为这是一个很好的测试用例,可以向开发人员报告,这样他们就可以看一看,看看他们是否能发现为什么存在如此大的差异。请将其提交至:https://github.com/Z3prover/z3/issues