为什么Z3 / HORN无法解决xor?

时间:2013-07-05 17:38:27

标签: z3

虽然我们讨论horn clauses的主题,但我一直试图找出μZ的功能和局限性。我在用户定义的排序中教授Z3 xor理论,但它无法有效地应用规则,导致unknown用于任何有趣的查询。配对,我得到了这个令人惊讶地返回unknown的例子:

(set-logic HORN)
(declare-fun p (Bool Bool Bool) Bool)

; Test if Z3 can discover two a1+b1+c1 by canceling ra, rb, and rc
(assert (exists ((a1 Bool) (b1 Bool) (c1 Bool) (ra Bool) (rb Bool) (rc Bool))
                (and (p a1 b1 c1)
                 (xor (xor a1 (xor ra rc))
                      (xor b1 (xor rb ra))
                      (xor c1 (xor rc rb))))))

; Assert the adversary can not derive the secret, a+b+c.
(assert (exists ((a1 Bool) (b1 Bool) (c1 Bool))
            (and (p a1 b1 c1) (xor a1 (xor b1 c1)))))
(check-sat)

即使使用未解释的sat,我还没想到p?我注意到链接的问题包括一个未解释的函数inv,但由Z3处理。我是否应该从PDR文件中推断出这一短缺,或者是否有其他出版物能够阐明Z3 PDR的当前状态?

编辑:我猜这个结果是由于存在量化的使用。如果是这种情况,并且考虑到我的问题需要存在,是否有合理的替代公式?

1 个答案:

答案 0 :(得分:3)

问题是基准测试注释为“HORN”,但公式​​不适合属于受支持的HORN片段。 如果删除

(set-logic HORN) 

行,然后Z3通过应用默认策略来应答。 使用(set-logic HORN)行,Z3仅使用 HORN策略。

如果公式不属于受支持的片段,则放弃。 Horn子句支持的片段假定断言是普遍量化的 (forall量化)。断言也应该是Horn条款(含义),这样 暗示的头部要么是未解释的谓词,要么是没有任何公式 未解释的谓词。暗示的主体(暗示的左侧) 是公式的组合,它们是未解释的谓词的出现 或者没有未解释的谓词的某个公式。 喇叭条款也可以是由未解释的应用组成的原子公式 谓语。 预处理器确实识别出一些不直接制定的公式 作为含义,但实验更容易符合纯粹的Horn条款。

以下是Horn条款的一些示例:

 (forall ((a Bool) (b Bool)) (=> (xor a b) (p a b)))

 (forall ((a Bool) (b Bool)) (=> (and (xor a b) (p a b)) false))

 (p true false)