我致力于证明可满足性和审查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个人。