Я использую простое выражение 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))
)
Я посмотрел документацию здесь , и неясно, действительно ли запрещено, чтобы привязки ссылались на другие (ранее определенные) привязки:
Вся конструкция let полностью эквивалентна замене каждого нового параметра его выражениемв целевом выражении, полностью исключая новые символы (...)
Я полагаю, это "мелкая" замена?