【问题标题】:Encoding let-expressions in Z3在 Z3 中编码 let 表达式
【发布时间】:2013-01-18 05:31:36
【问题描述】:

以下代码对包含两个字段array-fldblist-fld 的“记录”进行编码。我已经为这些字段定义了更新函数,然后断言了一个应该为 true 的属性(但 z3 报告为 unknown)。这是Z3 4.0版本,运行z3 -smt2 -in

(declare-datatypes ()
                   ((mystruct (mk-mystruct
                                 (array-fld (Array Int Int))
                                 (blist-fld (List Bool))))))
(define-fun array-fld-upd ((v (Array Int Int)) (obj mystruct)) mystruct
  (mk-mystruct v (blist-fld obj)))
(define-fun blist-fld-upd ((v (List Bool)) (obj mystruct)) mystruct
  (mk-mystruct (array-fld obj) v))

(push)
(assert
 (forall ((z0 mystruct))
         (exists ((array-val (Array Int Int)))
                 (and (= array-val (array-fld z0))
                      (= (select (array-fld
                                  (array-fld-upd (store array-val 2 4) z0)) 3)
                         (select (array-fld z0) 3))))))
(check-sat)

如果我通过替换方程式 array-val 绑定手动展开/消除存在,我得到

(pop)
(assert
 (forall ((z0 mystruct))
         (= (select (array-fld (array-fld-upd (store (array-fld z0) 2 4) z0)) 3)
            (select (array-fld z0) 3))))
(check-sat)

这很高兴解决为sat

我想这里面有四个问题:

  1. 有没有办法调用 z3 来解决第一个实例和第二个实例?
  2. 我应该对我的记录/结构进行不同的编码吗?
  3. 我是否应该以不同的方式编码我的 let 表达式(正是这些导致存在量化)?
  4. 或者,我是否应该直接展开 let 表达式(我可以自己做,但如果有很多引用,它可能会导致大术语)。

【问题讨论】:

    标签: record z3 let


    【解决方案1】:

    从问题看来,您可以使用正确的 let 表达式。 那么Z3会更轻松:

    (declare-datatypes ()
                   ((mystruct (mk-mystruct
                                 (array-fld (Array Int Int))
                                 (blist-fld (List Bool))))))
    (define-fun array-fld-upd ((v (Array Int Int)) (obj mystruct)) mystruct
      (mk-mystruct v (blist-fld obj)))
    (define-fun blist-fld-upd ((v (List Bool)) (obj mystruct)) mystruct
      (mk-mystruct (array-fld obj) v))
    
    (push)
    (assert
     (forall ((z0 mystruct))
        (let ((array-val (array-fld z0)))
                      (= (select (array-fld
                                  (array-fld-upd (store array-val 2 4) z0)) 3)
                         (select (array-fld z0) 3)))))
     (check-sat)
    

    【讨论】:

    • 谢谢!我没有意识到 Z3 let-expressions。
    猜你喜欢
    • 1970-01-01
    • 2012-01-12
    • 2014-01-01
    • 1970-01-01
    • 2019-01-29
    • 2015-07-26
    • 1970-01-01
    • 2018-12-26
    • 1970-01-01
    相关资源
    最近更新 更多