可以禁用中间模型的输出吗?

时间:2012-03-09 13:49:58

标签: z3

包含量词的公式包含trans函数的声明。 Z3成功找到模型并打印出来。但它也会打印trans!1!4464trans!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

1 个答案:

答案 0 :(得分:1)

回想一下,Z3返回的模型可以看作是简单的功能程序。 您的公式位于UFBV片段中。 Z3使用几个模块来决定这个片段。每个模块将公式F转换为“更简单”公式F',并生成将F'的模型转换为F模型的过程。我们将这些程序称为“模型转换器”。例如,模型转换器将消除FF'转换中引入的辅助函数和常量的解释。一些辅助定义似乎无法用于解释其他定义。我们应该将它们视为“辅助功能”。它们还为已经消除的符号创建了解释。

在您的示例中,会发生以下情况:最后一个模块生成包含trans!...k!...符号的模型。此模型适用于甚至不包含trans的公式。函数trans已被删除。当我们应用模型转换器时,trans的解释是基于对所有trans!...的解释构建的。此时,trans!...k!...符号仍在使用,因为trans的解释引用了所有trans!...符号以及对trans!...的解释函数引用了k!...函数符号。在此步骤中,模型中没有不必要的符号。但是,在稍后的步骤中,通过展开transtrans!...的定义,可以简化k!...的解释。因此,在此简化步骤之后,trans!...k!...基本上是“死代码”。

话虽这么说,Z3返回的模型是正确的,也就是说,它是你公式的模型。我承认这些额外的符号很烦人且不必要。为了消除它们,我们应用了相当于“死代码”消除步骤。我们非常接近下一个版本。因此,此功能将不会在下一个版本中提供,但我将在下一个版本之后添加它。