Z3可以检查有界数据结构上递归函数的可满足性吗?

时间:2011-08-16 10:45:45

标签: z3

我知道Z3 cannot check the satisfiability of formulas that contain recursive functions。但是,我想知道Z3是否可以在有界数据结构上处理这样的公式。例如,我在my Z3 program中定义了一个长度最多为2的列表,并在函数中定义了一个名为last的函数,以返回列表的最后一个元素。但是,当要求检查包含last的公式的可满足性时,Z3不会终止。

在Z3中有没有办法在有界列表上使用递归函数?

2 个答案:

答案 0 :(得分:3)

(请注意,这也与您的其他问题有关。)我们将此类案例视为Leon verifier项目的一部分。我们在那里做的是避免使用量词,而是“展开”递归函数定义:如果我们在公式中看到术语长度(lst),我们通过引入一个新的相等来使用length的定义来扩展它:length( lst)= if(isNil(lst))0 else 1 + length(tail(lst))。您可以将其视为手动量化实例化过程。

如果您对最多两个长度的列表感兴趣,对所有术语进行手动实例化,那么只要您添加术语,就可以再次为新列表术语执行此操作:

isCons(lst)=> ((isCons(tail(lst))=> isNil(tail(tail(lst))))

每个列表

。在实践中,你当然不希望手动产生这些平等和含义;在我们的例子中,我们编写了一个程序,它本质上是围绕Z3的循环,在需要时添加更多这样的公理。

一个非常有趣的属性(与你的问题非常相关)是,对于某些函数(例如长度),使用连续的取消将为您提供完整的决策程序。 IE浏览器。即使您不限制数据结构的大小,您最终也能够得出SAT或UNSAT(对于无量词的情况)。

您可以在我们的论文Satisfiability Modulo Recursive Programs中找到更多详情,或者我很乐意在此提供更多信息。

答案 1 :(得分:2)

你可能对EUL Reeber关于SULFA的工作感兴趣,“ACL2中的”不可滚动列表公式的子类“。他在博士论文中展示了如何通过展开函数来证明一大类面向列表的公式定义和应用基于SAT的方法。他使用这些方法证明了SULFA类的可判定性。

请参阅,例如http://www.cs.utexas.edu/~reeber/IJCAR-2006.pdf