在 Z3Py 中,我需要使用标准语法检查某事是否是一个术语term := const | var | f(t1,...,tn)
)。我已经编写了以下函数来确定这一点,但是我检查 n 元函数的方法似乎不是很理想。
有更好的方法吗?这些实用功能is_term
, is_atom
,is_literal
等将很有用包含在 Z3 中。我会把它们放在贡献部分
CONNECTIVE_OPS = [Z3_OP_NOT,Z3_OP_AND,Z3_OP_OR,Z3_OP_IMPLIES,Z3_OP_IFF,Z3_OP_ITE]
REL_OPS = [Z3_OP_EQ,Z3_OP_LE,Z3_OP_LT,Z3_OP_GE,Z3_OP_GT]
def is_term(a):
"""
term := const | var | f(t1,...,tn)
"""
if is_const(a):
return True
else:
r = (is_app(a) and \
a.decl().kind() not in CONNECTIVE_OPS + REL_OPS and \
all(is_term(c) for c in a.children()))
return r