我正在创建带有某些节点的树。每个节点都有与其相关的某些属性,例如成本。想法是找到成本最低的路径。叶节点已经为其声明了成本。非叶子节点的成本将根据其子节点以最低的成本进行定义。 我正在尝试写断言来定义叶子节点的成本。
我有SMT-LIB 2.0 Standard中的工作代码。我看过适用于Z3的基于python的示例,但找不到解决方案。
注意:我对S3这样的SMT解算器非常陌生。
我知道我们可以使用SMT-LIB 2.0标准简单地编写(assert (= a 10))
。对于Python,我尝试了a = IntVal("10")
。我不确定这是否是我需要的。
我想使用Z3Py编写(assert (= a 10))
类似的代码。任何帮助将不胜感激。
答案 0 :(得分:2)
在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)))
这是多余的,但它说明了这一点。
当然,混淆是SMTLib中的“平等比较”被称为=
,而在Python中是==
。更糟糕的是,=
在Python中作为赋值是有意义的;但这并不意味着您要说的话。如果您熟悉函数式编程,可以将SMTLib / Z3Py程序视为不同类型的变量的集合以及有关它们之间关系的断言。
希望有帮助!提出具体问题总是比英文散文更好。随时发布可能令人困惑的代码段。