z3生成权力集模型 - 不明白

时间:2017-12-18 18:56:58

标签: logic z3 smt quantifiers

我致力于证明可满足性和审查FOL理论的模型。我试图理解为什么有时z3需要太长时间来构建一个模型,当我在前面的一组断言中添加一个看似无害的断言时,很快找到了一个模型。我创造了一个我不理解的小例子,这可能会说明我遇到这个问题的原因。第一次声明:

(declare-const x Int)
(declare-fun q (Int Int Int) Bool) 
(declare-fun p (Int Int Int) Bool)

主要断言是

(forall ((a Int) (b Int) (c Int)) 
   (=> (p a b c) (and (q a x c) (q b x c) (q c y c))))

为此,我得到一个人的模型,而p和q总是假的。没关系。

如果我添加

(p x x x)

我希望模型包含它和一两个q元组。它确实如此,但它还包括第二个人和模型:

(define-fun p ((x!0 Int) (x!1 Int) (x!2 Int)) Bool
    true)
(define-fun q ((x!0 Int) (x!1 Int) (x!2 Int)) Bool
    true)

评估模型我得到每个p和q的8(3 ^ 2)个元组。虽然我不希望z3获得最小的模型,但我很惊讶这个模型是在最小模型只有两个元组时创建的,并且因为没有它我就不会得到这个模型,即使它仍然是有效的。

人们可以通过排除大多数可能性来证明该模型的要求远远超过要求:

(forall ((a Int) (b Int) (c Int))
   (and (=> (p a b c) (and (= a x) (= b x) (= c x)))
        (=> (q a b c) (and (= a x) (= c x) (or (= b y) (= b x))))))

这给了我一个只有这些

的模型
(p x x x) 
(q x y x) 
(q x x x) 

作为模型中唯一的元组,或者等同于x和y

(= x y)

模型将两个q元组减少为一个。

有人可以解释一下发生了什么,也许还有如何避免它?

我的假设是,这种爆炸更普遍地发生,这就是为什么坐和模型发现从快速到太慢等待(一两秒 - >超过几小时)我和# 39; m与全套工作,至少有25个人。

0 个答案:

没有答案