我从模板中生成问题,由于问题的性质,我不得不依赖量词。现在,求解器只能找到真正简单(可满足)问题的实例。在许多情况下,找到'不满'是有效的。找'sat'很少有效。
问题在于,即使是简单的事情,比如两个不相交的集合的定义,也必须用一些非常讨厌的公式来表达:
(assert (! (disjoint_1 B A) :named a2 ))
(assert (! ; axiom for "disjoint_1"
(forall ((A Rel1)(B Rel1)) (=
(disjoint_1 A B)
(forall ((a0 Atom)) (not (and (in_1 a0 A) (in_1 a0 B))))))
:named ax8))
为了找到一个实例,Z3必须找到函数in_1
的解释。所有其他功能都依赖于它。
到目前为止,我已经听到以下与我的问题有关的陈述:
我无法在网络或文献中找到有关如何实现或避免此问题的任何有用信息。所以我的问题仍然存在:
如何有效地找到满足公式的实例(使用Z3)? 如何使用模式(如果有的话)实现这一目标?
答案 0 :(得分:4)
Z3 4.x使用两个主要引擎来处理量词:EMatching和MBQI(基于模型的量化实例化)。 EMatching引擎仅对不可满足的实例有效。也就是说,它永远无法证明公式(包含量词)是可满足的。另一方面,MBQI可以做到这一点。实际上,它可以决定许多有用的片段。 Z3 guide(Quantifiers部分)描述了其中的一些片段。话虽这么说,Z3没有一阶逻辑的有限模型查找器(如Paradox)。这是一个有用的功能,我们可能会在将来包含它。您的消息中的示例可以使用Z3解决。你可以尝试here。
关于模式,它们是EMatching引擎的“提示”。由于EMatching引擎无法显示问题是否可以满足,因此它们无法提供帮助。对于可满足的实例,我们可以添加模式,因为我们不希望EMatching引擎通过生成太多实例来妨碍MBQI引擎;或者我们希望通过断言量词的简单实例来急切地修剪搜索空间。我们还可以使用选项(set-option :ematching false)
禁用EMatching引擎。
(declare-sort Rel1)
(declare-sort Atom)
(declare-fun disjoint_1 (Rel1 Rel1) Bool)
(declare-fun in_1 (Atom Rel1) Bool)
(declare-const A Rel1)
(declare-const B Rel1)
(assert (! (disjoint_1 B A) :named a2 ))
(assert (! ; axiom for "disjoint_1"
(forall ((A Rel1)(B Rel1)) (=
(disjoint_1 A B)
(forall ((a0 Atom)) (not (and (in_1 a0 A) (in_1 a0 B))))))
:named ax8))
(check-sat)
(get-model)