在Z3Py中,我需要使用標準語法term := const | var | f(t1,...,tn)
來檢查某些術語是否是一個術語。我寫了下面的函數來確定,但我的方法來檢查是否n元函數似乎不是最佳。檢查一個公式是否是Z3Py中的一個術語
有沒有更好的方法來做到這一點?這些效用函數is_term
,is_atom
,is_literal
等將被包括在Z3中是有用的。我會把它們在contrib部分
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