Пример #1
0
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)
Пример #2
0
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)
Пример #3
0
def what_fnsymbols_used(prog: L4Contract) -> Iterable[str]:
    def f(t: Term):
        if isinstance(t, FnApp):
            yield t.fnsymb_name

    return prog.forEachTerm(f)