等价于 Z3Py 中的 (assert (= a 10))

Equivalent of (assert (= a 10)) in Z3Py

我正在创建一个包含一些节点的树。每个节点都有与之关联的某些属性,例如成本。这个想法是找到成本最低的路径。叶节点已经为它们声明了成本。非叶节点的成本将根据成本最低的子节点来定义。 我正在尝试编写用于定义叶节点成本的断言。

我有 SMT-LIB 2.0 标准的工作代码。我查看了可用于 Z3 的基于 python 的示例,但找不到解决方案。

注意:我对 Z3 等 SMT 求解器非常陌生。

我知道我们可以使用 SMT-LIB 2.0 标准简单地编写 (assert (= a 10))。 Python,我试过a = IntVal("10")。不知道是不是我需要的

我想使用 Z3Py 编写 (assert (= a 10)) 类似的代码。我们将不胜感激。

在 z3py 中,这将是:

from z3 import *

s = Solver()

a = Int('a')

s.add(a == 10)

print s.check()
print s.model()

打印:

sat
[a = 10]

赋值与相等

当您在 SMTLib 或 Z3py 中编程时,最好将相等视为比较,而不是赋值。当你说:

(assert (= a 10))

在 SMTLib 中,您没有将任何东西分配给 a。您所说的只是 a 的值应该比较等于 10。事实上,表达式 (= a 10) 的类型是 Bool,所以你可以等价地说:

(assert (= true (= a 10)))

这可能是多余的,但它说明了这一点。

混淆当然是"equality comparison"在SMTLib中叫做=,但是在Python中是==;更糟糕的是,= 在 Python 中作为赋值是有意义的;但这并不意味着你想说什么。如果您熟悉函数式编程,可以将 SMTLib/Z3Py 程序视为不同类型变量的集合以及关于它们之间关系的断言。

希望对您有所帮助!提出具体问题总比英文散文好;随意 post 可能令人困惑的代码段。