from collections.abc import Callable

import z3

type Term0 = Callable[[], z3.ExprRef]
type Term1 = Callable[[z3.ExprRef], z3.ExprRef]
type Term2 = Callable[[z3.ExprRef, z3.ExprRef], z3.ExprRef]
type AnyTerm = Term0 | Term1 | Term2

type Formula0 = Callable[[], z3.BoolRef]
type Formula1 = Callable[[z3.ExprRef], z3.BoolRef]
type Formula2 = Callable[[z3.ExprRef, z3.ExprRef], z3.BoolRef]
type Formula3 = Callable[[z3.ExprRef, z3.ExprRef, z3.ExprRef], z3.BoolRef]
type AnyFormula = Formula0 | Formula1 | Formula2 | Formula3
