我想知道是否有任何方法可以将 smtlib2 公式表示为模板。例如:
(declare-fun b () (_ BitVec 16))
(declare-fun a () (_ BitVec 8))
(declare-fun c () (_ BitVec 32))
(assert (= c (bvor ((_ zero_extend 24) a) ((_ zero_extend 16) b))))
可以表示为(比如使用 jinja2 样式的模板)
((declare-fun {{B_VAR}} () (_ BitVec {{B_VAR_SIZE}}))
(declare-fun {{A_VAR}} () (_ BitVec {{A_VAR_SIZE}}))
(declare-fun {{C_VAR}} () (_ BitVec {{C_VAR_SIZE}}))
(assert (= {{C_VAR}} (bvor ((_ zero_extend 24) {{A_VAR}}) ((_ zero_extend {{B_VAR_SIZE}}) {{B_VAR}}))))
然后可以渲染模板来表示一个实际的 smtlib 公式:
(declare-fun P () (_ BitVec 16))
(declare-fun Q () (_ BitVec 8))
(declare-fun R () (_ BitVec 32))
(assert (= R (bvor ((_ zero_extend 24) Q) ((_ zero_extend 16) P))))
除了使用 jinja2 之类的东西并为每个公式创建我自己的模板之外,还有什么自然的方法可以做到这一点?
或者,考虑到我已经有一个代表 SMT 公式的 z3::expr_vector,有没有办法“模板化”它?我的最终目标是我想为每个调用“调用”具有唯一位向量名称的模板化版本。z3 C++ API 是否有任何方法可以自然地实现这一目标?