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