包含量词的公式包含trans
函数的声明。 Z3成功找到模型并打印出来。但它也会打印trans!1!4464
,trans!7!4463
等函数的模型,这些函数不会在模型中的任何位置使用。它是什么?如何禁用此输出?
以下是查询:http://dl.dropbox.com/u/444947/asyn_arbiter_bound_16.smt2 这是Z3的输出 - http://dl.dropbox.com/u/444947/asyn_arbiter_bound_16_result.txt
答案 0 :(得分:1)
回想一下,Z3返回的模型可以看作是简单的功能程序。
您的公式位于UFBV片段中。 Z3使用几个模块来决定这个片段。每个模块将公式F
转换为“更简单”公式F'
,并生成将F'
的模型转换为F
模型的过程。我们将这些程序称为“模型转换器”。例如,模型转换器将消除F
到F'
转换中引入的辅助函数和常量的解释。一些辅助定义似乎无法用于解释其他定义。我们应该将它们视为“辅助功能”。它们还为已经消除的符号创建了解释。
在您的示例中,会发生以下情况:最后一个模块生成包含trans!...
和k!...
符号的模型。此模型适用于甚至不包含trans
的公式。函数trans
已被删除。当我们应用模型转换器时,trans
的解释是基于对所有trans!...
的解释构建的。此时,trans!...
和k!...
符号仍在使用,因为trans
的解释引用了所有trans!...
符号以及对trans!...
的解释函数引用了k!...
函数符号。在此步骤中,模型中没有不必要的符号。但是,在稍后的步骤中,通过展开trans
和trans!...
的定义,可以简化k!...
的解释。因此,在此简化步骤之后,trans!...
和k!...
基本上是“死代码”。
话虽这么说,Z3返回的模型是正确的,也就是说,它是你公式的模型。我承认这些额外的符号很烦人且不必要。为了消除它们,我们应用了相当于“死代码”消除步骤。我们非常接近下一个版本。因此,此功能将不会在下一个版本中提供,但我将在下一个版本之后添加它。