29 lines
784 B
Python
29 lines
784 B
Python
from typing import Iterable, Set, Union
|
|
|
|
models = None
|
|
|
|
DL_ATOMS = "abc"
|
|
|
|
|
|
def set_models(alphabet: Iterable[str], v: Iterable[Iterable[str]]):
|
|
global models, DL_ATOMS
|
|
DL_ATOMS = "".join(alphabet)
|
|
models = tuple(set(model) for model in v)
|
|
|
|
|
|
def propagate(atoms: Set[str]) -> Set[str]:
|
|
atoms = atoms.intersection(DL_ATOMS)
|
|
sup_models = (model for model in models if atoms <= model)
|
|
first: set = next(sup_models, None)
|
|
if first is None:
|
|
return set()
|
|
return first.intersection(*sup_models)
|
|
|
|
|
|
def check(atoms: Set[str]) -> Union[Set[str], None]:
|
|
atoms = atoms.intersection(DL_ATOMS)
|
|
if atoms not in models:
|
|
return None
|
|
sub_models = (model for model in models if model < atoms)
|
|
return atoms - atoms.intersection(*sub_models)
|