等价于 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 可能令人困惑的代码段。
我正在创建一个包含一些节点的树。每个节点都有与之关联的某些属性,例如成本。这个想法是找到成本最低的路径。叶节点已经为它们声明了成本。非叶节点的成本将根据成本最低的子节点来定义。 我正在尝试编写用于定义叶节点成本的断言。
我有 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 可能令人困惑的代码段。