在Z3教程的第13.2.3节中,有一个很好的例子,说明在处理注入的公理化时如何减少必须实例化的模式数量。在该示例中,必须以单数形式表示的函数f将类型A的对象作为输入并返回类型B的对象。据我所知,排序A和B是分离的。
我有一个SMT问题(FOL + EUF)Z3似乎没有终止,我试图找出原因。我有一个函数f:A-> A我认为是单射的。问题可能是f的域和codomain重合吗?
提前感谢任何建议。
答案 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
形式的公理结合起来。如果f
是A
到A
的函数,则只有在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也不会终止(对于可满足的公式)。
请注意,您引用的教程非常陈旧,并且包含过时的信息。