Z3 API:是否可以对AST进行检查

Z3 API:是否可以对AST进行检查,api,z3,abstract-syntax-tree,Api,Z3,Abstract Syntax Tree,在Z3中没有直接的方法来遍历一个已经存在的表达式,从API中我似乎很清楚这一点。然而,有没有一种间接的方法,例如,拆分一个连词,用一个词替换一个Z3_ast中的一个词,例如通过Z3_parse_smtlib2_string获得,或者作为通过Z3_get_interplant获得的插入词(这些是从Z3输出的,因此能够检查它们是有意义的)。但是,只有当AST是一个函数应用程序(一个应用程序,必要时通过cast进行转换)时,这才有效。其他AST类型可能没有要遍历的参数(例如变量和数字,请参见)。示例中

在Z3中没有直接的方法来遍历一个已经存在的表达式,从API中我似乎很清楚这一点。然而,有没有一种间接的方法,例如,拆分一个连词,用一个词替换一个
Z3_ast
中的一个词,例如通过
Z3_parse_smtlib2_string
获得,或者作为通过
Z3_get_interplant
获得的插入词(这些是从Z3输出的,因此能够检查它们是有意义的)。但是,只有当AST是一个函数应用程序(一个应用程序,必要时通过cast进行转换)时,这才有效。其他AST类型可能没有要遍历的参数(例如变量和数字,请参见)。

示例中包含访问者模式。例如,在examples/c++下,您将找到名为“visit”的函数。void visit(expr const&e){if(e.is_app()){unsigned num=e.num_args();for(unsigned i=0;ieq
lt
+
)?我想这是有意义的。然后我想变量和类似的东西可以通过
get\u symbol
(获取名称)和
get\u sort
(为了得到排序),对吗?@NikolajBjorner:我完全错过了一些例子。谢谢你没有,但是你提到的那些都是函数应用程序。其他包括数字、排序声明、函数声明、绑定(量化)变量和量化表达式(它们有一个主体,但没有参数),请参阅Z3_ast_kind。例如,我对如何获取
VAR_ast
的符号感到困惑。VAR_ast是de brujin索引的绑定变量,因此它们主要有一个索引。要获取变量的名称,您需要相应的量词_ast,它保存了一个名称列表,可以通过访问。