0

我想知道是否有任何方法可以将 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 是否有任何方法可以自然地实现这一目标?

4

1 回答 1

0

z3 C++/Java API 中没有任何东西可以做到这一点。但是,如果您使用 C++ 或 Java 进行编程,只需编写一个生成此表达式的函数。你是说你已经有一个z3::expr_vector; 相反,您应该编写一个带有相关部分(即变量名和大小)的函数,然后构造这个最终表达式;即,使用 z3 AST 进行常规编程。

于 2022-02-15T15:55:38.883 回答