Z3或Z3Py中的假设

Z3或Z3Py中的假设,z3,z3py,satisfiability,sat,Z3,Z3py,Satisfiability,Sat,有没有一种方法可以在Z3中表达假设(我使用的是Z3Py库),这样引擎就不会检查它们的有效性,而是将它们作为基础理论,就像在定理证明中一样 例如,假设我有两个参数为Real类型的一元函数。我想告诉Z3引擎,对于所有输入值,f1(t)等于f2(t) 用Z3Py编码,看起来像以下内容: t=实(“t”) 假设1=ForAll(t,f1(t)=f2(t)) 给出的代码的问题是,我的断言集非常大,并且我使用了量词(我试图证明实时系统的可满足性)。如果我将上述断言添加到其他断言集合中,检查过程不会终止。是的

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

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

用Z3Py编码,看起来像以下内容:
t=实(“t”)
假设1=ForAll(t,f1(t)=f2(t))


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

是的,正如您所描述的,这是可能的,但最终将使用量词,这当然意味着您正在解决一个更难的问题,Z3的行为将有所不同(最终可能会使用完全不同的解算器,甚至不共享太多源代码)

对于给定的特定示例,可以廉价地消除量词,因为它具有函数定义的形式(对于所有x.f(x)=…),也就是说,我们可以用右手边替换所有出现的f,然后量词就可以满足了。在Z3中,这是由宏查找器完成的,它可以作为一种策略(名称为“宏查找器”)应用,或者如果您使用的是“smt”策略(隐式地通过其他方或直接),那么您可以设置smt.macro_finder=true

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

事实上,添加到Z3中的所有断言都被视为假设。Z3检查断言的可满足性,但不检查有效性。要检查公式F的有效性,您可以断言(不是F),并检查(不是F)的可满足性。如果(不是F)如果你有背景公理,你本质上是在检查背景的有效性=>F,所以你可以检查背景的可满足性&(不是F)

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