SMT让表达式绑定范围

时间:2019-05-21 10:05:47

标签: z3 smt

我正在使用一个简单的let表达式来缩短我的SMT公式。我希望绑定使用如下所示的先前定义的绑定,但是如果我删除注释行并让n引用s,则它将不起作用:

;;;;;;;;;;;;;;;;;;;;;
;                   ;
; This is our state ;
;                   ;
;;;;;;;;;;;;;;;;;;;;;
(declare-datatypes ((State 0))
    (((rec
        (myArray String)
        (index   Int))))
)

;;;;;;;;;;;;;;;;;;;;;;;;;;
;                        ;
; This is our function f ;
;                        ;
;;;;;;;;;;;;;;;;;;;;;;;;;;
(define-fun f ((in State)) State
    (let (
          (s   (myArray in))
          (n   (str.len (myArray in))))
;;;;;;;;;;(n   (str.len s)))
     in
         (rec (str.substr s 1 n) 1733))
)

我查看了文档here,目前尚不清楚是否确实禁止绑定引用其他(先前定义的)绑定:

  

整个let构造完全等同于替换每个新构造   参数通过在目标表达式中的表达式来消除   新符号完全(...)

我猜这是一个“浅”的替代品吗?

1 个答案:

答案 0 :(得分:2)

摘自http://smtlib.cs.uiowa.edu/papers/smt-lib-reference-v2.6-r2017-07-18.pdf的3.6.1节:

  

。 let活页夹引入并定义一个或多个局部变量   在平行下。在语义上,形式为(let ((x1 t1) · · · (xn tn)) t)(3.3)的术语等同于术语t[t1/x1, . . . , tn/xn]   通过同时替换每个自由出现的xi从t获得   在t by ti中,对于每个i = 1,。 。 。 ,n,可能在适当的时间之后   重命名t的绑定变量以避免捕获任何变量   t1 ,。 。 。 ,tn。由于具有并行语义,因此变量x1,...。   。 。 ,(3.3)中的xn必须成对区分。

     

备注3 (无顺序   的版本)。该语言没有的顺序版本   让。如(let ((x1 t1)) (let ((x2 t2)) t))中所示,它的效果是通过嵌套let来实现的。

注释3 中所述,如果要引用更早的定义,则必须嵌套let表达式。