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

Z3能检查递归函数在有界数据结构上的可满足性吗?,z3,Z3,我知道。但是,我想知道我们是否能够在有界数据结构上处理这样的公式。例如,我定义了一个长度最多为两英寸的列表和一个名为last的函数,以返回列表的最后一个元素。但是,当要求检查包含last的公式的可满足性时,Z3不会终止 在Z3中,有没有一种方法可以在有界列表上使用递归函数?(注意,这也与您的另一个问题有关。)我们将此类情况视为项目的一部分。我们正在做的是避免使用量词,而是“展开”递归函数定义:如果我们在公式中看到术语长度(lst),我们通过引入一个新的等式来使用长度定义对其进行扩展:长度(lst

我知道。但是,我想知道我们是否能够在有界数据结构上处理这样的公式。例如,我定义了一个长度最多为两英寸的列表和一个名为
last
的函数,以返回列表的最后一个元素。但是,当要求检查包含
last
的公式的可满足性时,Z3不会终止

在Z3中,有没有一种方法可以在有界列表上使用递归函数?

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

如果您对长度最多为两个的列表感兴趣,则对所有术语进行手动实例化,然后对新列表术语再次进行实例化就足够了,只要添加术语:

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

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

一个非常有趣的特性(与您的问题非常相关)是,对于某些函数(如长度),使用连续展开将为您提供一个完整的决策过程。即,即使您不限制数据结构的大小,您最终也可以得出SAT或UNSAT(对于无量词的情况)


你可以在我们的论文中找到更多的细节,或者我很乐意在这里提供更多。

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


例如,请参阅。

(我应该补充一点,您的“最后一个”函数也属于我们的技术产生完整决策过程的函数类别。)我同意Philippe的观点。顺便说一句,在您的脚本中,您可以使用
define fun
宏工具定义
last
。Z3会自动展开宏。下面的链接包含一个如何展开的示例:@Philippe,您编写的展开递归函数定义的程序是否可供重用?您的程序是否需要SMT-LIB程序作为输入?@reprogrammer如果您愿意,我可以给您git访问权限。我们目前不支持SMT-LIB作为输入格式,但使用Scala的子集。根据您的需要,我们可以做一些工作。您最好通过电子邮件与我联系。