Z3或Z3Py中的假设

时间:2016-03-23 09:17:55

标签: z3 z3py satisfiability sat

有没有办法在Z3中表达假设(我正在使用Z3Py库),这样引擎不会检查它们的有效性,而是将它们作为基础理论,就像在定理证明中一样?

例如,假设我有两个带有Real类型参数的一元函数。我想告诉Z3引擎,对于所有输入值,f1(t)等于f2(t)。

在Z3Py中编码,看起来如下所示:
t =真实(" t")
assume1 = ForAll(t,f1(t)= f2(t))。

所提出的代码的问题是我的断言集非常大,我使用量词(我试图证明实时系统的可满足性)。如果我将上述断言添加到其他断言的集合中,则检查过程不会终止。

2 个答案:

答案 0 :(得分:2)

  

有没有办法在Z3中表达假设(我正在使用Z3Py库),这样引擎不会检查它们的有效性,而是将它们作为基础理论,就像在定理证明中一样?

实际上,您添加到Z3的所有断言都被视为您所谓的假设。 Z3检查断言的可满足性,它不检查有效性。要检查公式F的有效性,请断言(而不是F),并检查(不是F)的可满足性。如果(不是F)不饱和,则F有效。如果你有背景公理,你基本上检查Background =>的有效性。 F,这样你就可以检查背景和背景的可满足性。 (不是F)。

Z3是否终止查询取决于您使用的理论和量词的组合。您的查询组合的功能越多,它就越难。 对于纯线性算术或多项式实数算法的公式, 这些在SMT-LIB分类中称为LRA,LIA和NRA(见smtlib.org)Z3使用最近添加的专门决策程序。

答案 1 :(得分:1)

是的,这可能就像你描述的那样,但你最终会得到量词,这当然意味着你正在解决一个更难的问题而且Z3会表现得不同(它是'你最终可能会使用完全不同的求解器,甚至不能分享很多源代码。

对于给出的特定示例,可以廉价地消除量词,因为它具有函数定义的形式(ForAll x。f(x)= ...),即我们可以只替换所有用右手边出现f然后量词很容易满足。在Z3中,这是由宏取景器完成的,它可以作为一种策略应用(名称为#34;宏观取景器"),或者如果你使用" smt"策略(隐式通过其他人或直接),然后你可以设置smt.macro_finder = true。