Bernie-Schonfinkel公式究竟是什么类型的?

时间:2013-03-23 21:25:53

标签: logic z3 smt

我有一个简单的命题。我想声明严格排序的整数列表中的第一个元素是列表中所有元素的最小值。我定义排序列表的方法是定义一个局部不变量,每个元素都小于它的下一个元素。我在Z3中按照以下方式制定了我的命题 -


(set-option :mbqi true)
(set-option :model-compact true)

(declare-fun S (Int) Bool)
(declare-fun preceeds (Int Int) Bool)
(declare-fun occurs-before (Int Int) Bool)

;; preceeds is anti-reflexive
(assert (forall ((x Int)) (=> (S x) (not (preceeds x x)))))

;; preceeds is monotonic
(assert (forall ((x Int) (y Int)) (=> (and (S x) (and (S y) (and (preceeds x y))))
                                       (not (preceeds y x)))))
;; preceeds is a function
(assert (forall ((x Int) (y Int) (z Int)) (=> (and (S x) (and (S y) (and (S z) (and (preceeds x y)
                                             (preceeds x z)))))
                                             (= y z))))
;; preceeds induces local order
(assert (forall ((x Int) (y Int)) (=> (and (S x) (and (S y) (preceeds x y)))
                                       (< x y))))

;; preceeds implies occurs-before
(assert (forall ((x Int) (y Int)) (=> (and (and (S x) (S y)) (preceeds x y))
                                             (occurs-before x y))))

;;occurs-before is transitivie
(assert (forall ((x Int)(y Int)(z Int))
  (=> (and (S x) (and (S y) (and (S z)(and (occurs-before x y) (occurs-before y z)))))
    (occurs-before x z))
))             

(declare-const h Int)
(assert (S h))
(assert (forall ((x Int)) (=> (S x) (occurs-before h x))))
(assert (forall ((y Int)) (=> (S y) (< h y))))
(check-sat)
(get-model)                                                            

首先,我想确切地知道什么类型的公式是有效的命题。我的断言可以被归类为有效命题吗? 其次,我上面的表述是否正确? 第三,我应该在Z3中设置哪些选项,使其只有在有效命题的情况下才接受量化公式?

1 个答案:

答案 0 :(得分:3)

我们说当一个公式只包含谓词,常数,通用量词,并且不使用理论(例如算术)时,它就在有效命题片段中。通常会找到替代定义,表明公式具有Exists* Forall*量词前缀并且仅使用谓词。这些定义是等价的,因为可以使用新的未解释的常数消除存在量词。有关详细信息,请参阅here

你的断言不在有效的命题片段中,因为你使用算术。 Z3可以决定其他片段。 Z3 tutorial有一个可由Z3决定的片段列表。 你的断言不在列出的任何片段中,但Z3应该能够毫无问题地处理它们和其他类似的断言。

关于断言的正确性,不能满足以下两个断言。

(assert (S h))
(assert (forall ((y Int)) (=> (S y) (< h y))))

如果我们使用h实例化量词,我们可以推导出(< h h),这是假的。 我明白你要做什么。您还可以考虑以下简单编码(可能过于简单)。它也可以在线here

;; Encode a 'list' as a "mapping" from position to value
(declare-fun list (Int) Int)

;; Asserting that the list is sorted
(assert (forall ((i Int) (j Int)) (=> (<= i j) (<= (list i) (list j)))))

;; Now, we prove that for every i >= 0 the element at position 0 is less than equal to element at position i
;; That is, we show that the negation is unsatisfiable with the previous assertion
(assert (not (forall ((i Int)) (=> (>= i 0) (<= (list 0) (list i))))))

(check-sat)

最后,Z3没有任何命令行来检查公式是否在有效命题片段中。