擅长:python、mysql、java
<p>功能合理,有几点意见:</p>
<ol>
<li><p>这取决于您在规范中所说的“var”是什么意思。Z3的变量为de Brujin指数。“如果函数中有一个变量,则检查变量”。</p></li>
<li><p>还有另一个布尔连接词Z3\u-OP-XOR。</p></li>
<li><p>还有其他的关系操作,例如比较位向量的操作。
这取决于您的意图和代码的用法,但是您也可以检查
表达式的排序是布尔型的,如果是,请确保头函数符号是
没想到。</p></li>
<li><p>is_const(a)定义为返回is_app(a)和a.num_args()==0。所以is_const实际上是由默认情况处理的。</p></li>
<li><p>作为简化、解析或其他转换的结果,Z3创建的表达式可能有许多共享子表达式。因此,一个直接的递归下降可能需要指数时间的DAG大小的表达式。您可以通过维护已访问节点的哈希表来处理此问题。在Python中,可以使用Z3_get_ast_id来检索表达式的唯一编号,并将其保存在一个集合中。只要术语不是垃圾收集的,标识符是唯一的,因此
你应该把这样一个集合作为局部变量来维护。</p></li>
</ol>
<p>所以,大致如下:</p>
<pre><code> def get_expr_id(e):
return Z3_get_ast_id(e.ctx.ref(), e.ast)
def is_term_aux(a, seen):
if get_expr_id(a) in seen:
return True
else:
seen[get_expr_id(a)] = True
r = (is_app(a) and \
a.decl().kind() not in CONNECTIVE_OPS + REL_OPS and \
all(is_term_aux(c, seen) for c in a.children()))
return r
def is_term(a):
return is_term_aux(a, {})
</code></pre>