z3

时间:2017-05-10 13:24:20

标签: z3

我目前正在尝试使用Z3为带有集合的无类型语言编码一个简单的程序逻辑。

我的符号执行引擎需要证明以下公式的有效性:
enter image description here

为此,我们要求Z3检查以下方面的可满足性: enter image description here

然后我们将其编码为以下SMT-LIB公式:

(define-sort Set () (Array Real Bool))

(define-fun singleton ((x Real)) Set
    (store 
       ((as const (Array Real Bool)) false)
       x
       true))

(define-fun set-union ((x Set) (y Set)) Set
    ((_ map (or (Bool Bool) Bool)) x y)) 


(declare-const head Real)
(declare-const tail Set)
(declare-const result Set)
(declare-const value Real)

(assert (forall ((x Real)) (=> (select tail x) (> x head))))
(assert (> head value))
(assert
   (forall ((result Set))
       (let ((phi1 
                (forall ((x Real)) (=> (select result x) (> x value))))
             (phi2
                (= result (union (singleton head) tail))))
          (not (and phi1 phi2)))))
(check-sat)

当给出此公式时,求解器立即输出未知。 我的猜测是问题在于量化绑定到集合的变量。 为了检查这一点,我简化了上面的公式,得到:
enter image description here 然后我们将其编码为以下SMT-LIB公式:

(define-sort Set () (Array Real Bool))

(define-fun singleton ((x Real)) Set
   (store 
      ((as const (Array Real Bool)) false)
       x
      true))

(define-fun set-union ((x Set) (y Set)) Set
     ((_ map (or (Bool Bool) Bool)) x y)) 


(declare-const head Real)
(declare-const tail Set)
(declare-const result Set)
(declare-const value Real)

(assert (forall ((x Real))(=> (select tail x) (> x head))))
(assert (> head value))

(assert
  (not 
     (forall ((x Real)) 
        (=> (select (union (singleton head) tail) x) 
            (not (<= x value))))))

 (check-sat)

给定此公式时,求解器立即输出 的不饱和度即可。 这证实了我的猜测,问题在于量化 在绑定到集合的变量上。 我的问题是Z3是否支持包含的公式 集合量化。而且,如果是这样,我做错了什么?

1 个答案:

答案 0 :(得分:0)

对于SMT求解器来说,量词推理总是很难,在这种情况下,你有嵌套的量词。听到Z3在第一种情况下简单地说“未知”,我并不感到惊讶。另请注意,您正在量化什么是基本上是一个函数(您实现的集合实际上是函数),这使得它更加困难。但即使你量化了更简单的东西,嵌套量词也不会轻易放电。

你有没有尝试过将你的配方化,将其置于正常状态,并摆脱存在感?这可能会让你更进一步,虽然你可能需要提出适当的实例化模式。