def what_sorts_used_explicitly_or_at_leaves( prog: L4Contract) -> Iterable[Sort]: def f(t: Term): if isinstance(t, Literal): if isinstance(t, IntLit): if t.lit == 0: yield "{0}" elif t.lit == 1: yield "{1}" elif t.lit > 0: yield "PosInt" else: yield "Int" elif isinstance(t, FloatLit): if t.lit == 0: yield "{0}" elif t.lit == 1: yield "{1}" elif 0 < t.lit < 1: yield "Fraction(0,1)" elif t.lit > 1: yield "PosReal" else: yield "Real" elif isinstance(t, BoolLit): yield "Bool" elif isinstance(t, SimpleTimeDeltaLit): if t.num > 0: yield "PosTimeDelta" else: yield "TimeDelta" elif isinstance(t, TimeDeltaLit): if t.lit.total_seconds() > 0: yield "PosTimeDelta" else: yield "TimeDelta" elif isinstance(t, RoleIdLit): yield "RoleId" elif isinstance(t, StringLit): yield "String" elif isinstance(t, SortLit): yield t.lit elif isinstance(t, DateTimeLit): return "DateTime" else: raise NotImplementedError(str(t) + "," + str(type(t))) elif isinstance(t, (LocalVar, StateVar)): yield t.vardec.sort elif isinstance(t, ActionBoundActionParam): yield t.action.param_sorts_by_name[t.name] elif isinstance(t, ContractParam): yield t.paramdec.sort elif isinstance(t, RuleBoundActionParam): action = prog.action(t.action_id) yield action.param_sort(t.ind) return prog.forEachTerm(f)
def what_sorts_used_explicitly(prog: L4Contract) -> Iterable[Sort]: def f(t: Term): if isinstance(t, SortLit): yield t.lit elif isinstance(t, (LocalVar, StateVar)): yield t.vardec.sort elif isinstance(t, ActionBoundActionParam): yield t.action.param_sorts_by_name[t.name] elif isinstance(t, ContractParam): yield t.paramdec.sort elif isinstance(t, RuleBoundActionParam): assert isinstance(t.action_id, str), type(t.action_id) action = prog.action(t.action_id) yield action.param_sort(t.ind) return prog.forEachTerm(f)
def what_fnsymbols_used(prog: L4Contract) -> Iterable[str]: def f(t: Term): if isinstance(t, FnApp): yield t.fnsymb_name return prog.forEachTerm(f)