Z3模式和注入性

时间:2012-12-14 13:29:22

标签: z3 smt

在Z3教程的第13.2.3节中,有一个很好的例子,说明在处理注入的公理化时如何减少必须实例化的模式数量。在该示例中,必须以单数形式表示的函数f将类型A的对象作为输入并返回类型B的对象。据我所知,排序A和B是分离的。

我有一个SMT问题(FOL + EUF)Z3似乎没有终止,我试图找出原因。我有一个函数f:A-> A我认为是单射的。问题可能是f的域和codomain重合吗?

提前感谢任何建议。

1 个答案:

答案 0 :(得分:6)

Z3没有终止,因为它一直在尝试为问题构建解释。 包含注入性公理的可满足问题通常对Z3来说很难。 它们通常属于Z3无法解决的一类问题 Z3 guide描述了Z3可以决定的大多数类。 此外,Z3可以为无限域生成模型,例如整数和实数。但是,在大多数情况下,Z3生成的函数具有有限范围。例如,通过将forall x, y: x <= y implies f(x) <= f(y)分配给具有有限范围的函数,可以满足量词f。更多信息可以在this article中找到。不幸的是,注入性通常需要一个与域一样“大”的范围。而且,很容易写出只能被无限宇宙所满足的公理。例如,公式

(assert
   (forall ((d1 Value)(d2 Value)(d3 Value)(d4 Value))
      (! (=>
         (and (= (ENC d1 d2) (ENC d3 d4)))
         (and (= d1 d3) (= d2 d4))
      )
      :pattern ((ENC d1 d2) (ENC d3 d4)))
   )
)
只有当Value的宇宙有一个元素或无限时,才能满足

。 另一个问题是将函数f的注入性公理与forall x: f(x) != a形式的公理结合起来。如果fAA的函数,则只有在A具有无限宇宙时才能满足公式。

话虽这么说,我们可以通过减少Z3模型查找器用于量化公式的“资源”量来防止非终止。选项

(set-option :auto-config false)
(set-option :mbqi-max-iterations 10)

如果我们使用这些选项,Z3将在您的示例中终止,但会返回unknown。它还返回一个“候选”模型。它不是真正的模型,因为它不能满足问题中的所有通用量词。选项

(set-option :mbqi-trace true)

将指示Z3显示哪些量词不满意。

关于第13.2.3节中的示例,该函数可以使用相同的输入和返回类型。使用本节中描述的技巧只会帮助不满意的实例。如果你使用这个技巧重新编码注入公理,Z3也不会终止(对于可满足的公式)。

请注意,您引用的教程非常陈旧,并且包含过时的信息。