我正在使用一个简单的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构造完全等同于替换每个新构造 参数通过在目标表达式中的表达式来消除 新符号完全(...)
我猜这是一个“浅”的替代品吗?
答案 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表达式。