from typing import Callable, List, Dict, Set

def hello_world() -> str: ...

class LTLFormula:
    name: str
    arguments: List[LTLFormula]
    def __init__(self, name: str, *args: LTLFormula) -> None: ...
    @staticmethod
    def parse(formula: str) -> LTLFormula: ...
    def __eq__(self, value: object, /) -> bool: ...
    def __str__(self) -> str: ...
    def __hash__(self) -> int: ...

class CTLFormula:
    name: str
    arguments: List[CTLFormula]
    def __init__(self, name: str, *args: CTLFormula) -> None: ...
    @staticmethod
    def parse(formula: str) -> CTLFormula: ...
    def __eq__(self, value: object, /) -> bool: ...
    def __str__(self) -> str: ...
    def __hash__(self) -> int: ...

class State:
    name: str
    variables: Set[str]
    def __init__(self, name: str, variables: Set[str]): ...
    def contains(self, var: str) -> bool: ...

class Model:
    def __init__(self, states: List[State], edges: Dict[str, list[str]]) -> None: ...
    def get_state(self, which: str) -> State: ...
    def get_states(self) -> List[State]: ...
    def all(self) -> Set[str]: ...
    def all_containing(self, var: str) -> Set[str]: ...
    def all_except(self, names: Set[str]) -> set[str]: ...
    def pre_e(self, names: Set[str]) -> set[str]: ...
    def pre_a(self, names: Set[str]) -> set[str]: ...
    def get_next(self, name: str) -> Set[str]: ...

# fmt: off
class CTLChecker:
    def __init__(self, model: Model) -> None: ...
    def check(self, formula: CTLFormula, debug: bool = False) -> Set[str]: ...
    def is_modified(self) -> bool: ...
    def get_model(self) -> Model: ...
    def set_custom(
        self,
        target: str,
        func: Callable[[Set[str], Model], set[str]] | Callable[[set[str], set[str], Model], set[str]],
    ) -> None: ...
