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