我们正在尝试用于功能程序验证的关系逻辑。我们的逻辑配备了代数数据类型的关系以及关系中的相等和子集包含谓词。我们的验证程序执行归纳程序分析(结构归纳)并生成具有足够强的归纳假设的验证条件(VC)。我们的验证程序生成的VC遵循以下格式:
bindings <var-type bindings> in <antecedent-predicate> => <consequent-predicate> end
以下是我们的程序生成的示例VC:http://pastebin.com/exncPHDA
我们使用以下规则对以SMT2语言生成的VC进行编码:
上述编码的结果(推测)是有效命题(EPR)一阶逻辑中的公式。在Z3的帮助下,我们能够证明许多VC的有效性(否定的不可靠性)。但是,在某些情况下,当VC无效(否定是SAT)时,Z3循环。上面给出的示例(http://pastebin.com/exncPHDA)就是这样一个VC,其SMT2编码在这里给出:http://pastebin.com/s8ezha7D。在断言这个公式时,Z3似乎没有终止。
鉴于决定量化的布尔公式是NEXPTIME的难度,决策程序的不终止并不是很令人惊讶。尽管如此,我们想知道在Z3中对公式进行编码时是否可以进行任何优化,以便最不可能实现非终止 -
此外,在决定不可满足的量化布尔公式时,Z3循环的可能性有多大?
答案 0 :(得分:1)
在Z3中,我们说的是forall X, f(X) = T[X]
形式的量词,其中X
是变量的向量,f
是未解释的函数,T
是一个术语/不包含f
的公式是宏。 Z3可以通过简单地替换所有出现的f
来消除预处理步骤中的这些量词。选项:macro-finder
启用此功能。
(set-option :macro-finder true)
如果我们应用此预处理步骤,则可以立即解决该示例。 以下是更新后脚本的链接:http://rise4fun.com/Z3/z2UJ
备注:在http://z3.codeplex.com的正在进行中(不稳定)分支中,此选项称为:smt.macro-finder
。