(这是我第二次尝试获得帮助。如果问题/方法没有意义或不清楚,请告诉我。我也会对任何小提示或参考感到高兴,这可以帮助我理解Z3与我的SBA的行为)
我正在使用UFBV Z3逻辑进行关系规范的有限验证。我正在研究的当前问题需要伪造所有可能的模型(因为对可达性谓词的否定使用),这会使求解器性能在更高的范围内消失。
因为只有一部分可能的模型确实很有趣(不与其他模型同构),所以我试图引入对称性破解技术(在SAT领域中已知)。
然而,在某些情况下使用我称之为对称性破坏公理可以改善Z3的性能,但是求解器的一般行为变得不稳定。
我的一种方法(我认为最有希望的方法),基于打破关系的对称性w.r.t.他们的域名。它引入了关系R的每个域D和D个公理中的每个原子a \,它对R ^ {M}和R ^ {M [a + 1 / a]}的二进制表示强制执行,其中M是规范的模型。对于同质关系,公理是放松的。
设R'子集AxA为关系。 R的轻松对称破坏公理看起来像这样:
;; SBA(R, A)_upToDiag
(assert
(forall ( (ai A) (aj A) )
(=>
(bvult ai aj)
(=>
(forall ((x A))
(=>
(bvult x aj)
(= (R ai x) (R (bvadd ai (_ bv1 n)) x))
)
)
(=>
(R ai aj)
(R (bvadd ai (_ bv1 n)) aj)
)))))
;; SBA(R, A)_diag
(assert
(forall ( (ai A) )
(=>
(forall ((x A))
(=>
(bvult x ai)
(= (R ai x) (R (bvadd ai (_ bv1 n)) x))
)
)
(=>
(R ai ai)
(R (bvadd ai (_ bv1 n)) (bvadd ai (_ bv1 n)))
))))
我的问题是,使用这种SBA的效果不稳定/一致。它不同于绑定和形式规范与另一个。使用全部或仅一个SBA也会影响性能。
在SAT环境中,所谓的对称破坏谓词(SBP)方法的成功基于SAT求解器的回溯能力,它(以某种方式)保证,如果求解器回溯,它将修剪搜索空间使用(其中包括)SBP。
此致
Aboubakr Achraf El Ghazi
答案 0 :(得分:4)
在Z3 3.2中,有两个主要的引擎用于处理量化公式:E匹配和MBQI(基于模型的量词实例化)。电子匹配仅在不可满足的公式中有效。 Z3将无法使用此引擎显示公式是否可满足。 MBQI更昂贵,但它可以表明几类公式(包含量词)是可以满足的。 Z3 guide描述了这两个引擎(以及其他选项)。要在非常重要的问题上有效地使用Z3,了解这两个引擎的工作方式非常有用。
对称性破坏通常是减少搜索空间的非常有效的方法。很难确切地指出问题中究竟发生了什么。我可以看到以下关于非稳定行为的解释:
MBQI很难创建满足SBA的模型。尽管SBA修剪了搜索空间,但如果问题是可以满足的,Z3将尝试构建满足它们的解释(模型)。因此,在这种情况下,SBA只是开销。如果输入公式很容易满足,但在添加SBA时变得很难,则尤其如此。您可以使用选项MBQI_TRACE=true
来确认此假设。 Z3将显示以下消息:[mbqi] failed k!18
。其中k![line-number]
是量词ID。您可以使用标记:qid
指定自己的ID。这是一个例子:
(断言(forall((x T)(y T))(!(=>(和(子类型x y)) (子类型y x)) (= x y)) :qid反对称)))
顺便说一下,您可以使用MBQI=false
禁用MBQI模块。
在Z3的未来版本中,我们计划为某些量化公式添加一个禁用MBQI的选项。此功能可能对SBA有用。
QI_PROFILE=true
确认。 Z3将转储信息,如:[quantifier_instances]反对称性:12:1:2.00
第一个数字是生成的实例数。如果这是问题的根源,一种解决方案是为生成太多实例的SBA分配限制性模式。例如,Z3将使用(R ai aj)
作为SBA(R, A)_upToDiag
的模式。这种模式可以创建二次数的实例。另一个实验包括禁用电子匹配。例如,选项
AUTO_CONFIG=false EMATCHING=false MBQI=true
您也可以尝试在上面的配置中禁用相关性传播,选项:RELEVANCY=0
。
最后,另一种选择是生成您认为有用的SBA实例,并删除量化的公式。