Z3Py 求解器在 Jupyter 中产生不同的结果

Z3Py solver producing different results in Jupyter

我正在通过 here 提供的 Jupyter 笔记本学习如何使用 Z3Py,从 guide.ipynb 开始。 运行在布尔逻辑部分包含以下示例代码时,我注意到有些奇怪。

p = Bool('p')
q = Bool('q')
r = Bool('r')
solve(Implies(p, q), r == Not(q), Or(Not(p), r))

我第一次在 Jupyter notebook 中 运行 生成结果 [p = False, q = True, r = False]。但是,如果我再次 运行 这段代码(或在 Jupyter 之外),我反而会得到结果 [q = False, p = False, r = True]

我是不是做错了什么得到这些不同的结果?还有,笔记本上没说,到底哪个解是正确的?

如果您获取两个获得的结果,即对布尔变量的赋值,您将看到每个赋值集都满足您的约束。因此,两个结果都是正确的。

您在不同 platforms/environments 上获得不同结果的事实可能很奇怪,但可以解释为:SMT 求解器通常在求解过程中使用启发式算法,这些通常是随机的,不同的环境可能会产生不同的随机数种子。

底线:一切都很好:-)