diff --git a/README.md b/README.md index 417f8e88..d9ebef52 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ from pddl.parser.problem import ProblemParser from pylogics.parsers import parse_pltl from plan4past.compiler import Compiler -formula = "on_b_a & O(ontable_c)" +formula = '"on b a" & O("ontable c")' domain_parser = DomainParser() problem_parser = ProblemParser() diff --git a/plan4past/__main__.py b/plan4past/__main__.py index 543603c0..c7c12c9c 100644 --- a/plan4past/__main__.py +++ b/plan4past/__main__.py @@ -34,7 +34,6 @@ from pylogics.syntax.base import Formula from plan4past.compiler import Compiler -from plan4past.utils.mapping_parser import mapping_parser DEFAULT_NEW_DOMAIN_FILENAME: str = "new-domain.pddl" DEFAULT_NEW_PROBLEM_FILENAME: str = "new-problem.pddl" @@ -62,13 +61,6 @@ help="The path to the PPLTL goal formula.", type=click.Path(exists=True, readable=True), ) -@click.option( - "-m", - "--mapping", - help="The mapping file.", - type=click.Path(exists=True, readable=True), - default=None, -) @click.option( "-od", "--out-domain", @@ -83,20 +75,14 @@ help="Path to PDDL file to store the new problem.", type=click.Path(dir_okay=False), ) -def cli(domain, problem, goal_inline, goal_file, mapping, out_domain, out_problem): +def cli(domain, problem, goal_inline, goal_file, out_domain, out_problem): """Plan4Past: Planning for Pure-Past Temporally Extended Goals.""" goal = _get_goal(goal_inline, goal_file) in_domain, in_problem, formula = _parse_instance(domain, problem, goal) - var_map = ( - mapping_parser(Path(mapping).read_text(encoding="utf-8"), formula) - if mapping - else None - ) - compiled_domain, compiled_problem = _compile_instance( - in_domain, in_problem, formula, var_map + in_domain, in_problem, formula ) try: @@ -137,9 +123,9 @@ def _parse_instance(in_domain, in_problem, goal) -> Tuple[Domain, Problem, Formu return domain, problem, formula -def _compile_instance(domain, problem, formula, mapping) -> Tuple[Domain, Problem]: +def _compile_instance(domain, problem, formula) -> Tuple[Domain, Problem]: """Compile the PDDL domain and problem files and the PPLTL goal formula.""" - compiler = Compiler(domain, problem, formula, mapping) + compiler = Compiler(domain, problem, formula) compiler.compile() compiled_domain, compiled_problem = compiler.result diff --git a/plan4past/compiler.py b/plan4past/compiler.py index 6fec28b4..e3bef8a8 100644 --- a/plan4past/compiler.py +++ b/plan4past/compiler.py @@ -21,10 +21,9 @@ # """Compiler from PDDL Domain and PPLTL into a new PDDL domain.""" -from typing import AbstractSet, Dict, Optional, Set, Tuple +from typing import AbstractSet, Optional, Set, Tuple from pddl.core import Action, Domain, Problem, Requirements -from pddl.logic import Constant from pddl.logic.base import And, Not from pddl.logic.effects import AndEffect, When from pddl.logic.predicates import DerivedPredicate, Predicate @@ -35,7 +34,6 @@ from plan4past.helpers.utils import ( add_val_prefix, check_, - default_mapping, remove_before_prefix, replace_symbols, ) @@ -54,7 +52,6 @@ def __init__( domain: Domain, problem: Problem, formula: Formula, - from_atoms_to_fluent: Optional[Dict[PLTLAtomic, Predicate]] = None, ) -> None: """ Initialize the compiler. @@ -62,16 +59,10 @@ def __init__( :param domain: the domain :param problem: the problem :param formula: the formula - :param from_atoms_to_fluent: optional mapping from atoms to fluent """ self.domain = domain self.problem = problem self.formula = rewrite(formula) - if from_atoms_to_fluent: - self.from_atoms_to_fluent = from_atoms_to_fluent - self.validate_mapping(domain, formula, from_atoms_to_fluent) - else: - self.from_atoms_to_fluent = default_mapping(self.formula) check_(self.formula.logic == Logic.PLTL, "only PPLTL is supported!") @@ -81,29 +72,6 @@ def __init__( self._derived_predicates: Set[DerivedPredicate] = set() - @classmethod - def validate_mapping( - cls, - _domain: Domain, - _formula: Formula, - from_atoms_to_fluent: Dict[PLTLAtomic, Predicate], - ): - """ - Check that the mapping is valid wrt the problem instance. - - In particular: - - check that all the formula atoms are covered (TODO) - - check that all the atoms are legal wrt the formula - - check that the fluents are legal wrt the domain - - :param _domain: - :param _formula: - :param from_atoms_to_fluent: - :return: - """ - for _atom, fluent in from_atoms_to_fluent.items(): - check_(all(isinstance(t, Constant) for t in fluent.terms)) - @property def result(self) -> Tuple[Domain, Problem]: """Get the result.""" @@ -121,9 +89,7 @@ def compile(self): def _compile_domain(self): """Compute the new domain.""" new_predicates = predicates(self.formula).union(val_predicates(self.formula)) - new_derived_predicates = derived_predicates( - self.formula, self.from_atoms_to_fluent - ) + new_derived_predicates = derived_predicates(self.formula) new_whens = _compute_whens(self.formula) domain_actions = _update_domain_actions_det(self.domain.actions, new_whens) @@ -167,12 +133,13 @@ def _compile_problem(self): def _compute_whens(formula: Formula) -> Set[When]: """Compute conditional effects for formula progression.""" + formula_predicates = predicates(formula) return { When(Predicate(add_val_prefix(remove_before_prefix(p.name))), p) - for p in predicates(formula) + for p in formula_predicates }.union( When(Not(Predicate(add_val_prefix(remove_before_prefix(p.name)))), Not(p)) - for p in predicates(formula) + for p in formula_predicates ) diff --git a/plan4past/helpers/utils.py b/plan4past/helpers/utils.py index a1b47738..a76028f9 100644 --- a/plan4past/helpers/utils.py +++ b/plan4past/helpers/utils.py @@ -21,64 +21,63 @@ # """Miscellanea utilities.""" -from typing import Dict +import re +from typing import Collection, Type from pddl.logic import Predicate, constants -from pylogics.syntax.base import Formula -from pylogics.syntax.pltl import Atomic as PLTLAtomic -from plan4past.utils.atoms_visitor import find_atoms +_PDDL_NAME_REGEX = "[A-Za-z][-_A-Za-z0-9]*" +_GROUND_FLUENT_REGEX = re.compile( + rf"(\"({_PDDL_NAME_REGEX})( {_PDDL_NAME_REGEX})*\")|({_PDDL_NAME_REGEX})" +) +VAL_PREFIX = "VAL__" +_LEFT_PAR = "LPAR__" +_RIGHT_PAR = "__RPAR" +Y_PREFIX = "Y__" +_NOT = "NOT__" +_AND = "__AND__" +_OR = "__OR__" +_QUOTE = "__QUOTE__" def add_val_prefix(name: str): """Add the 'prime' prefix.""" - return "val-" + name.replace('"', "") + return VAL_PREFIX + name.replace('"', _QUOTE) def remove_before_prefix(name: str): """Remove the 'Y' prefix.""" return ( - name.replace("Y-", "") - if name.startswith("Y-") - else name.replace("Y", "", 1) - if name.startswith("Y") + name.replace(Y_PREFIX, "") + if name.startswith(Y_PREFIX) + else re.sub(f"{_RIGHT_PAR}$", "", name.replace("Y" + _LEFT_PAR, "", 1)) + if name.startswith("Y" + _LEFT_PAR) else name ) def remove_val_prefix(name: str): """Remove the 'prime' prefix.""" - return name.replace("val-", "") if name.startswith("val-") else name + return name.replace(VAL_PREFIX, "") if name.startswith(VAL_PREFIX) else name def replace_symbols(name: str): """Stringify symbols.""" return ( - name.replace('"', "") - .replace("(", "") - .replace(")", "") - .replace("&", "and") - .replace("|", "or") - .replace("~", "not-") - .replace("!", "not-") + name.replace('"', _QUOTE) + .replace("(", _LEFT_PAR) + .replace(")", _RIGHT_PAR) + .replace("&", _AND) + .replace("|", _OR) + .replace("~", _NOT) + .replace("!", _NOT) .replace(" ", "-") ) -def default_mapping(formula: Formula) -> Dict[PLTLAtomic, Predicate]: - """Compute mapping from atoms to fluents using underscores.""" - symbols = find_atoms(formula) - from_atoms_to_fluents = {} - for symbol in symbols: - name, *cons = symbol.name.split("_") - if cons: - from_atoms_to_fluents[symbol] = Predicate(name, *constants(" ".join(cons))) - else: - from_atoms_to_fluents[symbol] = Predicate(name) - return from_atoms_to_fluents - - -def check_(condition: bool, message: str = "") -> None: +def check_( + condition: bool, message: str = "", exception_cls: Type[Exception] = AssertionError +) -> None: """ User-defined assert. @@ -87,4 +86,73 @@ def check_(condition: bool, message: str = "") -> None: https://bandit.readthedocs.io/en/1.7.5/plugins/b101_assert_used.html """ if not condition: - raise AssertionError(message) + raise exception_cls(message) + + +def parse_ground_fluent(symbol: str) -> Predicate: + """ + Parse a ground fluent. + + :param symbol: the ground fluent + :return: the predicate + """ + match = _GROUND_FLUENT_REGEX.fullmatch(symbol) + if match is None: + raise ValueError(f"invalid PDDL symbol in formula: {symbol}") + + if '"' in symbol: + tokens = symbol[1:-1].split(" ", 1) + predicate_name, cons = ( + (tokens[0], tokens[1]) if len(tokens) > 1 else (tokens[0], "") + ) + return Predicate(predicate_name, *constants(cons)) + return Predicate(symbol) + + +def _check_does_not_start_with(symbol: str, prefixes: Collection[str]) -> None: + """ + Check if a symbol does not start with a given prefix. + + :param symbol: the symbol + :param prefixes: the prefixes to check + """ + for prefix in prefixes: + check_( + not symbol.startswith(prefix), + f"invalid symbol: symbol '{symbol}' cannot start with {prefix}", + exception_cls=ValueError, + ) + + +def _check_not_in(symbol: str, forbidden_substrings: Collection[str]) -> None: + """ + Check if a string is not in a set of symbols. + + :param symbol: the symbol + :param forbidden_substrings: the set of forbidden substrings + """ + for s in forbidden_substrings: + check_( + s not in symbol, + f"invalid symbol: symbol '{symbol}' contains {s}", + exception_cls=ValueError, + ) + + +def validate(symbol: str) -> None: + """ + Validate a symbol. + + :param symbol: the symbol + """ + # remove the double quotes + symbol_unquoted = symbol.replace('"', "") + + # check if the symbol does not start with the 'val__' or the 'Y__' prefix + _check_does_not_start_with(symbol_unquoted, [VAL_PREFIX, Y_PREFIX]) + + # check if the symbol does not contain forbidden substrings + _check_not_in(symbol_unquoted, [_LEFT_PAR, _RIGHT_PAR, _AND, _OR, _NOT, _QUOTE]) + + # check if the symbol is a valid PDDL ground fluent + parse_ground_fluent(symbol) diff --git a/plan4past/utils/derived_visitor.py b/plan4past/utils/derived_visitor.py index 7988d326..fb213240 100644 --- a/plan4past/utils/derived_visitor.py +++ b/plan4past/utils/derived_visitor.py @@ -22,7 +22,7 @@ """Derived Predicates visitor.""" from functools import singledispatch -from typing import Dict, Set +from typing import Set from pddl.logic.base import And, Not, Or from pddl.logic.predicates import DerivedPredicate, Predicate @@ -39,49 +39,44 @@ ) from pylogics.utils.to_string import to_string -from plan4past.helpers.utils import add_val_prefix, replace_symbols +from plan4past.helpers.utils import ( + Y_PREFIX, + add_val_prefix, + parse_ground_fluent, + replace_symbols, +) @singledispatch -def derived_predicates( - formula: object, atoms_to_fluents: Dict[PLTLAtomic, Predicate] -) -> Set[DerivedPredicate]: +def derived_predicates(formula: object) -> Set[DerivedPredicate]: """Compute the derived predicate for a formula.""" raise NotImplementedError(f"handler not implemented for object {type(formula)}") @derived_predicates.register -def derived_predicates_true( - _formula: PropositionalTrue, _atoms_to_fluents: Dict[PLTLAtomic, Predicate] -) -> Set[DerivedPredicate]: +def derived_predicates_true(_formula: PropositionalTrue) -> Set[DerivedPredicate]: """Compute the derived predicate for a true formula.""" val = Predicate(add_val_prefix("true")) return {DerivedPredicate(val, And())} @derived_predicates.register -def derived_predicates_false( - _formula: PropositionalFalse, _atoms_to_fluents: Dict[PLTLAtomic, Predicate] -) -> Set[DerivedPredicate]: +def derived_predicates_false(_formula: PropositionalFalse) -> Set[DerivedPredicate]: """Compute the derived predicate for a false formula.""" val = Predicate(add_val_prefix("false")) return {DerivedPredicate(val, Or())} @derived_predicates.register -def derived_predicates_atomic( - formula: PLTLAtomic, atoms_to_fluents: Dict[PLTLAtomic, Predicate] -) -> Set[DerivedPredicate]: +def derived_predicates_atomic(formula: PLTLAtomic) -> Set[DerivedPredicate]: """Compute the derived predicate for an atomic formula.""" - val = Predicate(add_val_prefix(formula.name)) - condition = atoms_to_fluents[formula] + val = Predicate(add_val_prefix(replace_symbols(formula.name))) + condition = parse_ground_fluent(formula.name) return {DerivedPredicate(val, condition)} @derived_predicates.register -def derived_predicates_and( - formula: PLTLAnd, atoms_to_fluents: Dict[PLTLAtomic, Predicate] -) -> Set[DerivedPredicate]: +def derived_predicates_and(formula: PLTLAnd) -> Set[DerivedPredicate]: """Compute the derived predicate for a PPLTL And formula.""" formula_name = to_string(formula) val = Predicate(add_val_prefix(replace_symbols(formula_name))) @@ -90,14 +85,12 @@ def derived_predicates_and( for op in formula.operands ] condition = And(*val_ops) - der_pred_ops = [derived_predicates(op, atoms_to_fluents) for op in formula.operands] + der_pred_ops = [derived_predicates(op) for op in formula.operands] return {DerivedPredicate(val, condition)}.union(*der_pred_ops) @derived_predicates.register -def derived_predicates_or( - formula: PLTLOr, atoms_to_fluents: Dict[PLTLAtomic, Predicate] -) -> Set[DerivedPredicate]: +def derived_predicates_or(formula: PLTLOr) -> Set[DerivedPredicate]: """Compute the derived predicate for a PPLTL Or formula.""" formula_name = to_string(formula) val = Predicate(add_val_prefix(replace_symbols(formula_name))) @@ -106,67 +99,59 @@ def derived_predicates_or( for op in formula.operands ] condition = Or(*val_ops) - der_pred_ops = [derived_predicates(op, atoms_to_fluents) for op in formula.operands] + der_pred_ops = [derived_predicates(op) for op in formula.operands] return {DerivedPredicate(val, condition)}.union(*der_pred_ops) @derived_predicates.register -def derived_predicates_not( - formula: PLTLNot, atoms_to_fluents: Dict[PLTLAtomic, Predicate] -) -> Set[DerivedPredicate]: +def derived_predicates_not(formula: PLTLNot) -> Set[DerivedPredicate]: """Compute the derived predicate for a PPLTL Not formula.""" formula_name = to_string(formula) val = Predicate(add_val_prefix(replace_symbols(formula_name))) condition = Not( Predicate(add_val_prefix(replace_symbols(to_string(formula.argument)))) ) - der_pred_arg = derived_predicates(formula.argument, atoms_to_fluents) + der_pred_arg = derived_predicates(formula.argument) return {DerivedPredicate(val, condition)}.union(der_pred_arg) @derived_predicates.register -def derived_predicates_before( - formula: Before, atoms_to_fluents: Dict[PLTLAtomic, Predicate] -) -> Set[DerivedPredicate]: +def derived_predicates_before(formula: Before) -> Set[DerivedPredicate]: """Compute the derived predicate for a Before formula.""" formula_name = to_string(formula) val = Predicate(add_val_prefix(replace_symbols(formula_name))) condition = Predicate(replace_symbols(to_string(formula))) - der_pred_arg = derived_predicates(formula.argument, atoms_to_fluents) + der_pred_arg = derived_predicates(formula.argument) return {DerivedPredicate(val, condition)}.union(der_pred_arg) @derived_predicates.register -def derived_predicates_since( - formula: Since, atoms_to_fluents: Dict[PLTLAtomic, Predicate] -) -> Set[DerivedPredicate]: +def derived_predicates_since(formula: Since) -> Set[DerivedPredicate]: """Compute the derived predicate for a Since formula.""" if len(formula.operands) != 2: head = formula.operands[0] tail = Since(*formula.operands[1:]) - return derived_predicates(Since(head, tail), atoms_to_fluents) + return derived_predicates(Since(head, tail)) formula_name = to_string(formula) val = Predicate(add_val_prefix(replace_symbols(formula_name))) op_or_1 = Predicate(add_val_prefix(replace_symbols(to_string(formula.operands[1])))) op_or_2 = And( Predicate(add_val_prefix(replace_symbols(to_string(formula.operands[0])))), - Predicate(f"Y-{replace_symbols(to_string(formula))}"), + Predicate(f"{Y_PREFIX}{replace_symbols(to_string(formula))}"), ) condition = Or(op_or_1, op_or_2) - der_pred_ops = [derived_predicates(op, atoms_to_fluents) for op in formula.operands] + der_pred_ops = [derived_predicates(op) for op in formula.operands] return {DerivedPredicate(val, condition)}.union(*der_pred_ops) @derived_predicates.register -def derived_predicates_once( - formula: Once, atoms_to_fluents: Dict[PLTLAtomic, Predicate] -) -> Set[DerivedPredicate]: +def derived_predicates_once(formula: Once) -> Set[DerivedPredicate]: """Compute the derived predicate for a Once formula.""" formula_name = to_string(formula) val = Predicate(add_val_prefix(replace_symbols(formula_name))) condition = Or( Predicate(add_val_prefix(replace_symbols(to_string(formula.argument)))), - Predicate(f"Y-{replace_symbols(to_string(formula))}"), + Predicate(f"{Y_PREFIX}{replace_symbols(to_string(formula))}"), ) - der_pred_arg = derived_predicates(formula.argument, atoms_to_fluents) + der_pred_arg = derived_predicates(formula.argument) return {DerivedPredicate(val, condition)}.union(der_pred_arg) diff --git a/plan4past/utils/mapping_parser.py b/plan4past/utils/mapping_parser.py deleted file mode 100644 index f1e9f177..00000000 --- a/plan4past/utils/mapping_parser.py +++ /dev/null @@ -1,186 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright 2021 -- 2023 WhiteMech -# -# ------------------------------ -# -# This file is part of Plan4Past. -# -# Plan4Past is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Plan4Past is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with Plan4Past. If not, see . -# - -"""Mapping parser.""" -import re -from typing import Dict, Optional, Sequence, Set, Tuple - -from pddl.custom_types import name -from pddl.logic import Constant, Predicate, constants -from pylogics.syntax.base import Formula -from pylogics.syntax.pltl import Atomic as PLTLAtomic - -from plan4past.utils.atoms_visitor import find_atoms - - -class MappingParserError(Exception): - """Mapping parser error.""" - - def __init__(self, message: str, *args, row_id: Optional[int] = None) -> None: - """ - Initialize a mapping parser error. - - :param row_id: the row id - """ - self.row_id = row_id - - super().__init__(self._make_message_prefix() + message, *args) - - def _make_message_prefix(self) -> str: - """Make the message prefix.""" - if self.row_id is None: - return "invalid mapping: " - return f"invalid mapping at row {self.row_id}: " - - -SYMBOL_REGEX = re.compile("[a-z_]([a-zA-Z0-9_-]+[a-zA-Z0-9_])|[a-z_][a-zA-Z0-9_]*") -"""The following is a sub-regex of AtomName.REGEX in pylogics.syntax.base.""" - - -def _check_pddl_name(row_id: int, pddl_name: str, what: str) -> None: - """Check that a PDDL name is valid.""" - try: - name(pddl_name) - except ValueError as e: - raise MappingParserError( - f"got an invalid name for {what}: '{pddl_name}'. It must match the regex {name.REGEX}", - row_id=row_id, - ) from e - - -def _parse_constants(row_id: int, constants_str: str) -> Sequence[Constant]: - """ - Parse a string of constants. - - :param row_id: the row id - :param constants_str: the string of constants - :return: the sequence of constants - """ - try: - return constants(constants_str) - except ValueError as e: - raise MappingParserError(f"got an invalid constant: {e}", row_id=row_id) from e - - -def _parse_predicate(row_id: int, predicate_str: str) -> Predicate: - """ - Parse a predicate. - - :param predicate_str: the predicate string - :return: the predicate - """ - predicate_name, cons = predicate_str.split(" ", maxsplit=1) - - _check_pddl_name(row_id, predicate_name, "a predicate") - parsed_constants = _parse_constants(row_id, cons) - return Predicate(predicate_name, *parsed_constants) - - -def _process_row(row_id: int, row_str: str) -> Tuple[str, Predicate]: - """ - Process a row of the mapping file. - - :param row_id: the row id - :param row_str: the row string - :return: the pair (symbol_name, predicate_str) - """ - # check the row is a valid mapping - comma_separated_row_parts = row_str.split(",") - if len(comma_separated_row_parts) != 2: - raise MappingParserError( - "expected a mapping of the form ','", row_id=row_id - ) - - symbol_name, predicate = comma_separated_row_parts - - # strip leading and trailing whitespaces - symbol_name = symbol_name.strip() - predicate_str = predicate.strip() - - if symbol_name == "" or SYMBOL_REGEX.fullmatch(symbol_name) is None: - raise MappingParserError( - "symbol cannot be empty string and must match the regex {SYMBOL_REGEX}", - row_id=row_id, - ) - if predicate_str == "": - raise MappingParserError("predicate cannot be empty string", row_id=row_id) - - predicate = _parse_predicate(row_id, predicate_str) - return symbol_name, predicate - - -def _check_unmapped_symbols( - all_symbol_names: Set[str], mapped_symbol_names: Set[str] -) -> None: - """Check that all symbols are mapped.""" - # check if there are unmapped symbols (exclude 'true' and 'false') - unmapped_symbols = all_symbol_names - {"true", "false"} - mapped_symbol_names - # if some symbols are not mapped, raise an error - if unmapped_symbols: - raise MappingParserError( - f"the following symbols of the formula are not mapped: {unmapped_symbols}" - ) - - -def should_skip_row(row_str: str) -> bool: - """Check if a row should be skipped.""" - # skip empty lines - if row_str.strip() == "": - return True - - # skip comments - if row_str.strip().startswith(";"): - return True - - return False - - -def mapping_parser(text: str, formula: Formula) -> Dict[PLTLAtomic, Predicate]: - """Parse symbols to ground predicates mapping.""" - symbols = find_atoms(formula) - symbols_by_name = {symbol.name: symbol for symbol in symbols} - maps = text.splitlines(keepends=False) - from_atoms_to_fluents = {} - mapped_symbol_names = set() - - for row_id, vmap in enumerate(maps): - if should_skip_row(vmap): - continue - - symbol_name, predicate = _process_row(row_id, vmap) - - if symbol_name not in symbols_by_name: - # don't need to process this row, since the symbol does not occur in the formula - continue - - if symbol_name in mapped_symbol_names: - raise MappingParserError( - f"symbol '{symbol_name}' is mapped multiple times", row_id=row_id - ) - - symbol = symbols_by_name[symbol_name] - mapped_symbol_names.add(symbol_name) - - from_atoms_to_fluents[symbol] = predicate - - _check_unmapped_symbols(set(symbols_by_name.keys()), mapped_symbol_names) - return from_atoms_to_fluents diff --git a/plan4past/utils/predicates_visitor.py b/plan4past/utils/predicates_visitor.py index da81c05b..03ac4a07 100644 --- a/plan4past/utils/predicates_visitor.py +++ b/plan4past/utils/predicates_visitor.py @@ -40,7 +40,7 @@ ) from pylogics.utils.to_string import to_string -from plan4past.helpers.utils import replace_symbols +from plan4past.helpers.utils import Y_PREFIX, replace_symbols def predicates_binaryop(formula: _BinaryOp): @@ -113,7 +113,7 @@ def predicates_since(formula: Since) -> Set[Predicate]: tail = Since(*formula.operands[1:]) return predicates(Since(head, tail)) formula_name = replace_symbols(to_string(formula)) - quoted = Predicate(f"Y-{formula_name}") + quoted = Predicate(f"{Y_PREFIX}{formula_name}") subsinces = predicates_binaryop(formula) return {quoted}.union(subsinces) @@ -122,6 +122,6 @@ def predicates_since(formula: Since) -> Set[Predicate]: def predicates_once(formula: Once) -> Set[Predicate]: """Compute predicate for a Once formula.""" formula_name = replace_symbols(to_string(formula)) - quoted = Predicate(f"Y-{formula_name}") + quoted = Predicate(f"{Y_PREFIX}{formula_name}") sub = predicates_unaryop(formula) return sub.union({quoted}) diff --git a/plan4past/utils/rewrite_formula_visitor.py b/plan4past/utils/rewrite_formula_visitor.py index d0981895..36162b9a 100644 --- a/plan4past/utils/rewrite_formula_visitor.py +++ b/plan4past/utils/rewrite_formula_visitor.py @@ -40,6 +40,8 @@ Since, ) +from plan4past.helpers.utils import validate + def rewrite_unaryop(formula: _UnaryOp): """Rewrite the formula for a unary operator.""" @@ -69,6 +71,8 @@ def rewrite_false(formula: PropositionalFalse) -> Formula: @rewrite.register def rewrite_atomic(formula: PLTLAtomic) -> Formula: """Compute the basic formula for an atomic formula.""" + # validate atomic formula symbol - it must be a PDDL ground fluent + validate(formula.name) return formula diff --git a/plan4past/utils/val_predicates_visitor.py b/plan4past/utils/val_predicates_visitor.py index 83ae37b0..a1c7006e 100644 --- a/plan4past/utils/val_predicates_visitor.py +++ b/plan4past/utils/val_predicates_visitor.py @@ -76,7 +76,7 @@ def val_predicates_false(_formula: PropositionalFalse) -> Set[Predicate]: @val_predicates.register def val_predicates_atomic(formula: PLTLAtomic) -> Set[Predicate]: """Compute the value predicate for an atomic formula.""" - return {Predicate(add_val_prefix(formula.name))} + return {Predicate(add_val_prefix(replace_symbols(formula.name)))} @val_predicates.register diff --git a/tests/benchmarks/deterministic/BF/elevators_ppltl/elevators_teg.json b/tests/benchmarks/deterministic/BF/elevators_ppltl/elevators_teg.json index c062b3c8..70b5d880 100644 --- a/tests/benchmarks/deterministic/BF/elevators_ppltl/elevators_teg.json +++ b/tests/benchmarks/deterministic/BF/elevators_ppltl/elevators_teg.json @@ -1,31 +1,31 @@ { - "s2-0": "O(served_p1) & O(served_p0 & !(Y(O(served_p1))))", - "s3-0": "O(served_p1 & served_p2) & O(served_p0 & !(Y(O(served_p1 | served_p2)))) & !(O(boarded_p0 & boarded_p1)) & !(O(boarded_p1 & boarded_p2)) & !(O(boarded_p2 & boarded_p0))", - "s4-0": "O(served_p2 & served_p3) & O(served_p0 & served_p1 & !(Y(O(served_p2 | served_p3)))) & !(O(boarded_p0 & boarded_p1)) & !(O(boarded_p1 & boarded_p2)) & !(O(boarded_p2 & boarded_p3)) & !(O(boarded_p3 & boarded_p0))", - "s5-0": "O(served_p2 & served_p3 & served_p4) & O(served_p0 & served_p1 & !(Y(O(served_p2 | served_p3 | served_p4)))) & !(O(boarded_p0 & boarded_p1)) & !(O(boarded_p1 & boarded_p2)) & !(O(boarded_p2 & boarded_p3)) & !(O(boarded_p3 & boarded_p4)) & !(O(boarded_p4 & boarded_p0))", - "s6-0": "O(served_p3 & served_p4 & served_p5) & O(served_p0 & served_p1 & served_p2 & !(Y(O(served_p3 | served_p4 | served_p5)))) & !(O(boarded_p0 & (boarded_p1 | boarded_p2))) & !(O(boarded_p1 & (boarded_p2 | boarded_p3))) & !(O(boarded_p2 & (boarded_p3 | boarded_p4))) & !(O(boarded_p3 & (boarded_p4 | boarded_p5))) & !(O(boarded_p4 & (boarded_p5 | boarded_p0))) & !(O(boarded_p5 & (boarded_p0 | boarded_p1)))", - "s7-0": "O(served_p3 & served_p4 & served_p5 & served_p6) & O(served_p0 & served_p1 & served_p2 & !(Y(O(served_p3 | served_p4 | served_p5 | served_p6)))) & !(O(boarded_p0 & (boarded_p1 | boarded_p2))) & !(O(boarded_p1 & (boarded_p2 | boarded_p3))) & !(O(boarded_p2 & (boarded_p3 | boarded_p4))) & !(O(boarded_p3 & (boarded_p4 | boarded_p5))) & !(O(boarded_p4 & (boarded_p5 | boarded_p6))) & !(O(boarded_p5 & (boarded_p6 | boarded_p0))) & !(O(boarded_p6 & (boarded_p0 | boarded_p1)))", - "s8-0": "O(served_p4 & served_p5 & served_p6 & served_p7) & O(served_p0 & served_p1 & served_p2 & served_p3 & !(Y(O(served_p4 | served_p5 | served_p6 | served_p7)))) & !(O(boarded_p0 & (boarded_p1 | boarded_p2))) & !(O(boarded_p1 & (boarded_p2 | boarded_p3))) & !(O(boarded_p2 & (boarded_p3 | boarded_p4))) & !(O(boarded_p3 & (boarded_p4 | boarded_p5))) & !(O(boarded_p4 & (boarded_p5 | boarded_p6))) & !(O(boarded_p5 & (boarded_p6 | boarded_p7))) & !(O(boarded_p6 & (boarded_p7 | boarded_p0))) & !(O(boarded_p7 & (boarded_p0 | boarded_p1)))", - "s9-0": "O(served_p4 & served_p5 & served_p6 & served_p7 & served_p8) & O(served_p0 & served_p1 & served_p2 & served_p3 & !(Y(O(served_p4 | served_p5 | served_p6 | served_p7 | served_p8)))) & !(O(boarded_p0 & (boarded_p1 | boarded_p2 | boarded_p3))) & !(O(boarded_p1 & (boarded_p2 | boarded_p3 | boarded_p4))) & !(O(boarded_p2 & (boarded_p3 | boarded_p4 | boarded_p5))) & !(O(boarded_p3 & (boarded_p4 | boarded_p5 | boarded_p6))) & !(O(boarded_p4 & (boarded_p5 | boarded_p6 | boarded_p7))) & !(O(boarded_p5 & (boarded_p6 | boarded_p7 | boarded_p8))) & !(O(boarded_p6 & (boarded_p7 | boarded_p8 | boarded_p0))) & !(O(boarded_p7 & (boarded_p8 | boarded_p0 | boarded_p1))) & !(O(boarded_p8 & (boarded_p0 | boarded_p1 | boarded_p2)))", - "s10-0": "O(served_p5 & served_p6 & served_p7 & served_p8 & served_p9) & O(served_p0 & served_p1 & served_p2 & served_p3 & served_p4 & !(Y(O(served_p5 | served_p6 | served_p7 | served_p8 | served_p9)))) & !(O(boarded_p0 & (boarded_p1 | boarded_p2 | boarded_p3))) & !(O(boarded_p1 & (boarded_p2 | boarded_p3 | boarded_p4))) & !(O(boarded_p2 & (boarded_p3 | boarded_p4 | boarded_p5))) & !(O(boarded_p3 & (boarded_p4 | boarded_p5 | boarded_p6))) & !(O(boarded_p4 & (boarded_p5 | boarded_p6 | boarded_p7))) & !(O(boarded_p5 & (boarded_p6 | boarded_p7 | boarded_p8))) & !(O(boarded_p6 & (boarded_p7 | boarded_p8 | boarded_p9))) & !(O(boarded_p7 & (boarded_p8 | boarded_p9 | boarded_p0))) & !(O(boarded_p8 & (boarded_p9 | boarded_p0 | boarded_p1))) & !(O(boarded_p9 & (boarded_p0 | boarded_p1 | boarded_p2)))", - "s11-0": "O(served_p5 & served_p6 & served_p7 & served_p8 & served_p9 & served_p10) & O(served_p0 & served_p1 & served_p2 & served_p3 & served_p4 & !(Y(O(served_p5 | served_p6 | served_p7 | served_p8 | served_p9 | served_p10)))) & !(O(boarded_p0 & (boarded_p1 | boarded_p2 | boarded_p3))) & !(O(boarded_p1 & (boarded_p2 | boarded_p3 | boarded_p4))) & !(O(boarded_p2 & (boarded_p3 | boarded_p4 | boarded_p5))) & !(O(boarded_p3 & (boarded_p4 | boarded_p5 | boarded_p6))) & !(O(boarded_p4 & (boarded_p5 | boarded_p6 | boarded_p7))) & !(O(boarded_p5 & (boarded_p6 | boarded_p7 | boarded_p8))) & !(O(boarded_p6 & (boarded_p7 | boarded_p8 | boarded_p9))) & !(O(boarded_p7 & (boarded_p8 | boarded_p9 | boarded_p10))) & !(O(boarded_p8 & (boarded_p9 | boarded_p10 | boarded_p0))) & !(O(boarded_p9 & (boarded_p10 | boarded_p0 | boarded_p1))) & !(O(boarded_p10 & (boarded_p0 | boarded_p1 | boarded_p2)))", - "s12-0": "O(served_p6 & served_p7 & served_p8 & served_p9 & served_p10 & served_p11) & O(served_p0 & served_p1 & served_p2 & served_p3 & served_p4 & served_p5 & !(Y(O(served_p6 | served_p7 | served_p8 | served_p9 | served_p10 | served_p11)))) & !(O(boarded_p0 & (boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4))) & !(O(boarded_p1 & (boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5))) & !(O(boarded_p2 & (boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6))) & !(O(boarded_p3 & (boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7))) & !(O(boarded_p4 & (boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8))) & !(O(boarded_p5 & (boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9))) & !(O(boarded_p6 & (boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10))) & !(O(boarded_p7 & (boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11))) & !(O(boarded_p8 & (boarded_p9 | boarded_p10 | boarded_p11 | boarded_p0))) & !(O(boarded_p9 & (boarded_p10 | boarded_p11 | boarded_p0 | boarded_p1))) & !(O(boarded_p10 & (boarded_p11 | boarded_p0 | boarded_p1 | boarded_p2))) & !(O(boarded_p11 & (boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3)))", - "s13-0": "O(served_p6 & served_p7 & served_p8 & served_p9 & served_p10 & served_p11 & served_p12) & O(served_p0 & served_p1 & served_p2 & served_p3 & served_p4 & served_p5 & !(Y(O(served_p6 | served_p7 | served_p8 | served_p9 | served_p10 | served_p11 | served_p12)))) & !(O(boarded_p0 & (boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4))) & !(O(boarded_p1 & (boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5))) & !(O(boarded_p2 & (boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6))) & !(O(boarded_p3 & (boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7))) & !(O(boarded_p4 & (boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8))) & !(O(boarded_p5 & (boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9))) & !(O(boarded_p6 & (boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10))) & !(O(boarded_p7 & (boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11))) & !(O(boarded_p8 & (boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12))) & !(O(boarded_p9 & (boarded_p10 | boarded_p11 | boarded_p12 | boarded_p0))) & !(O(boarded_p10 & (boarded_p11 | boarded_p12 | boarded_p0 | boarded_p1))) & !(O(boarded_p11 & (boarded_p12 | boarded_p0 | boarded_p1 | boarded_p2))) & !(O(boarded_p12 & (boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3)))", - "s14-0": "O(served_p7 & served_p8 & served_p9 & served_p10 & served_p11 & served_p12 & served_p13) & O(served_p0 & served_p1 & served_p2 & served_p3 & served_p4 & served_p5 & served_p6 & !(Y(O(served_p7 | served_p8 | served_p9 | served_p10 | served_p11 | served_p12 | served_p13)))) & !(O(boarded_p0 & (boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4))) & !(O(boarded_p1 & (boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5))) & !(O(boarded_p2 & (boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6))) & !(O(boarded_p3 & (boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7))) & !(O(boarded_p4 & (boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8))) & !(O(boarded_p5 & (boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9))) & !(O(boarded_p6 & (boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10))) & !(O(boarded_p7 & (boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11))) & !(O(boarded_p8 & (boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12))) & !(O(boarded_p9 & (boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13))) & !(O(boarded_p10 & (boarded_p11 | boarded_p12 | boarded_p13 | boarded_p0))) & !(O(boarded_p11 & (boarded_p12 | boarded_p13 | boarded_p0 | boarded_p1))) & !(O(boarded_p12 & (boarded_p13 | boarded_p0 | boarded_p1 | boarded_p2))) & !(O(boarded_p13 & (boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3)))", - "s15-0": "O(served_p7 & served_p8 & served_p9 & served_p10 & served_p11 & served_p12 & served_p13 & served_p14) & O(served_p0 & served_p1 & served_p2 & served_p3 & served_p4 & served_p5 & served_p6 & !(Y(O(served_p7 | served_p8 | served_p9 | served_p10 | served_p11 | served_p12 | served_p13 | served_p14)))) & !(O(boarded_p0 & (boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5))) & !(O(boarded_p1 & (boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6))) & !(O(boarded_p2 & (boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7))) & !(O(boarded_p3 & (boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8))) & !(O(boarded_p4 & (boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9))) & !(O(boarded_p5 & (boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10))) & !(O(boarded_p6 & (boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11))) & !(O(boarded_p7 & (boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12))) & !(O(boarded_p8 & (boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13))) & !(O(boarded_p9 & (boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14))) & !(O(boarded_p10 & (boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p0))) & !(O(boarded_p11 & (boarded_p12 | boarded_p13 | boarded_p14 | boarded_p0 | boarded_p1))) & !(O(boarded_p12 & (boarded_p13 | boarded_p14 | boarded_p0 | boarded_p1 | boarded_p2))) & !(O(boarded_p13 & (boarded_p14 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3))) & !(O(boarded_p14 & (boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4)))", - "s16-0": "O(served_p8 & served_p9 & served_p10 & served_p11 & served_p12 & served_p13 & served_p14 & served_p15) & O(served_p0 & served_p1 & served_p2 & served_p3 & served_p4 & served_p5 & served_p6 & served_p7 & !(Y(O(served_p8 | served_p9 | served_p10 | served_p11 | served_p12 | served_p13 | served_p14 | served_p15)))) & !(O(boarded_p0 & (boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5))) & !(O(boarded_p1 & (boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6))) & !(O(boarded_p2 & (boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7))) & !(O(boarded_p3 & (boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8))) & !(O(boarded_p4 & (boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9))) & !(O(boarded_p5 & (boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10))) & !(O(boarded_p6 & (boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11))) & !(O(boarded_p7 & (boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12))) & !(O(boarded_p8 & (boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13))) & !(O(boarded_p9 & (boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14))) & !(O(boarded_p10 & (boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15))) & !(O(boarded_p11 & (boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15 | boarded_p0))) & !(O(boarded_p12 & (boarded_p13 | boarded_p14 | boarded_p15 | boarded_p0 | boarded_p1))) & !(O(boarded_p13 & (boarded_p14 | boarded_p15 | boarded_p0 | boarded_p1 | boarded_p2))) & !(O(boarded_p14 & (boarded_p15 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3))) & !(O(boarded_p15 & (boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4)))", - "s17-0": "O(served_p8 & served_p9 & served_p10 & served_p11 & served_p12 & served_p13 & served_p14 & served_p15 & served_p16) & O(served_p0 & served_p1 & served_p2 & served_p3 & served_p4 & served_p5 & served_p6 & served_p7 & !(Y(O(served_p8 | served_p9 | served_p10 | served_p11 | served_p12 | served_p13 | served_p14 | served_p15 | served_p16)))) & !(O(boarded_p0 & (boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5))) & !(O(boarded_p1 & (boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6))) & !(O(boarded_p2 & (boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7))) & !(O(boarded_p3 & (boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8))) & !(O(boarded_p4 & (boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9))) & !(O(boarded_p5 & (boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10))) & !(O(boarded_p6 & (boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11))) & !(O(boarded_p7 & (boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12))) & !(O(boarded_p8 & (boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13))) & !(O(boarded_p9 & (boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14))) & !(O(boarded_p10 & (boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15))) & !(O(boarded_p11 & (boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16))) & !(O(boarded_p12 & (boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16 | boarded_p0))) & !(O(boarded_p13 & (boarded_p14 | boarded_p15 | boarded_p16 | boarded_p0 | boarded_p1))) & !(O(boarded_p14 & (boarded_p15 | boarded_p16 | boarded_p0 | boarded_p1 | boarded_p2))) & !(O(boarded_p15 & (boarded_p16 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3))) & !(O(boarded_p16 & (boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4)))", - "s18-0": "O(served_p9 & served_p10 & served_p11 & served_p12 & served_p13 & served_p14 & served_p15 & served_p16 & served_p17) & O(served_p0 & served_p1 & served_p2 & served_p3 & served_p4 & served_p5 & served_p6 & served_p7 & served_p8 & !(Y(O(served_p9 | served_p10 | served_p11 | served_p12 | served_p13 | served_p14 | served_p15 | served_p16 | served_p17)))) & !(O(boarded_p0 & (boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6))) & !(O(boarded_p1 & (boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7))) & !(O(boarded_p2 & (boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8))) & !(O(boarded_p3 & (boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9))) & !(O(boarded_p4 & (boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10))) & !(O(boarded_p5 & (boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11))) & !(O(boarded_p6 & (boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12))) & !(O(boarded_p7 & (boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13))) & !(O(boarded_p8 & (boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14))) & !(O(boarded_p9 & (boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15))) & !(O(boarded_p10 & (boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16))) & !(O(boarded_p11 & (boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17))) & !(O(boarded_p12 & (boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17 | boarded_p0))) & !(O(boarded_p13 & (boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17 | boarded_p0 | boarded_p1))) & !(O(boarded_p14 & (boarded_p15 | boarded_p16 | boarded_p17 | boarded_p0 | boarded_p1 | boarded_p2))) & !(O(boarded_p15 & (boarded_p16 | boarded_p17 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3))) & !(O(boarded_p16 & (boarded_p17 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4))) & !(O(boarded_p17 & (boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5)))", - "s19-0": "O(served_p9 & served_p10 & served_p11 & served_p12 & served_p13 & served_p14 & served_p15 & served_p16 & served_p17 & served_p18) & O(served_p0 & served_p1 & served_p2 & served_p3 & served_p4 & served_p5 & served_p6 & served_p7 & served_p8 & !(Y(O(served_p9 | served_p10 | served_p11 | served_p12 | served_p13 | served_p14 | served_p15 | served_p16 | served_p17 | served_p18)))) & !(O(boarded_p0 & (boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6))) & !(O(boarded_p1 & (boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7))) & !(O(boarded_p2 & (boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8))) & !(O(boarded_p3 & (boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9))) & !(O(boarded_p4 & (boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10))) & !(O(boarded_p5 & (boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11))) & !(O(boarded_p6 & (boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12))) & !(O(boarded_p7 & (boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13))) & !(O(boarded_p8 & (boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14))) & !(O(boarded_p9 & (boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15))) & !(O(boarded_p10 & (boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16))) & !(O(boarded_p11 & (boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17))) & !(O(boarded_p12 & (boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18))) & !(O(boarded_p13 & (boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18 | boarded_p0))) & !(O(boarded_p14 & (boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18 | boarded_p0 | boarded_p1))) & !(O(boarded_p15 & (boarded_p16 | boarded_p17 | boarded_p18 | boarded_p0 | boarded_p1 | boarded_p2))) & !(O(boarded_p16 & (boarded_p17 | boarded_p18 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3))) & !(O(boarded_p17 & (boarded_p18 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4))) & !(O(boarded_p18 & (boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5)))", - "s20-0": "O(served_p10 & served_p11 & served_p12 & served_p13 & served_p14 & served_p15 & served_p16 & served_p17 & served_p18 & served_p19) & O(served_p0 & served_p1 & served_p2 & served_p3 & served_p4 & served_p5 & served_p6 & served_p7 & served_p8 & served_p9 & !(Y(O(served_p10 | served_p11 | served_p12 | served_p13 | served_p14 | served_p15 | served_p16 | served_p17 | served_p18 | served_p19)))) & !(O(boarded_p0 & (boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6))) & !(O(boarded_p1 & (boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7))) & !(O(boarded_p2 & (boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8))) & !(O(boarded_p3 & (boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9))) & !(O(boarded_p4 & (boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10))) & !(O(boarded_p5 & (boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11))) & !(O(boarded_p6 & (boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12))) & !(O(boarded_p7 & (boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13))) & !(O(boarded_p8 & (boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14))) & !(O(boarded_p9 & (boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15))) & !(O(boarded_p10 & (boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16))) & !(O(boarded_p11 & (boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17))) & !(O(boarded_p12 & (boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18))) & !(O(boarded_p13 & (boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19))) & !(O(boarded_p14 & (boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19 | boarded_p0))) & !(O(boarded_p15 & (boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19 | boarded_p0 | boarded_p1))) & !(O(boarded_p16 & (boarded_p17 | boarded_p18 | boarded_p19 | boarded_p0 | boarded_p1 | boarded_p2))) & !(O(boarded_p17 & (boarded_p18 | boarded_p19 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3))) & !(O(boarded_p18 & (boarded_p19 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4))) & !(O(boarded_p19 & (boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5)))", - "s21-0": "O(served_p10 & served_p11 & served_p12 & served_p13 & served_p14 & served_p15 & served_p16 & served_p17 & served_p18 & served_p19 & served_p20) & O(served_p0 & served_p1 & served_p2 & served_p3 & served_p4 & served_p5 & served_p6 & served_p7 & served_p8 & served_p9 & !(Y(O(served_p10 | served_p11 | served_p12 | served_p13 | served_p14 | served_p15 | served_p16 | served_p17 | served_p18 | served_p19 | served_p20)))) & !(O(boarded_p0 & (boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7))) & !(O(boarded_p1 & (boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8))) & !(O(boarded_p2 & (boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9))) & !(O(boarded_p3 & (boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10))) & !(O(boarded_p4 & (boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11))) & !(O(boarded_p5 & (boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12))) & !(O(boarded_p6 & (boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13))) & !(O(boarded_p7 & (boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14))) & !(O(boarded_p8 & (boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15))) & !(O(boarded_p9 & (boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16))) & !(O(boarded_p10 & (boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17))) & !(O(boarded_p11 & (boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18))) & !(O(boarded_p12 & (boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19))) & !(O(boarded_p13 & (boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20))) & !(O(boarded_p14 & (boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20 | boarded_p0))) & !(O(boarded_p15 & (boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20 | boarded_p0 | boarded_p1))) & !(O(boarded_p16 & (boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20 | boarded_p0 | boarded_p1 | boarded_p2))) & !(O(boarded_p17 & (boarded_p18 | boarded_p19 | boarded_p20 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3))) & !(O(boarded_p18 & (boarded_p19 | boarded_p20 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4))) & !(O(boarded_p19 & (boarded_p20 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5))) & !(O(boarded_p20 & (boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6)))", - "s22-0": "O(served_p11 & served_p12 & served_p13 & served_p14 & served_p15 & served_p16 & served_p17 & served_p18 & served_p19 & served_p20 & served_p21) & O(served_p0 & served_p1 & served_p2 & served_p3 & served_p4 & served_p5 & served_p6 & served_p7 & served_p8 & served_p9 & served_p10 & !(Y(O(served_p11 | served_p12 | served_p13 | served_p14 | served_p15 | served_p16 | served_p17 | served_p18 | served_p19 | served_p20 | served_p21)))) & !(O(boarded_p0 & (boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7))) & !(O(boarded_p1 & (boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8))) & !(O(boarded_p2 & (boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9))) & !(O(boarded_p3 & (boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10))) & !(O(boarded_p4 & (boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11))) & !(O(boarded_p5 & (boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12))) & !(O(boarded_p6 & (boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13))) & !(O(boarded_p7 & (boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14))) & !(O(boarded_p8 & (boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15))) & !(O(boarded_p9 & (boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16))) & !(O(boarded_p10 & (boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17))) & !(O(boarded_p11 & (boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18))) & !(O(boarded_p12 & (boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19))) & !(O(boarded_p13 & (boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20))) & !(O(boarded_p14 & (boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20 | boarded_p21))) & !(O(boarded_p15 & (boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20 | boarded_p21 | boarded_p0))) & !(O(boarded_p16 & (boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20 | boarded_p21 | boarded_p0 | boarded_p1))) & !(O(boarded_p17 & (boarded_p18 | boarded_p19 | boarded_p20 | boarded_p21 | boarded_p0 | boarded_p1 | boarded_p2))) & !(O(boarded_p18 & (boarded_p19 | boarded_p20 | boarded_p21 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3))) & !(O(boarded_p19 & (boarded_p20 | boarded_p21 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4))) & !(O(boarded_p20 & (boarded_p21 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5))) & !(O(boarded_p21 & (boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6)))", - "s23-0": "O(served_p11 & served_p12 & served_p13 & served_p14 & served_p15 & served_p16 & served_p17 & served_p18 & served_p19 & served_p20 & served_p21 & served_p22) & O(served_p0 & served_p1 & served_p2 & served_p3 & served_p4 & served_p5 & served_p6 & served_p7 & served_p8 & served_p9 & served_p10 & !(Y(O(served_p11 | served_p12 | served_p13 | served_p14 | served_p15 | served_p16 | served_p17 | served_p18 | served_p19 | served_p20 | served_p21 | served_p22)))) & !(O(boarded_p0 & (boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7))) & !(O(boarded_p1 & (boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8))) & !(O(boarded_p2 & (boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9))) & !(O(boarded_p3 & (boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10))) & !(O(boarded_p4 & (boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11))) & !(O(boarded_p5 & (boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12))) & !(O(boarded_p6 & (boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13))) & !(O(boarded_p7 & (boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14))) & !(O(boarded_p8 & (boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15))) & !(O(boarded_p9 & (boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16))) & !(O(boarded_p10 & (boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17))) & !(O(boarded_p11 & (boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18))) & !(O(boarded_p12 & (boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19))) & !(O(boarded_p13 & (boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20))) & !(O(boarded_p14 & (boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20 | boarded_p21))) & !(O(boarded_p15 & (boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20 | boarded_p21 | boarded_p22))) & !(O(boarded_p16 & (boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20 | boarded_p21 | boarded_p22 | boarded_p0))) & !(O(boarded_p17 & (boarded_p18 | boarded_p19 | boarded_p20 | boarded_p21 | boarded_p22 | boarded_p0 | boarded_p1))) & !(O(boarded_p18 & (boarded_p19 | boarded_p20 | boarded_p21 | boarded_p22 | boarded_p0 | boarded_p1 | boarded_p2))) & !(O(boarded_p19 & (boarded_p20 | boarded_p21 | boarded_p22 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3))) & !(O(boarded_p20 & (boarded_p21 | boarded_p22 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4))) & !(O(boarded_p21 & (boarded_p22 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5))) & !(O(boarded_p22 & (boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6)))", - "s24-0": "O(served_p12 & served_p13 & served_p14 & served_p15 & served_p16 & served_p17 & served_p18 & served_p19 & served_p20 & served_p21 & served_p22 & served_p23) & O(served_p0 & served_p1 & served_p2 & served_p3 & served_p4 & served_p5 & served_p6 & served_p7 & served_p8 & served_p9 & served_p10 & served_p11 & !(Y(O(served_p12 | served_p13 | served_p14 | served_p15 | served_p16 | served_p17 | served_p18 | served_p19 | served_p20 | served_p21 | served_p22 | served_p23)))) & !(O(boarded_p0 & (boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8))) & !(O(boarded_p1 & (boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9))) & !(O(boarded_p2 & (boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10))) & !(O(boarded_p3 & (boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11))) & !(O(boarded_p4 & (boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12))) & !(O(boarded_p5 & (boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13))) & !(O(boarded_p6 & (boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14))) & !(O(boarded_p7 & (boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15))) & !(O(boarded_p8 & (boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16))) & !(O(boarded_p9 & (boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17))) & !(O(boarded_p10 & (boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18))) & !(O(boarded_p11 & (boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19))) & !(O(boarded_p12 & (boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20))) & !(O(boarded_p13 & (boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20 | boarded_p21))) & !(O(boarded_p14 & (boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20 | boarded_p21 | boarded_p22))) & !(O(boarded_p15 & (boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20 | boarded_p21 | boarded_p22 | boarded_p23))) & !(O(boarded_p16 & (boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20 | boarded_p21 | boarded_p22 | boarded_p23 | boarded_p0))) & !(O(boarded_p17 & (boarded_p18 | boarded_p19 | boarded_p20 | boarded_p21 | boarded_p22 | boarded_p23 | boarded_p0 | boarded_p1))) & !(O(boarded_p18 & (boarded_p19 | boarded_p20 | boarded_p21 | boarded_p22 | boarded_p23 | boarded_p0 | boarded_p1 | boarded_p2))) & !(O(boarded_p19 & (boarded_p20 | boarded_p21 | boarded_p22 | boarded_p23 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3))) & !(O(boarded_p20 & (boarded_p21 | boarded_p22 | boarded_p23 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4))) & !(O(boarded_p21 & (boarded_p22 | boarded_p23 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5))) & !(O(boarded_p22 & (boarded_p23 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6))) & !(O(boarded_p23 & (boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7)))", - "s25-0": "O(served_p12 & served_p13 & served_p14 & served_p15 & served_p16 & served_p17 & served_p18 & served_p19 & served_p20 & served_p21 & served_p22 & served_p23 & served_p24) & O(served_p0 & served_p1 & served_p2 & served_p3 & served_p4 & served_p5 & served_p6 & served_p7 & served_p8 & served_p9 & served_p10 & served_p11 & !(Y(O(served_p12 | served_p13 | served_p14 | served_p15 | served_p16 | served_p17 | served_p18 | served_p19 | served_p20 | served_p21 | served_p22 | served_p23 | served_p24)))) & !(O(boarded_p0 & (boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8))) & !(O(boarded_p1 & (boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9))) & !(O(boarded_p2 & (boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10))) & !(O(boarded_p3 & (boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11))) & !(O(boarded_p4 & (boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12))) & !(O(boarded_p5 & (boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13))) & !(O(boarded_p6 & (boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14))) & !(O(boarded_p7 & (boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15))) & !(O(boarded_p8 & (boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16))) & !(O(boarded_p9 & (boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17))) & !(O(boarded_p10 & (boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18))) & !(O(boarded_p11 & (boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19))) & !(O(boarded_p12 & (boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20))) & !(O(boarded_p13 & (boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20 | boarded_p21))) & !(O(boarded_p14 & (boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20 | boarded_p21 | boarded_p22))) & !(O(boarded_p15 & (boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20 | boarded_p21 | boarded_p22 | boarded_p23))) & !(O(boarded_p16 & (boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20 | boarded_p21 | boarded_p22 | boarded_p23 | boarded_p24))) & !(O(boarded_p17 & (boarded_p18 | boarded_p19 | boarded_p20 | boarded_p21 | boarded_p22 | boarded_p23 | boarded_p24 | boarded_p0))) & !(O(boarded_p18 & (boarded_p19 | boarded_p20 | boarded_p21 | boarded_p22 | boarded_p23 | boarded_p24 | boarded_p0 | boarded_p1))) & !(O(boarded_p19 & (boarded_p20 | boarded_p21 | boarded_p22 | boarded_p23 | boarded_p24 | boarded_p0 | boarded_p1 | boarded_p2))) & !(O(boarded_p20 & (boarded_p21 | boarded_p22 | boarded_p23 | boarded_p24 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3))) & !(O(boarded_p21 & (boarded_p22 | boarded_p23 | boarded_p24 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4))) & !(O(boarded_p22 & (boarded_p23 | boarded_p24 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5))) & !(O(boarded_p23 & (boarded_p24 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6))) & !(O(boarded_p24 & (boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7)))", - "s26-0": "O(served_p13 & served_p14 & served_p15 & served_p16 & served_p17 & served_p18 & served_p19 & served_p20 & served_p21 & served_p22 & served_p23 & served_p24 & served_p25) & O(served_p0 & served_p1 & served_p2 & served_p3 & served_p4 & served_p5 & served_p6 & served_p7 & served_p8 & served_p9 & served_p10 & served_p11 & served_p12 & !(Y(O(served_p13 | served_p14 | served_p15 | served_p16 | served_p17 | served_p18 | served_p19 | served_p20 | served_p21 | served_p22 | served_p23 | served_p24 | served_p25)))) & !(O(boarded_p0 & (boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8))) & !(O(boarded_p1 & (boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9))) & !(O(boarded_p2 & (boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10))) & !(O(boarded_p3 & (boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11))) & !(O(boarded_p4 & (boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12))) & !(O(boarded_p5 & (boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13))) & !(O(boarded_p6 & (boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14))) & !(O(boarded_p7 & (boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15))) & !(O(boarded_p8 & (boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16))) & !(O(boarded_p9 & (boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17))) & !(O(boarded_p10 & (boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18))) & !(O(boarded_p11 & (boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19))) & !(O(boarded_p12 & (boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20))) & !(O(boarded_p13 & (boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20 | boarded_p21))) & !(O(boarded_p14 & (boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20 | boarded_p21 | boarded_p22))) & !(O(boarded_p15 & (boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20 | boarded_p21 | boarded_p22 | boarded_p23))) & !(O(boarded_p16 & (boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20 | boarded_p21 | boarded_p22 | boarded_p23 | boarded_p24))) & !(O(boarded_p17 & (boarded_p18 | boarded_p19 | boarded_p20 | boarded_p21 | boarded_p22 | boarded_p23 | boarded_p24 | boarded_p25))) & !(O(boarded_p18 & (boarded_p19 | boarded_p20 | boarded_p21 | boarded_p22 | boarded_p23 | boarded_p24 | boarded_p25 | boarded_p0))) & !(O(boarded_p19 & (boarded_p20 | boarded_p21 | boarded_p22 | boarded_p23 | boarded_p24 | boarded_p25 | boarded_p0 | boarded_p1))) & !(O(boarded_p20 & (boarded_p21 | boarded_p22 | boarded_p23 | boarded_p24 | boarded_p25 | boarded_p0 | boarded_p1 | boarded_p2))) & !(O(boarded_p21 & (boarded_p22 | boarded_p23 | boarded_p24 | boarded_p25 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3))) & !(O(boarded_p22 & (boarded_p23 | boarded_p24 | boarded_p25 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4))) & !(O(boarded_p23 & (boarded_p24 | boarded_p25 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5))) & !(O(boarded_p24 & (boarded_p25 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6))) & !(O(boarded_p25 & (boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7)))", - "s27-0": "O(served_p13 & served_p14 & served_p15 & served_p16 & served_p17 & served_p18 & served_p19 & served_p20 & served_p21 & served_p22 & served_p23 & served_p24 & served_p25 & served_p26) & O(served_p0 & served_p1 & served_p2 & served_p3 & served_p4 & served_p5 & served_p6 & served_p7 & served_p8 & served_p9 & served_p10 & served_p11 & served_p12 & !(Y(O(served_p13 | served_p14 | served_p15 | served_p16 | served_p17 | served_p18 | served_p19 | served_p20 | served_p21 | served_p22 | served_p23 | served_p24 | served_p25 | served_p26)))) & !(O(boarded_p0 & (boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9))) & !(O(boarded_p1 & (boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10))) & !(O(boarded_p2 & (boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11))) & !(O(boarded_p3 & (boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12))) & !(O(boarded_p4 & (boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13))) & !(O(boarded_p5 & (boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14))) & !(O(boarded_p6 & (boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15))) & !(O(boarded_p7 & (boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16))) & !(O(boarded_p8 & (boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17))) & !(O(boarded_p9 & (boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18))) & !(O(boarded_p10 & (boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19))) & !(O(boarded_p11 & (boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20))) & !(O(boarded_p12 & (boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20 | boarded_p21))) & !(O(boarded_p13 & (boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20 | boarded_p21 | boarded_p22))) & !(O(boarded_p14 & (boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20 | boarded_p21 | boarded_p22 | boarded_p23))) & !(O(boarded_p15 & (boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20 | boarded_p21 | boarded_p22 | boarded_p23 | boarded_p24))) & !(O(boarded_p16 & (boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20 | boarded_p21 | boarded_p22 | boarded_p23 | boarded_p24 | boarded_p25))) & !(O(boarded_p17 & (boarded_p18 | boarded_p19 | boarded_p20 | boarded_p21 | boarded_p22 | boarded_p23 | boarded_p24 | boarded_p25 | boarded_p26))) & !(O(boarded_p18 & (boarded_p19 | boarded_p20 | boarded_p21 | boarded_p22 | boarded_p23 | boarded_p24 | boarded_p25 | boarded_p26 | boarded_p0))) & !(O(boarded_p19 & (boarded_p20 | boarded_p21 | boarded_p22 | boarded_p23 | boarded_p24 | boarded_p25 | boarded_p26 | boarded_p0 | boarded_p1))) & !(O(boarded_p20 & (boarded_p21 | boarded_p22 | boarded_p23 | boarded_p24 | boarded_p25 | boarded_p26 | boarded_p0 | boarded_p1 | boarded_p2))) & !(O(boarded_p21 & (boarded_p22 | boarded_p23 | boarded_p24 | boarded_p25 | boarded_p26 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3))) & !(O(boarded_p22 & (boarded_p23 | boarded_p24 | boarded_p25 | boarded_p26 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4))) & !(O(boarded_p23 & (boarded_p24 | boarded_p25 | boarded_p26 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5))) & !(O(boarded_p24 & (boarded_p25 | boarded_p26 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6))) & !(O(boarded_p25 & (boarded_p26 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7))) & !(O(boarded_p26 & (boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8)))", - "s28-0": "O(served_p14 & served_p15 & served_p16 & served_p17 & served_p18 & served_p19 & served_p20 & served_p21 & served_p22 & served_p23 & served_p24 & served_p25 & served_p26 & served_p27) & O(served_p0 & served_p1 & served_p2 & served_p3 & served_p4 & served_p5 & served_p6 & served_p7 & served_p8 & served_p9 & served_p10 & served_p11 & served_p12 & served_p13 & !(Y(O(served_p14 | served_p15 | served_p16 | served_p17 | served_p18 | served_p19 | served_p20 | served_p21 | served_p22 | served_p23 | served_p24 | served_p25 | served_p26 | served_p27)))) & !(O(boarded_p0 & (boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9))) & !(O(boarded_p1 & (boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10))) & !(O(boarded_p2 & (boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11))) & !(O(boarded_p3 & (boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12))) & !(O(boarded_p4 & (boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13))) & !(O(boarded_p5 & (boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14))) & !(O(boarded_p6 & (boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15))) & !(O(boarded_p7 & (boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16))) & !(O(boarded_p8 & (boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17))) & !(O(boarded_p9 & (boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18))) & !(O(boarded_p10 & (boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19))) & !(O(boarded_p11 & (boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20))) & !(O(boarded_p12 & (boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20 | boarded_p21))) & !(O(boarded_p13 & (boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20 | boarded_p21 | boarded_p22))) & !(O(boarded_p14 & (boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20 | boarded_p21 | boarded_p22 | boarded_p23))) & !(O(boarded_p15 & (boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20 | boarded_p21 | boarded_p22 | boarded_p23 | boarded_p24))) & !(O(boarded_p16 & (boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20 | boarded_p21 | boarded_p22 | boarded_p23 | boarded_p24 | boarded_p25))) & !(O(boarded_p17 & (boarded_p18 | boarded_p19 | boarded_p20 | boarded_p21 | boarded_p22 | boarded_p23 | boarded_p24 | boarded_p25 | boarded_p26))) & !(O(boarded_p18 & (boarded_p19 | boarded_p20 | boarded_p21 | boarded_p22 | boarded_p23 | boarded_p24 | boarded_p25 | boarded_p26 | boarded_p27))) & !(O(boarded_p19 & (boarded_p20 | boarded_p21 | boarded_p22 | boarded_p23 | boarded_p24 | boarded_p25 | boarded_p26 | boarded_p27 | boarded_p0))) & !(O(boarded_p20 & (boarded_p21 | boarded_p22 | boarded_p23 | boarded_p24 | boarded_p25 | boarded_p26 | boarded_p27 | boarded_p0 | boarded_p1))) & !(O(boarded_p21 & (boarded_p22 | boarded_p23 | boarded_p24 | boarded_p25 | boarded_p26 | boarded_p27 | boarded_p0 | boarded_p1 | boarded_p2))) & !(O(boarded_p22 & (boarded_p23 | boarded_p24 | boarded_p25 | boarded_p26 | boarded_p27 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3))) & !(O(boarded_p23 & (boarded_p24 | boarded_p25 | boarded_p26 | boarded_p27 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4))) & !(O(boarded_p24 & (boarded_p25 | boarded_p26 | boarded_p27 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5))) & !(O(boarded_p25 & (boarded_p26 | boarded_p27 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6))) & !(O(boarded_p26 & (boarded_p27 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7))) & !(O(boarded_p27 & (boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8)))", - "s29-0": "O(served_p14 & served_p15 & served_p16 & served_p17 & served_p18 & served_p19 & served_p20 & served_p21 & served_p22 & served_p23 & served_p24 & served_p25 & served_p26 & served_p27 & served_p28) & O(served_p0 & served_p1 & served_p2 & served_p3 & served_p4 & served_p5 & served_p6 & served_p7 & served_p8 & served_p9 & served_p10 & served_p11 & served_p12 & served_p13 & !(Y(O(served_p14 | served_p15 | served_p16 | served_p17 | served_p18 | served_p19 | served_p20 | served_p21 | served_p22 | served_p23 | served_p24 | served_p25 | served_p26 | served_p27 | served_p28)))) & !(O(boarded_p0 & (boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9))) & !(O(boarded_p1 & (boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10))) & !(O(boarded_p2 & (boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11))) & !(O(boarded_p3 & (boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12))) & !(O(boarded_p4 & (boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13))) & !(O(boarded_p5 & (boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14))) & !(O(boarded_p6 & (boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15))) & !(O(boarded_p7 & (boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16))) & !(O(boarded_p8 & (boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17))) & !(O(boarded_p9 & (boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18))) & !(O(boarded_p10 & (boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19))) & !(O(boarded_p11 & (boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20))) & !(O(boarded_p12 & (boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20 | boarded_p21))) & !(O(boarded_p13 & (boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20 | boarded_p21 | boarded_p22))) & !(O(boarded_p14 & (boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20 | boarded_p21 | boarded_p22 | boarded_p23))) & !(O(boarded_p15 & (boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20 | boarded_p21 | boarded_p22 | boarded_p23 | boarded_p24))) & !(O(boarded_p16 & (boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20 | boarded_p21 | boarded_p22 | boarded_p23 | boarded_p24 | boarded_p25))) & !(O(boarded_p17 & (boarded_p18 | boarded_p19 | boarded_p20 | boarded_p21 | boarded_p22 | boarded_p23 | boarded_p24 | boarded_p25 | boarded_p26))) & !(O(boarded_p18 & (boarded_p19 | boarded_p20 | boarded_p21 | boarded_p22 | boarded_p23 | boarded_p24 | boarded_p25 | boarded_p26 | boarded_p27))) & !(O(boarded_p19 & (boarded_p20 | boarded_p21 | boarded_p22 | boarded_p23 | boarded_p24 | boarded_p25 | boarded_p26 | boarded_p27 | boarded_p28))) & !(O(boarded_p20 & (boarded_p21 | boarded_p22 | boarded_p23 | boarded_p24 | boarded_p25 | boarded_p26 | boarded_p27 | boarded_p28 | boarded_p0))) & !(O(boarded_p21 & (boarded_p22 | boarded_p23 | boarded_p24 | boarded_p25 | boarded_p26 | boarded_p27 | boarded_p28 | boarded_p0 | boarded_p1))) & !(O(boarded_p22 & (boarded_p23 | boarded_p24 | boarded_p25 | boarded_p26 | boarded_p27 | boarded_p28 | boarded_p0 | boarded_p1 | boarded_p2))) & !(O(boarded_p23 & (boarded_p24 | boarded_p25 | boarded_p26 | boarded_p27 | boarded_p28 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3))) & !(O(boarded_p24 & (boarded_p25 | boarded_p26 | boarded_p27 | boarded_p28 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4))) & !(O(boarded_p25 & (boarded_p26 | boarded_p27 | boarded_p28 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5))) & !(O(boarded_p26 & (boarded_p27 | boarded_p28 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6))) & !(O(boarded_p27 & (boarded_p28 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7))) & !(O(boarded_p28 & (boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8)))", - "s30-0": "O(served_p15 & served_p16 & served_p17 & served_p18 & served_p19 & served_p20 & served_p21 & served_p22 & served_p23 & served_p24 & served_p25 & served_p26 & served_p27 & served_p28 & served_p29) & O(served_p0 & served_p1 & served_p2 & served_p3 & served_p4 & served_p5 & served_p6 & served_p7 & served_p8 & served_p9 & served_p10 & served_p11 & served_p12 & served_p13 & served_p14 & !(Y(O(served_p15 | served_p16 | served_p17 | served_p18 | served_p19 | served_p20 | served_p21 | served_p22 | served_p23 | served_p24 | served_p25 | served_p26 | served_p27 | served_p28 | served_p29)))) & !(O(boarded_p0 & (boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10))) & !(O(boarded_p1 & (boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11))) & !(O(boarded_p2 & (boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12))) & !(O(boarded_p3 & (boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13))) & !(O(boarded_p4 & (boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14))) & !(O(boarded_p5 & (boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15))) & !(O(boarded_p6 & (boarded_p7 | boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16))) & !(O(boarded_p7 & (boarded_p8 | boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17))) & !(O(boarded_p8 & (boarded_p9 | boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18))) & !(O(boarded_p9 & (boarded_p10 | boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19))) & !(O(boarded_p10 & (boarded_p11 | boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20))) & !(O(boarded_p11 & (boarded_p12 | boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20 | boarded_p21))) & !(O(boarded_p12 & (boarded_p13 | boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20 | boarded_p21 | boarded_p22))) & !(O(boarded_p13 & (boarded_p14 | boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20 | boarded_p21 | boarded_p22 | boarded_p23))) & !(O(boarded_p14 & (boarded_p15 | boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20 | boarded_p21 | boarded_p22 | boarded_p23 | boarded_p24))) & !(O(boarded_p15 & (boarded_p16 | boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20 | boarded_p21 | boarded_p22 | boarded_p23 | boarded_p24 | boarded_p25))) & !(O(boarded_p16 & (boarded_p17 | boarded_p18 | boarded_p19 | boarded_p20 | boarded_p21 | boarded_p22 | boarded_p23 | boarded_p24 | boarded_p25 | boarded_p26))) & !(O(boarded_p17 & (boarded_p18 | boarded_p19 | boarded_p20 | boarded_p21 | boarded_p22 | boarded_p23 | boarded_p24 | boarded_p25 | boarded_p26 | boarded_p27))) & !(O(boarded_p18 & (boarded_p19 | boarded_p20 | boarded_p21 | boarded_p22 | boarded_p23 | boarded_p24 | boarded_p25 | boarded_p26 | boarded_p27 | boarded_p28))) & !(O(boarded_p19 & (boarded_p20 | boarded_p21 | boarded_p22 | boarded_p23 | boarded_p24 | boarded_p25 | boarded_p26 | boarded_p27 | boarded_p28 | boarded_p29))) & !(O(boarded_p20 & (boarded_p21 | boarded_p22 | boarded_p23 | boarded_p24 | boarded_p25 | boarded_p26 | boarded_p27 | boarded_p28 | boarded_p29 | boarded_p0))) & !(O(boarded_p21 & (boarded_p22 | boarded_p23 | boarded_p24 | boarded_p25 | boarded_p26 | boarded_p27 | boarded_p28 | boarded_p29 | boarded_p0 | boarded_p1))) & !(O(boarded_p22 & (boarded_p23 | boarded_p24 | boarded_p25 | boarded_p26 | boarded_p27 | boarded_p28 | boarded_p29 | boarded_p0 | boarded_p1 | boarded_p2))) & !(O(boarded_p23 & (boarded_p24 | boarded_p25 | boarded_p26 | boarded_p27 | boarded_p28 | boarded_p29 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3))) & !(O(boarded_p24 & (boarded_p25 | boarded_p26 | boarded_p27 | boarded_p28 | boarded_p29 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4))) & !(O(boarded_p25 & (boarded_p26 | boarded_p27 | boarded_p28 | boarded_p29 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5))) & !(O(boarded_p26 & (boarded_p27 | boarded_p28 | boarded_p29 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6))) & !(O(boarded_p27 & (boarded_p28 | boarded_p29 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7))) & !(O(boarded_p28 & (boarded_p29 | boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8))) & !(O(boarded_p29 & (boarded_p0 | boarded_p1 | boarded_p2 | boarded_p3 | boarded_p4 | boarded_p5 | boarded_p6 | boarded_p7 | boarded_p8 | boarded_p9)))" + "s2-0": "O(\"served p1\") & O(\"served p0\" & !(Y(O(\"served p1\"))))", + "s3-0": "O(\"served p1\" & \"served p2\") & O(\"served p0\" & !(Y(O(\"served p1\" | \"served p2\")))) & !(O(\"boarded p0\" & \"boarded p1\")) & !(O(\"boarded p1\" & \"boarded p2\")) & !(O(\"boarded p2\" & \"boarded p0\"))", + "s4-0": "O(\"served p2\" & \"served p3\") & O(\"served p0\" & \"served p1\" & !(Y(O(\"served p2\" | \"served p3\")))) & !(O(\"boarded p0\" & \"boarded p1\")) & !(O(\"boarded p1\" & \"boarded p2\")) & !(O(\"boarded p2\" & \"boarded p3\")) & !(O(\"boarded p3\" & \"boarded p0\"))", + "s5-0": "O(\"served p2\" & \"served p3\" & \"served p4\") & O(\"served p0\" & \"served p1\" & !(Y(O(\"served p2\" | \"served p3\" | \"served p4\")))) & !(O(\"boarded p0\" & \"boarded p1\")) & !(O(\"boarded p1\" & \"boarded p2\")) & !(O(\"boarded p2\" & \"boarded p3\")) & !(O(\"boarded p3\" & \"boarded p4\")) & !(O(\"boarded p4\" & \"boarded p0\"))", + "s6-0": "O(\"served p3\" & \"served p4\" & \"served p5\") & O(\"served p0\" & \"served p1\" & \"served p2\" & !(Y(O(\"served p3\" | \"served p4\" | \"served p5\")))) & !(O(\"boarded p0\" & (\"boarded p1\" | \"boarded p2\"))) & !(O(\"boarded p1\" & (\"boarded p2\" | \"boarded p3\"))) & !(O(\"boarded p2\" & (\"boarded p3\" | \"boarded p4\"))) & !(O(\"boarded p3\" & (\"boarded p4\" | \"boarded p5\"))) & !(O(\"boarded p4\" & (\"boarded p5\" | \"boarded p0\"))) & !(O(\"boarded p5\" & (\"boarded p0\" | \"boarded p1\")))", + "s7-0": "O(\"served p3\" & \"served p4\" & \"served p5\" & \"served p6\") & O(\"served p0\" & \"served p1\" & \"served p2\" & !(Y(O(\"served p3\" | \"served p4\" | \"served p5\" | \"served p6\")))) & !(O(\"boarded p0\" & (\"boarded p1\" | \"boarded p2\"))) & !(O(\"boarded p1\" & (\"boarded p2\" | \"boarded p3\"))) & !(O(\"boarded p2\" & (\"boarded p3\" | \"boarded p4\"))) & !(O(\"boarded p3\" & (\"boarded p4\" | \"boarded p5\"))) & !(O(\"boarded p4\" & (\"boarded p5\" | \"boarded p6\"))) & !(O(\"boarded p5\" & (\"boarded p6\" | \"boarded p0\"))) & !(O(\"boarded p6\" & (\"boarded p0\" | \"boarded p1\")))", + "s8-0": "O(\"served p4\" & \"served p5\" & \"served p6\" & \"served p7\") & O(\"served p0\" & \"served p1\" & \"served p2\" & \"served p3\" & !(Y(O(\"served p4\" | \"served p5\" | \"served p6\" | \"served p7\")))) & !(O(\"boarded p0\" & (\"boarded p1\" | \"boarded p2\"))) & !(O(\"boarded p1\" & (\"boarded p2\" | \"boarded p3\"))) & !(O(\"boarded p2\" & (\"boarded p3\" | \"boarded p4\"))) & !(O(\"boarded p3\" & (\"boarded p4\" | \"boarded p5\"))) & !(O(\"boarded p4\" & (\"boarded p5\" | \"boarded p6\"))) & !(O(\"boarded p5\" & (\"boarded p6\" | \"boarded p7\"))) & !(O(\"boarded p6\" & (\"boarded p7\" | \"boarded p0\"))) & !(O(\"boarded p7\" & (\"boarded p0\" | \"boarded p1\")))", + "s9-0": "O(\"served p4\" & \"served p5\" & \"served p6\" & \"served p7\" & \"served p8\") & O(\"served p0\" & \"served p1\" & \"served p2\" & \"served p3\" & !(Y(O(\"served p4\" | \"served p5\" | \"served p6\" | \"served p7\" | \"served p8\")))) & !(O(\"boarded p0\" & (\"boarded p1\" | \"boarded p2\" | \"boarded p3\"))) & !(O(\"boarded p1\" & (\"boarded p2\" | \"boarded p3\" | \"boarded p4\"))) & !(O(\"boarded p2\" & (\"boarded p3\" | \"boarded p4\" | \"boarded p5\"))) & !(O(\"boarded p3\" & (\"boarded p4\" | \"boarded p5\" | \"boarded p6\"))) & !(O(\"boarded p4\" & (\"boarded p5\" | \"boarded p6\" | \"boarded p7\"))) & !(O(\"boarded p5\" & (\"boarded p6\" | \"boarded p7\" | \"boarded p8\"))) & !(O(\"boarded p6\" & (\"boarded p7\" | \"boarded p8\" | \"boarded p0\"))) & !(O(\"boarded p7\" & (\"boarded p8\" | \"boarded p0\" | \"boarded p1\"))) & !(O(\"boarded p8\" & (\"boarded p0\" | \"boarded p1\" | \"boarded p2\")))", + "s10-0": "O(\"served p5\" & \"served p6\" & \"served p7\" & \"served p8\" & \"served p9\") & O(\"served p0\" & \"served p1\" & \"served p2\" & \"served p3\" & \"served p4\" & !(Y(O(\"served p5\" | \"served p6\" | \"served p7\" | \"served p8\" | \"served p9\")))) & !(O(\"boarded p0\" & (\"boarded p1\" | \"boarded p2\" | \"boarded p3\"))) & !(O(\"boarded p1\" & (\"boarded p2\" | \"boarded p3\" | \"boarded p4\"))) & !(O(\"boarded p2\" & (\"boarded p3\" | \"boarded p4\" | \"boarded p5\"))) & !(O(\"boarded p3\" & (\"boarded p4\" | \"boarded p5\" | \"boarded p6\"))) & !(O(\"boarded p4\" & (\"boarded p5\" | \"boarded p6\" | \"boarded p7\"))) & !(O(\"boarded p5\" & (\"boarded p6\" | \"boarded p7\" | \"boarded p8\"))) & !(O(\"boarded p6\" & (\"boarded p7\" | \"boarded p8\" | \"boarded p9\"))) & !(O(\"boarded p7\" & (\"boarded p8\" | \"boarded p9\" | \"boarded p0\"))) & !(O(\"boarded p8\" & (\"boarded p9\" | \"boarded p0\" | \"boarded p1\"))) & !(O(\"boarded p9\" & (\"boarded p0\" | \"boarded p1\" | \"boarded p2\")))", + "s11-0": "O(\"served p5\" & \"served p6\" & \"served p7\" & \"served p8\" & \"served p9\" & \"served p10\") & O(\"served p0\" & \"served p1\" & \"served p2\" & \"served p3\" & \"served p4\" & !(Y(O(\"served p5\" | \"served p6\" | \"served p7\" | \"served p8\" | \"served p9\" | \"served p10\")))) & !(O(\"boarded p0\" & (\"boarded p1\" | \"boarded p2\" | \"boarded p3\"))) & !(O(\"boarded p1\" & (\"boarded p2\" | \"boarded p3\" | \"boarded p4\"))) & !(O(\"boarded p2\" & (\"boarded p3\" | \"boarded p4\" | \"boarded p5\"))) & !(O(\"boarded p3\" & (\"boarded p4\" | \"boarded p5\" | \"boarded p6\"))) & !(O(\"boarded p4\" & (\"boarded p5\" | \"boarded p6\" | \"boarded p7\"))) & !(O(\"boarded p5\" & (\"boarded p6\" | \"boarded p7\" | \"boarded p8\"))) & !(O(\"boarded p6\" & (\"boarded p7\" | \"boarded p8\" | \"boarded p9\"))) & !(O(\"boarded p7\" & (\"boarded p8\" | \"boarded p9\" | \"boarded p10\"))) & !(O(\"boarded p8\" & (\"boarded p9\" | \"boarded p10\" | \"boarded p0\"))) & !(O(\"boarded p9\" & (\"boarded p10\" | \"boarded p0\" | \"boarded p1\"))) & !(O(\"boarded p10\" & (\"boarded p0\" | \"boarded p1\" | \"boarded p2\")))", + "s12-0": "O(\"served p6\" & \"served p7\" & \"served p8\" & \"served p9\" & \"served p10\" & \"served p11\") & O(\"served p0\" & \"served p1\" & \"served p2\" & \"served p3\" & \"served p4\" & \"served p5\" & !(Y(O(\"served p6\" | \"served p7\" | \"served p8\" | \"served p9\" | \"served p10\" | \"served p11\")))) & !(O(\"boarded p0\" & (\"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\"))) & !(O(\"boarded p1\" & (\"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\"))) & !(O(\"boarded p2\" & (\"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\"))) & !(O(\"boarded p3\" & (\"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\"))) & !(O(\"boarded p4\" & (\"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\"))) & !(O(\"boarded p5\" & (\"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\"))) & !(O(\"boarded p6\" & (\"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\"))) & !(O(\"boarded p7\" & (\"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\"))) & !(O(\"boarded p8\" & (\"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p0\"))) & !(O(\"boarded p9\" & (\"boarded p10\" | \"boarded p11\" | \"boarded p0\" | \"boarded p1\"))) & !(O(\"boarded p10\" & (\"boarded p11\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\"))) & !(O(\"boarded p11\" & (\"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\")))", + "s13-0": "O(\"served p6\" & \"served p7\" & \"served p8\" & \"served p9\" & \"served p10\" & \"served p11\" & \"served p12\") & O(\"served p0\" & \"served p1\" & \"served p2\" & \"served p3\" & \"served p4\" & \"served p5\" & !(Y(O(\"served p6\" | \"served p7\" | \"served p8\" | \"served p9\" | \"served p10\" | \"served p11\" | \"served p12\")))) & !(O(\"boarded p0\" & (\"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\"))) & !(O(\"boarded p1\" & (\"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\"))) & !(O(\"boarded p2\" & (\"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\"))) & !(O(\"boarded p3\" & (\"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\"))) & !(O(\"boarded p4\" & (\"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\"))) & !(O(\"boarded p5\" & (\"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\"))) & !(O(\"boarded p6\" & (\"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\"))) & !(O(\"boarded p7\" & (\"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\"))) & !(O(\"boarded p8\" & (\"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\"))) & !(O(\"boarded p9\" & (\"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p0\"))) & !(O(\"boarded p10\" & (\"boarded p11\" | \"boarded p12\" | \"boarded p0\" | \"boarded p1\"))) & !(O(\"boarded p11\" & (\"boarded p12\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\"))) & !(O(\"boarded p12\" & (\"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\")))", + "s14-0": "O(\"served p7\" & \"served p8\" & \"served p9\" & \"served p10\" & \"served p11\" & \"served p12\" & \"served p13\") & O(\"served p0\" & \"served p1\" & \"served p2\" & \"served p3\" & \"served p4\" & \"served p5\" & \"served p6\" & !(Y(O(\"served p7\" | \"served p8\" | \"served p9\" | \"served p10\" | \"served p11\" | \"served p12\" | \"served p13\")))) & !(O(\"boarded p0\" & (\"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\"))) & !(O(\"boarded p1\" & (\"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\"))) & !(O(\"boarded p2\" & (\"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\"))) & !(O(\"boarded p3\" & (\"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\"))) & !(O(\"boarded p4\" & (\"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\"))) & !(O(\"boarded p5\" & (\"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\"))) & !(O(\"boarded p6\" & (\"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\"))) & !(O(\"boarded p7\" & (\"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\"))) & !(O(\"boarded p8\" & (\"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\"))) & !(O(\"boarded p9\" & (\"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\"))) & !(O(\"boarded p10\" & (\"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p0\"))) & !(O(\"boarded p11\" & (\"boarded p12\" | \"boarded p13\" | \"boarded p0\" | \"boarded p1\"))) & !(O(\"boarded p12\" & (\"boarded p13\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\"))) & !(O(\"boarded p13\" & (\"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\")))", + "s15-0": "O(\"served p7\" & \"served p8\" & \"served p9\" & \"served p10\" & \"served p11\" & \"served p12\" & \"served p13\" & \"served p14\") & O(\"served p0\" & \"served p1\" & \"served p2\" & \"served p3\" & \"served p4\" & \"served p5\" & \"served p6\" & !(Y(O(\"served p7\" | \"served p8\" | \"served p9\" | \"served p10\" | \"served p11\" | \"served p12\" | \"served p13\" | \"served p14\")))) & !(O(\"boarded p0\" & (\"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\"))) & !(O(\"boarded p1\" & (\"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\"))) & !(O(\"boarded p2\" & (\"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\"))) & !(O(\"boarded p3\" & (\"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\"))) & !(O(\"boarded p4\" & (\"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\"))) & !(O(\"boarded p5\" & (\"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\"))) & !(O(\"boarded p6\" & (\"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\"))) & !(O(\"boarded p7\" & (\"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\"))) & !(O(\"boarded p8\" & (\"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\"))) & !(O(\"boarded p9\" & (\"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\"))) & !(O(\"boarded p10\" & (\"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p0\"))) & !(O(\"boarded p11\" & (\"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p0\" | \"boarded p1\"))) & !(O(\"boarded p12\" & (\"boarded p13\" | \"boarded p14\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\"))) & !(O(\"boarded p13\" & (\"boarded p14\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\"))) & !(O(\"boarded p14\" & (\"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\")))", + "s16-0": "O(\"served p8\" & \"served p9\" & \"served p10\" & \"served p11\" & \"served p12\" & \"served p13\" & \"served p14\" & \"served p15\") & O(\"served p0\" & \"served p1\" & \"served p2\" & \"served p3\" & \"served p4\" & \"served p5\" & \"served p6\" & \"served p7\" & !(Y(O(\"served p8\" | \"served p9\" | \"served p10\" | \"served p11\" | \"served p12\" | \"served p13\" | \"served p14\" | \"served p15\")))) & !(O(\"boarded p0\" & (\"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\"))) & !(O(\"boarded p1\" & (\"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\"))) & !(O(\"boarded p2\" & (\"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\"))) & !(O(\"boarded p3\" & (\"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\"))) & !(O(\"boarded p4\" & (\"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\"))) & !(O(\"boarded p5\" & (\"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\"))) & !(O(\"boarded p6\" & (\"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\"))) & !(O(\"boarded p7\" & (\"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\"))) & !(O(\"boarded p8\" & (\"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\"))) & !(O(\"boarded p9\" & (\"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\"))) & !(O(\"boarded p10\" & (\"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\"))) & !(O(\"boarded p11\" & (\"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p0\"))) & !(O(\"boarded p12\" & (\"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p0\" | \"boarded p1\"))) & !(O(\"boarded p13\" & (\"boarded p14\" | \"boarded p15\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\"))) & !(O(\"boarded p14\" & (\"boarded p15\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\"))) & !(O(\"boarded p15\" & (\"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\")))", + "s17-0": "O(\"served p8\" & \"served p9\" & \"served p10\" & \"served p11\" & \"served p12\" & \"served p13\" & \"served p14\" & \"served p15\" & \"served p16\") & O(\"served p0\" & \"served p1\" & \"served p2\" & \"served p3\" & \"served p4\" & \"served p5\" & \"served p6\" & \"served p7\" & !(Y(O(\"served p8\" | \"served p9\" | \"served p10\" | \"served p11\" | \"served p12\" | \"served p13\" | \"served p14\" | \"served p15\" | \"served p16\")))) & !(O(\"boarded p0\" & (\"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\"))) & !(O(\"boarded p1\" & (\"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\"))) & !(O(\"boarded p2\" & (\"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\"))) & !(O(\"boarded p3\" & (\"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\"))) & !(O(\"boarded p4\" & (\"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\"))) & !(O(\"boarded p5\" & (\"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\"))) & !(O(\"boarded p6\" & (\"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\"))) & !(O(\"boarded p7\" & (\"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\"))) & !(O(\"boarded p8\" & (\"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\"))) & !(O(\"boarded p9\" & (\"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\"))) & !(O(\"boarded p10\" & (\"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\"))) & !(O(\"boarded p11\" & (\"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\"))) & !(O(\"boarded p12\" & (\"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p0\"))) & !(O(\"boarded p13\" & (\"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p0\" | \"boarded p1\"))) & !(O(\"boarded p14\" & (\"boarded p15\" | \"boarded p16\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\"))) & !(O(\"boarded p15\" & (\"boarded p16\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\"))) & !(O(\"boarded p16\" & (\"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\")))", + "s18-0": "O(\"served p9\" & \"served p10\" & \"served p11\" & \"served p12\" & \"served p13\" & \"served p14\" & \"served p15\" & \"served p16\" & \"served p17\") & O(\"served p0\" & \"served p1\" & \"served p2\" & \"served p3\" & \"served p4\" & \"served p5\" & \"served p6\" & \"served p7\" & \"served p8\" & !(Y(O(\"served p9\" | \"served p10\" | \"served p11\" | \"served p12\" | \"served p13\" | \"served p14\" | \"served p15\" | \"served p16\" | \"served p17\")))) & !(O(\"boarded p0\" & (\"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\"))) & !(O(\"boarded p1\" & (\"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\"))) & !(O(\"boarded p2\" & (\"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\"))) & !(O(\"boarded p3\" & (\"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\"))) & !(O(\"boarded p4\" & (\"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\"))) & !(O(\"boarded p5\" & (\"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\"))) & !(O(\"boarded p6\" & (\"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\"))) & !(O(\"boarded p7\" & (\"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\"))) & !(O(\"boarded p8\" & (\"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\"))) & !(O(\"boarded p9\" & (\"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\"))) & !(O(\"boarded p10\" & (\"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\"))) & !(O(\"boarded p11\" & (\"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\"))) & !(O(\"boarded p12\" & (\"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p0\"))) & !(O(\"boarded p13\" & (\"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p0\" | \"boarded p1\"))) & !(O(\"boarded p14\" & (\"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\"))) & !(O(\"boarded p15\" & (\"boarded p16\" | \"boarded p17\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\"))) & !(O(\"boarded p16\" & (\"boarded p17\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\"))) & !(O(\"boarded p17\" & (\"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\")))", + "s19-0": "O(\"served p9\" & \"served p10\" & \"served p11\" & \"served p12\" & \"served p13\" & \"served p14\" & \"served p15\" & \"served p16\" & \"served p17\" & \"served p18\") & O(\"served p0\" & \"served p1\" & \"served p2\" & \"served p3\" & \"served p4\" & \"served p5\" & \"served p6\" & \"served p7\" & \"served p8\" & !(Y(O(\"served p9\" | \"served p10\" | \"served p11\" | \"served p12\" | \"served p13\" | \"served p14\" | \"served p15\" | \"served p16\" | \"served p17\" | \"served p18\")))) & !(O(\"boarded p0\" & (\"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\"))) & !(O(\"boarded p1\" & (\"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\"))) & !(O(\"boarded p2\" & (\"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\"))) & !(O(\"boarded p3\" & (\"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\"))) & !(O(\"boarded p4\" & (\"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\"))) & !(O(\"boarded p5\" & (\"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\"))) & !(O(\"boarded p6\" & (\"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\"))) & !(O(\"boarded p7\" & (\"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\"))) & !(O(\"boarded p8\" & (\"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\"))) & !(O(\"boarded p9\" & (\"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\"))) & !(O(\"boarded p10\" & (\"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\"))) & !(O(\"boarded p11\" & (\"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\"))) & !(O(\"boarded p12\" & (\"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\"))) & !(O(\"boarded p13\" & (\"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p0\"))) & !(O(\"boarded p14\" & (\"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p0\" | \"boarded p1\"))) & !(O(\"boarded p15\" & (\"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\"))) & !(O(\"boarded p16\" & (\"boarded p17\" | \"boarded p18\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\"))) & !(O(\"boarded p17\" & (\"boarded p18\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\"))) & !(O(\"boarded p18\" & (\"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\")))", + "s20-0": "O(\"served p10\" & \"served p11\" & \"served p12\" & \"served p13\" & \"served p14\" & \"served p15\" & \"served p16\" & \"served p17\" & \"served p18\" & \"served p19\") & O(\"served p0\" & \"served p1\" & \"served p2\" & \"served p3\" & \"served p4\" & \"served p5\" & \"served p6\" & \"served p7\" & \"served p8\" & \"served p9\" & !(Y(O(\"served p10\" | \"served p11\" | \"served p12\" | \"served p13\" | \"served p14\" | \"served p15\" | \"served p16\" | \"served p17\" | \"served p18\" | \"served p19\")))) & !(O(\"boarded p0\" & (\"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\"))) & !(O(\"boarded p1\" & (\"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\"))) & !(O(\"boarded p2\" & (\"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\"))) & !(O(\"boarded p3\" & (\"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\"))) & !(O(\"boarded p4\" & (\"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\"))) & !(O(\"boarded p5\" & (\"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\"))) & !(O(\"boarded p6\" & (\"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\"))) & !(O(\"boarded p7\" & (\"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\"))) & !(O(\"boarded p8\" & (\"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\"))) & !(O(\"boarded p9\" & (\"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\"))) & !(O(\"boarded p10\" & (\"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\"))) & !(O(\"boarded p11\" & (\"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\"))) & !(O(\"boarded p12\" & (\"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\"))) & !(O(\"boarded p13\" & (\"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\"))) & !(O(\"boarded p14\" & (\"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p0\"))) & !(O(\"boarded p15\" & (\"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p0\" | \"boarded p1\"))) & !(O(\"boarded p16\" & (\"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\"))) & !(O(\"boarded p17\" & (\"boarded p18\" | \"boarded p19\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\"))) & !(O(\"boarded p18\" & (\"boarded p19\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\"))) & !(O(\"boarded p19\" & (\"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\")))", + "s21-0": "O(\"served p10\" & \"served p11\" & \"served p12\" & \"served p13\" & \"served p14\" & \"served p15\" & \"served p16\" & \"served p17\" & \"served p18\" & \"served p19\" & \"served p20\") & O(\"served p0\" & \"served p1\" & \"served p2\" & \"served p3\" & \"served p4\" & \"served p5\" & \"served p6\" & \"served p7\" & \"served p8\" & \"served p9\" & !(Y(O(\"served p10\" | \"served p11\" | \"served p12\" | \"served p13\" | \"served p14\" | \"served p15\" | \"served p16\" | \"served p17\" | \"served p18\" | \"served p19\" | \"served p20\")))) & !(O(\"boarded p0\" & (\"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\"))) & !(O(\"boarded p1\" & (\"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\"))) & !(O(\"boarded p2\" & (\"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\"))) & !(O(\"boarded p3\" & (\"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\"))) & !(O(\"boarded p4\" & (\"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\"))) & !(O(\"boarded p5\" & (\"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\"))) & !(O(\"boarded p6\" & (\"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\"))) & !(O(\"boarded p7\" & (\"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\"))) & !(O(\"boarded p8\" & (\"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\"))) & !(O(\"boarded p9\" & (\"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\"))) & !(O(\"boarded p10\" & (\"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\"))) & !(O(\"boarded p11\" & (\"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\"))) & !(O(\"boarded p12\" & (\"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\"))) & !(O(\"boarded p13\" & (\"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\"))) & !(O(\"boarded p14\" & (\"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p0\"))) & !(O(\"boarded p15\" & (\"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p0\" | \"boarded p1\"))) & !(O(\"boarded p16\" & (\"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\"))) & !(O(\"boarded p17\" & (\"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\"))) & !(O(\"boarded p18\" & (\"boarded p19\" | \"boarded p20\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\"))) & !(O(\"boarded p19\" & (\"boarded p20\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\"))) & !(O(\"boarded p20\" & (\"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\")))", + "s22-0": "O(\"served p11\" & \"served p12\" & \"served p13\" & \"served p14\" & \"served p15\" & \"served p16\" & \"served p17\" & \"served p18\" & \"served p19\" & \"served p20\" & \"served p21\") & O(\"served p0\" & \"served p1\" & \"served p2\" & \"served p3\" & \"served p4\" & \"served p5\" & \"served p6\" & \"served p7\" & \"served p8\" & \"served p9\" & \"served p10\" & !(Y(O(\"served p11\" | \"served p12\" | \"served p13\" | \"served p14\" | \"served p15\" | \"served p16\" | \"served p17\" | \"served p18\" | \"served p19\" | \"served p20\" | \"served p21\")))) & !(O(\"boarded p0\" & (\"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\"))) & !(O(\"boarded p1\" & (\"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\"))) & !(O(\"boarded p2\" & (\"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\"))) & !(O(\"boarded p3\" & (\"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\"))) & !(O(\"boarded p4\" & (\"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\"))) & !(O(\"boarded p5\" & (\"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\"))) & !(O(\"boarded p6\" & (\"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\"))) & !(O(\"boarded p7\" & (\"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\"))) & !(O(\"boarded p8\" & (\"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\"))) & !(O(\"boarded p9\" & (\"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\"))) & !(O(\"boarded p10\" & (\"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\"))) & !(O(\"boarded p11\" & (\"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\"))) & !(O(\"boarded p12\" & (\"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\"))) & !(O(\"boarded p13\" & (\"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\"))) & !(O(\"boarded p14\" & (\"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p21\"))) & !(O(\"boarded p15\" & (\"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p21\" | \"boarded p0\"))) & !(O(\"boarded p16\" & (\"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p21\" | \"boarded p0\" | \"boarded p1\"))) & !(O(\"boarded p17\" & (\"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p21\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\"))) & !(O(\"boarded p18\" & (\"boarded p19\" | \"boarded p20\" | \"boarded p21\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\"))) & !(O(\"boarded p19\" & (\"boarded p20\" | \"boarded p21\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\"))) & !(O(\"boarded p20\" & (\"boarded p21\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\"))) & !(O(\"boarded p21\" & (\"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\")))", + "s23-0": "O(\"served p11\" & \"served p12\" & \"served p13\" & \"served p14\" & \"served p15\" & \"served p16\" & \"served p17\" & \"served p18\" & \"served p19\" & \"served p20\" & \"served p21\" & \"served p22\") & O(\"served p0\" & \"served p1\" & \"served p2\" & \"served p3\" & \"served p4\" & \"served p5\" & \"served p6\" & \"served p7\" & \"served p8\" & \"served p9\" & \"served p10\" & !(Y(O(\"served p11\" | \"served p12\" | \"served p13\" | \"served p14\" | \"served p15\" | \"served p16\" | \"served p17\" | \"served p18\" | \"served p19\" | \"served p20\" | \"served p21\" | \"served p22\")))) & !(O(\"boarded p0\" & (\"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\"))) & !(O(\"boarded p1\" & (\"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\"))) & !(O(\"boarded p2\" & (\"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\"))) & !(O(\"boarded p3\" & (\"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\"))) & !(O(\"boarded p4\" & (\"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\"))) & !(O(\"boarded p5\" & (\"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\"))) & !(O(\"boarded p6\" & (\"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\"))) & !(O(\"boarded p7\" & (\"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\"))) & !(O(\"boarded p8\" & (\"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\"))) & !(O(\"boarded p9\" & (\"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\"))) & !(O(\"boarded p10\" & (\"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\"))) & !(O(\"boarded p11\" & (\"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\"))) & !(O(\"boarded p12\" & (\"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\"))) & !(O(\"boarded p13\" & (\"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\"))) & !(O(\"boarded p14\" & (\"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p21\"))) & !(O(\"boarded p15\" & (\"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p21\" | \"boarded p22\"))) & !(O(\"boarded p16\" & (\"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p21\" | \"boarded p22\" | \"boarded p0\"))) & !(O(\"boarded p17\" & (\"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p21\" | \"boarded p22\" | \"boarded p0\" | \"boarded p1\"))) & !(O(\"boarded p18\" & (\"boarded p19\" | \"boarded p20\" | \"boarded p21\" | \"boarded p22\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\"))) & !(O(\"boarded p19\" & (\"boarded p20\" | \"boarded p21\" | \"boarded p22\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\"))) & !(O(\"boarded p20\" & (\"boarded p21\" | \"boarded p22\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\"))) & !(O(\"boarded p21\" & (\"boarded p22\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\"))) & !(O(\"boarded p22\" & (\"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\")))", + "s24-0": "O(\"served p12\" & \"served p13\" & \"served p14\" & \"served p15\" & \"served p16\" & \"served p17\" & \"served p18\" & \"served p19\" & \"served p20\" & \"served p21\" & \"served p22\" & \"served p23\") & O(\"served p0\" & \"served p1\" & \"served p2\" & \"served p3\" & \"served p4\" & \"served p5\" & \"served p6\" & \"served p7\" & \"served p8\" & \"served p9\" & \"served p10\" & \"served p11\" & !(Y(O(\"served p12\" | \"served p13\" | \"served p14\" | \"served p15\" | \"served p16\" | \"served p17\" | \"served p18\" | \"served p19\" | \"served p20\" | \"served p21\" | \"served p22\" | \"served p23\")))) & !(O(\"boarded p0\" & (\"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\"))) & !(O(\"boarded p1\" & (\"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\"))) & !(O(\"boarded p2\" & (\"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\"))) & !(O(\"boarded p3\" & (\"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\"))) & !(O(\"boarded p4\" & (\"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\"))) & !(O(\"boarded p5\" & (\"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\"))) & !(O(\"boarded p6\" & (\"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\"))) & !(O(\"boarded p7\" & (\"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\"))) & !(O(\"boarded p8\" & (\"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\"))) & !(O(\"boarded p9\" & (\"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\"))) & !(O(\"boarded p10\" & (\"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\"))) & !(O(\"boarded p11\" & (\"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\"))) & !(O(\"boarded p12\" & (\"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\"))) & !(O(\"boarded p13\" & (\"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p21\"))) & !(O(\"boarded p14\" & (\"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p21\" | \"boarded p22\"))) & !(O(\"boarded p15\" & (\"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p21\" | \"boarded p22\" | \"boarded p23\"))) & !(O(\"boarded p16\" & (\"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p21\" | \"boarded p22\" | \"boarded p23\" | \"boarded p0\"))) & !(O(\"boarded p17\" & (\"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p21\" | \"boarded p22\" | \"boarded p23\" | \"boarded p0\" | \"boarded p1\"))) & !(O(\"boarded p18\" & (\"boarded p19\" | \"boarded p20\" | \"boarded p21\" | \"boarded p22\" | \"boarded p23\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\"))) & !(O(\"boarded p19\" & (\"boarded p20\" | \"boarded p21\" | \"boarded p22\" | \"boarded p23\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\"))) & !(O(\"boarded p20\" & (\"boarded p21\" | \"boarded p22\" | \"boarded p23\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\"))) & !(O(\"boarded p21\" & (\"boarded p22\" | \"boarded p23\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\"))) & !(O(\"boarded p22\" & (\"boarded p23\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\"))) & !(O(\"boarded p23\" & (\"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\")))", + "s25-0": "O(\"served p12\" & \"served p13\" & \"served p14\" & \"served p15\" & \"served p16\" & \"served p17\" & \"served p18\" & \"served p19\" & \"served p20\" & \"served p21\" & \"served p22\" & \"served p23\" & \"served p24\") & O(\"served p0\" & \"served p1\" & \"served p2\" & \"served p3\" & \"served p4\" & \"served p5\" & \"served p6\" & \"served p7\" & \"served p8\" & \"served p9\" & \"served p10\" & \"served p11\" & !(Y(O(\"served p12\" | \"served p13\" | \"served p14\" | \"served p15\" | \"served p16\" | \"served p17\" | \"served p18\" | \"served p19\" | \"served p20\" | \"served p21\" | \"served p22\" | \"served p23\" | \"served p24\")))) & !(O(\"boarded p0\" & (\"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\"))) & !(O(\"boarded p1\" & (\"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\"))) & !(O(\"boarded p2\" & (\"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\"))) & !(O(\"boarded p3\" & (\"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\"))) & !(O(\"boarded p4\" & (\"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\"))) & !(O(\"boarded p5\" & (\"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\"))) & !(O(\"boarded p6\" & (\"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\"))) & !(O(\"boarded p7\" & (\"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\"))) & !(O(\"boarded p8\" & (\"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\"))) & !(O(\"boarded p9\" & (\"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\"))) & !(O(\"boarded p10\" & (\"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\"))) & !(O(\"boarded p11\" & (\"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\"))) & !(O(\"boarded p12\" & (\"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\"))) & !(O(\"boarded p13\" & (\"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p21\"))) & !(O(\"boarded p14\" & (\"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p21\" | \"boarded p22\"))) & !(O(\"boarded p15\" & (\"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p21\" | \"boarded p22\" | \"boarded p23\"))) & !(O(\"boarded p16\" & (\"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p21\" | \"boarded p22\" | \"boarded p23\" | \"boarded p24\"))) & !(O(\"boarded p17\" & (\"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p21\" | \"boarded p22\" | \"boarded p23\" | \"boarded p24\" | \"boarded p0\"))) & !(O(\"boarded p18\" & (\"boarded p19\" | \"boarded p20\" | \"boarded p21\" | \"boarded p22\" | \"boarded p23\" | \"boarded p24\" | \"boarded p0\" | \"boarded p1\"))) & !(O(\"boarded p19\" & (\"boarded p20\" | \"boarded p21\" | \"boarded p22\" | \"boarded p23\" | \"boarded p24\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\"))) & !(O(\"boarded p20\" & (\"boarded p21\" | \"boarded p22\" | \"boarded p23\" | \"boarded p24\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\"))) & !(O(\"boarded p21\" & (\"boarded p22\" | \"boarded p23\" | \"boarded p24\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\"))) & !(O(\"boarded p22\" & (\"boarded p23\" | \"boarded p24\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\"))) & !(O(\"boarded p23\" & (\"boarded p24\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\"))) & !(O(\"boarded p24\" & (\"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\")))", + "s26-0": "O(\"served p13\" & \"served p14\" & \"served p15\" & \"served p16\" & \"served p17\" & \"served p18\" & \"served p19\" & \"served p20\" & \"served p21\" & \"served p22\" & \"served p23\" & \"served p24\" & \"served p25\") & O(\"served p0\" & \"served p1\" & \"served p2\" & \"served p3\" & \"served p4\" & \"served p5\" & \"served p6\" & \"served p7\" & \"served p8\" & \"served p9\" & \"served p10\" & \"served p11\" & \"served p12\" & !(Y(O(\"served p13\" | \"served p14\" | \"served p15\" | \"served p16\" | \"served p17\" | \"served p18\" | \"served p19\" | \"served p20\" | \"served p21\" | \"served p22\" | \"served p23\" | \"served p24\" | \"served p25\")))) & !(O(\"boarded p0\" & (\"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\"))) & !(O(\"boarded p1\" & (\"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\"))) & !(O(\"boarded p2\" & (\"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\"))) & !(O(\"boarded p3\" & (\"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\"))) & !(O(\"boarded p4\" & (\"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\"))) & !(O(\"boarded p5\" & (\"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\"))) & !(O(\"boarded p6\" & (\"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\"))) & !(O(\"boarded p7\" & (\"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\"))) & !(O(\"boarded p8\" & (\"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\"))) & !(O(\"boarded p9\" & (\"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\"))) & !(O(\"boarded p10\" & (\"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\"))) & !(O(\"boarded p11\" & (\"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\"))) & !(O(\"boarded p12\" & (\"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\"))) & !(O(\"boarded p13\" & (\"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p21\"))) & !(O(\"boarded p14\" & (\"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p21\" | \"boarded p22\"))) & !(O(\"boarded p15\" & (\"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p21\" | \"boarded p22\" | \"boarded p23\"))) & !(O(\"boarded p16\" & (\"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p21\" | \"boarded p22\" | \"boarded p23\" | \"boarded p24\"))) & !(O(\"boarded p17\" & (\"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p21\" | \"boarded p22\" | \"boarded p23\" | \"boarded p24\" | \"boarded p25\"))) & !(O(\"boarded p18\" & (\"boarded p19\" | \"boarded p20\" | \"boarded p21\" | \"boarded p22\" | \"boarded p23\" | \"boarded p24\" | \"boarded p25\" | \"boarded p0\"))) & !(O(\"boarded p19\" & (\"boarded p20\" | \"boarded p21\" | \"boarded p22\" | \"boarded p23\" | \"boarded p24\" | \"boarded p25\" | \"boarded p0\" | \"boarded p1\"))) & !(O(\"boarded p20\" & (\"boarded p21\" | \"boarded p22\" | \"boarded p23\" | \"boarded p24\" | \"boarded p25\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\"))) & !(O(\"boarded p21\" & (\"boarded p22\" | \"boarded p23\" | \"boarded p24\" | \"boarded p25\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\"))) & !(O(\"boarded p22\" & (\"boarded p23\" | \"boarded p24\" | \"boarded p25\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\"))) & !(O(\"boarded p23\" & (\"boarded p24\" | \"boarded p25\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\"))) & !(O(\"boarded p24\" & (\"boarded p25\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\"))) & !(O(\"boarded p25\" & (\"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\")))", + "s27-0": "O(\"served p13\" & \"served p14\" & \"served p15\" & \"served p16\" & \"served p17\" & \"served p18\" & \"served p19\" & \"served p20\" & \"served p21\" & \"served p22\" & \"served p23\" & \"served p24\" & \"served p25\" & \"served p26\") & O(\"served p0\" & \"served p1\" & \"served p2\" & \"served p3\" & \"served p4\" & \"served p5\" & \"served p6\" & \"served p7\" & \"served p8\" & \"served p9\" & \"served p10\" & \"served p11\" & \"served p12\" & !(Y(O(\"served p13\" | \"served p14\" | \"served p15\" | \"served p16\" | \"served p17\" | \"served p18\" | \"served p19\" | \"served p20\" | \"served p21\" | \"served p22\" | \"served p23\" | \"served p24\" | \"served p25\" | \"served p26\")))) & !(O(\"boarded p0\" & (\"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\"))) & !(O(\"boarded p1\" & (\"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\"))) & !(O(\"boarded p2\" & (\"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\"))) & !(O(\"boarded p3\" & (\"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\"))) & !(O(\"boarded p4\" & (\"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\"))) & !(O(\"boarded p5\" & (\"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\"))) & !(O(\"boarded p6\" & (\"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\"))) & !(O(\"boarded p7\" & (\"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\"))) & !(O(\"boarded p8\" & (\"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\"))) & !(O(\"boarded p9\" & (\"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\"))) & !(O(\"boarded p10\" & (\"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\"))) & !(O(\"boarded p11\" & (\"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\"))) & !(O(\"boarded p12\" & (\"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p21\"))) & !(O(\"boarded p13\" & (\"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p21\" | \"boarded p22\"))) & !(O(\"boarded p14\" & (\"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p21\" | \"boarded p22\" | \"boarded p23\"))) & !(O(\"boarded p15\" & (\"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p21\" | \"boarded p22\" | \"boarded p23\" | \"boarded p24\"))) & !(O(\"boarded p16\" & (\"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p21\" | \"boarded p22\" | \"boarded p23\" | \"boarded p24\" | \"boarded p25\"))) & !(O(\"boarded p17\" & (\"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p21\" | \"boarded p22\" | \"boarded p23\" | \"boarded p24\" | \"boarded p25\" | \"boarded p26\"))) & !(O(\"boarded p18\" & (\"boarded p19\" | \"boarded p20\" | \"boarded p21\" | \"boarded p22\" | \"boarded p23\" | \"boarded p24\" | \"boarded p25\" | \"boarded p26\" | \"boarded p0\"))) & !(O(\"boarded p19\" & (\"boarded p20\" | \"boarded p21\" | \"boarded p22\" | \"boarded p23\" | \"boarded p24\" | \"boarded p25\" | \"boarded p26\" | \"boarded p0\" | \"boarded p1\"))) & !(O(\"boarded p20\" & (\"boarded p21\" | \"boarded p22\" | \"boarded p23\" | \"boarded p24\" | \"boarded p25\" | \"boarded p26\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\"))) & !(O(\"boarded p21\" & (\"boarded p22\" | \"boarded p23\" | \"boarded p24\" | \"boarded p25\" | \"boarded p26\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\"))) & !(O(\"boarded p22\" & (\"boarded p23\" | \"boarded p24\" | \"boarded p25\" | \"boarded p26\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\"))) & !(O(\"boarded p23\" & (\"boarded p24\" | \"boarded p25\" | \"boarded p26\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\"))) & !(O(\"boarded p24\" & (\"boarded p25\" | \"boarded p26\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\"))) & !(O(\"boarded p25\" & (\"boarded p26\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\"))) & !(O(\"boarded p26\" & (\"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\")))", + "s28-0": "O(\"served p14\" & \"served p15\" & \"served p16\" & \"served p17\" & \"served p18\" & \"served p19\" & \"served p20\" & \"served p21\" & \"served p22\" & \"served p23\" & \"served p24\" & \"served p25\" & \"served p26\" & \"served p27\") & O(\"served p0\" & \"served p1\" & \"served p2\" & \"served p3\" & \"served p4\" & \"served p5\" & \"served p6\" & \"served p7\" & \"served p8\" & \"served p9\" & \"served p10\" & \"served p11\" & \"served p12\" & \"served p13\" & !(Y(O(\"served p14\" | \"served p15\" | \"served p16\" | \"served p17\" | \"served p18\" | \"served p19\" | \"served p20\" | \"served p21\" | \"served p22\" | \"served p23\" | \"served p24\" | \"served p25\" | \"served p26\" | \"served p27\")))) & !(O(\"boarded p0\" & (\"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\"))) & !(O(\"boarded p1\" & (\"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\"))) & !(O(\"boarded p2\" & (\"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\"))) & !(O(\"boarded p3\" & (\"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\"))) & !(O(\"boarded p4\" & (\"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\"))) & !(O(\"boarded p5\" & (\"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\"))) & !(O(\"boarded p6\" & (\"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\"))) & !(O(\"boarded p7\" & (\"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\"))) & !(O(\"boarded p8\" & (\"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\"))) & !(O(\"boarded p9\" & (\"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\"))) & !(O(\"boarded p10\" & (\"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\"))) & !(O(\"boarded p11\" & (\"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\"))) & !(O(\"boarded p12\" & (\"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p21\"))) & !(O(\"boarded p13\" & (\"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p21\" | \"boarded p22\"))) & !(O(\"boarded p14\" & (\"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p21\" | \"boarded p22\" | \"boarded p23\"))) & !(O(\"boarded p15\" & (\"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p21\" | \"boarded p22\" | \"boarded p23\" | \"boarded p24\"))) & !(O(\"boarded p16\" & (\"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p21\" | \"boarded p22\" | \"boarded p23\" | \"boarded p24\" | \"boarded p25\"))) & !(O(\"boarded p17\" & (\"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p21\" | \"boarded p22\" | \"boarded p23\" | \"boarded p24\" | \"boarded p25\" | \"boarded p26\"))) & !(O(\"boarded p18\" & (\"boarded p19\" | \"boarded p20\" | \"boarded p21\" | \"boarded p22\" | \"boarded p23\" | \"boarded p24\" | \"boarded p25\" | \"boarded p26\" | \"boarded p27\"))) & !(O(\"boarded p19\" & (\"boarded p20\" | \"boarded p21\" | \"boarded p22\" | \"boarded p23\" | \"boarded p24\" | \"boarded p25\" | \"boarded p26\" | \"boarded p27\" | \"boarded p0\"))) & !(O(\"boarded p20\" & (\"boarded p21\" | \"boarded p22\" | \"boarded p23\" | \"boarded p24\" | \"boarded p25\" | \"boarded p26\" | \"boarded p27\" | \"boarded p0\" | \"boarded p1\"))) & !(O(\"boarded p21\" & (\"boarded p22\" | \"boarded p23\" | \"boarded p24\" | \"boarded p25\" | \"boarded p26\" | \"boarded p27\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\"))) & !(O(\"boarded p22\" & (\"boarded p23\" | \"boarded p24\" | \"boarded p25\" | \"boarded p26\" | \"boarded p27\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\"))) & !(O(\"boarded p23\" & (\"boarded p24\" | \"boarded p25\" | \"boarded p26\" | \"boarded p27\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\"))) & !(O(\"boarded p24\" & (\"boarded p25\" | \"boarded p26\" | \"boarded p27\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\"))) & !(O(\"boarded p25\" & (\"boarded p26\" | \"boarded p27\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\"))) & !(O(\"boarded p26\" & (\"boarded p27\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\"))) & !(O(\"boarded p27\" & (\"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\")))", + "s29-0": "O(\"served p14\" & \"served p15\" & \"served p16\" & \"served p17\" & \"served p18\" & \"served p19\" & \"served p20\" & \"served p21\" & \"served p22\" & \"served p23\" & \"served p24\" & \"served p25\" & \"served p26\" & \"served p27\" & \"served p28\") & O(\"served p0\" & \"served p1\" & \"served p2\" & \"served p3\" & \"served p4\" & \"served p5\" & \"served p6\" & \"served p7\" & \"served p8\" & \"served p9\" & \"served p10\" & \"served p11\" & \"served p12\" & \"served p13\" & !(Y(O(\"served p14\" | \"served p15\" | \"served p16\" | \"served p17\" | \"served p18\" | \"served p19\" | \"served p20\" | \"served p21\" | \"served p22\" | \"served p23\" | \"served p24\" | \"served p25\" | \"served p26\" | \"served p27\" | \"served p28\")))) & !(O(\"boarded p0\" & (\"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\"))) & !(O(\"boarded p1\" & (\"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\"))) & !(O(\"boarded p2\" & (\"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\"))) & !(O(\"boarded p3\" & (\"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\"))) & !(O(\"boarded p4\" & (\"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\"))) & !(O(\"boarded p5\" & (\"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\"))) & !(O(\"boarded p6\" & (\"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\"))) & !(O(\"boarded p7\" & (\"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\"))) & !(O(\"boarded p8\" & (\"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\"))) & !(O(\"boarded p9\" & (\"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\"))) & !(O(\"boarded p10\" & (\"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\"))) & !(O(\"boarded p11\" & (\"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\"))) & !(O(\"boarded p12\" & (\"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p21\"))) & !(O(\"boarded p13\" & (\"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p21\" | \"boarded p22\"))) & !(O(\"boarded p14\" & (\"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p21\" | \"boarded p22\" | \"boarded p23\"))) & !(O(\"boarded p15\" & (\"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p21\" | \"boarded p22\" | \"boarded p23\" | \"boarded p24\"))) & !(O(\"boarded p16\" & (\"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p21\" | \"boarded p22\" | \"boarded p23\" | \"boarded p24\" | \"boarded p25\"))) & !(O(\"boarded p17\" & (\"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p21\" | \"boarded p22\" | \"boarded p23\" | \"boarded p24\" | \"boarded p25\" | \"boarded p26\"))) & !(O(\"boarded p18\" & (\"boarded p19\" | \"boarded p20\" | \"boarded p21\" | \"boarded p22\" | \"boarded p23\" | \"boarded p24\" | \"boarded p25\" | \"boarded p26\" | \"boarded p27\"))) & !(O(\"boarded p19\" & (\"boarded p20\" | \"boarded p21\" | \"boarded p22\" | \"boarded p23\" | \"boarded p24\" | \"boarded p25\" | \"boarded p26\" | \"boarded p27\" | \"boarded p28\"))) & !(O(\"boarded p20\" & (\"boarded p21\" | \"boarded p22\" | \"boarded p23\" | \"boarded p24\" | \"boarded p25\" | \"boarded p26\" | \"boarded p27\" | \"boarded p28\" | \"boarded p0\"))) & !(O(\"boarded p21\" & (\"boarded p22\" | \"boarded p23\" | \"boarded p24\" | \"boarded p25\" | \"boarded p26\" | \"boarded p27\" | \"boarded p28\" | \"boarded p0\" | \"boarded p1\"))) & !(O(\"boarded p22\" & (\"boarded p23\" | \"boarded p24\" | \"boarded p25\" | \"boarded p26\" | \"boarded p27\" | \"boarded p28\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\"))) & !(O(\"boarded p23\" & (\"boarded p24\" | \"boarded p25\" | \"boarded p26\" | \"boarded p27\" | \"boarded p28\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\"))) & !(O(\"boarded p24\" & (\"boarded p25\" | \"boarded p26\" | \"boarded p27\" | \"boarded p28\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\"))) & !(O(\"boarded p25\" & (\"boarded p26\" | \"boarded p27\" | \"boarded p28\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\"))) & !(O(\"boarded p26\" & (\"boarded p27\" | \"boarded p28\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\"))) & !(O(\"boarded p27\" & (\"boarded p28\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\"))) & !(O(\"boarded p28\" & (\"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\")))", + "s30-0": "O(\"served p15\" & \"served p16\" & \"served p17\" & \"served p18\" & \"served p19\" & \"served p20\" & \"served p21\" & \"served p22\" & \"served p23\" & \"served p24\" & \"served p25\" & \"served p26\" & \"served p27\" & \"served p28\" & \"served p29\") & O(\"served p0\" & \"served p1\" & \"served p2\" & \"served p3\" & \"served p4\" & \"served p5\" & \"served p6\" & \"served p7\" & \"served p8\" & \"served p9\" & \"served p10\" & \"served p11\" & \"served p12\" & \"served p13\" & \"served p14\" & !(Y(O(\"served p15\" | \"served p16\" | \"served p17\" | \"served p18\" | \"served p19\" | \"served p20\" | \"served p21\" | \"served p22\" | \"served p23\" | \"served p24\" | \"served p25\" | \"served p26\" | \"served p27\" | \"served p28\" | \"served p29\")))) & !(O(\"boarded p0\" & (\"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\"))) & !(O(\"boarded p1\" & (\"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\"))) & !(O(\"boarded p2\" & (\"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\"))) & !(O(\"boarded p3\" & (\"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\"))) & !(O(\"boarded p4\" & (\"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\"))) & !(O(\"boarded p5\" & (\"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\"))) & !(O(\"boarded p6\" & (\"boarded p7\" | \"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\"))) & !(O(\"boarded p7\" & (\"boarded p8\" | \"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\"))) & !(O(\"boarded p8\" & (\"boarded p9\" | \"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\"))) & !(O(\"boarded p9\" & (\"boarded p10\" | \"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\"))) & !(O(\"boarded p10\" & (\"boarded p11\" | \"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\"))) & !(O(\"boarded p11\" & (\"boarded p12\" | \"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p21\"))) & !(O(\"boarded p12\" & (\"boarded p13\" | \"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p21\" | \"boarded p22\"))) & !(O(\"boarded p13\" & (\"boarded p14\" | \"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p21\" | \"boarded p22\" | \"boarded p23\"))) & !(O(\"boarded p14\" & (\"boarded p15\" | \"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p21\" | \"boarded p22\" | \"boarded p23\" | \"boarded p24\"))) & !(O(\"boarded p15\" & (\"boarded p16\" | \"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p21\" | \"boarded p22\" | \"boarded p23\" | \"boarded p24\" | \"boarded p25\"))) & !(O(\"boarded p16\" & (\"boarded p17\" | \"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p21\" | \"boarded p22\" | \"boarded p23\" | \"boarded p24\" | \"boarded p25\" | \"boarded p26\"))) & !(O(\"boarded p17\" & (\"boarded p18\" | \"boarded p19\" | \"boarded p20\" | \"boarded p21\" | \"boarded p22\" | \"boarded p23\" | \"boarded p24\" | \"boarded p25\" | \"boarded p26\" | \"boarded p27\"))) & !(O(\"boarded p18\" & (\"boarded p19\" | \"boarded p20\" | \"boarded p21\" | \"boarded p22\" | \"boarded p23\" | \"boarded p24\" | \"boarded p25\" | \"boarded p26\" | \"boarded p27\" | \"boarded p28\"))) & !(O(\"boarded p19\" & (\"boarded p20\" | \"boarded p21\" | \"boarded p22\" | \"boarded p23\" | \"boarded p24\" | \"boarded p25\" | \"boarded p26\" | \"boarded p27\" | \"boarded p28\" | \"boarded p29\"))) & !(O(\"boarded p20\" & (\"boarded p21\" | \"boarded p22\" | \"boarded p23\" | \"boarded p24\" | \"boarded p25\" | \"boarded p26\" | \"boarded p27\" | \"boarded p28\" | \"boarded p29\" | \"boarded p0\"))) & !(O(\"boarded p21\" & (\"boarded p22\" | \"boarded p23\" | \"boarded p24\" | \"boarded p25\" | \"boarded p26\" | \"boarded p27\" | \"boarded p28\" | \"boarded p29\" | \"boarded p0\" | \"boarded p1\"))) & !(O(\"boarded p22\" & (\"boarded p23\" | \"boarded p24\" | \"boarded p25\" | \"boarded p26\" | \"boarded p27\" | \"boarded p28\" | \"boarded p29\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\"))) & !(O(\"boarded p23\" & (\"boarded p24\" | \"boarded p25\" | \"boarded p26\" | \"boarded p27\" | \"boarded p28\" | \"boarded p29\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\"))) & !(O(\"boarded p24\" & (\"boarded p25\" | \"boarded p26\" | \"boarded p27\" | \"boarded p28\" | \"boarded p29\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\"))) & !(O(\"boarded p25\" & (\"boarded p26\" | \"boarded p27\" | \"boarded p28\" | \"boarded p29\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\"))) & !(O(\"boarded p26\" & (\"boarded p27\" | \"boarded p28\" | \"boarded p29\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\"))) & !(O(\"boarded p27\" & (\"boarded p28\" | \"boarded p29\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\"))) & !(O(\"boarded p28\" & (\"boarded p29\" | \"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\"))) & !(O(\"boarded p29\" & (\"boarded p0\" | \"boarded p1\" | \"boarded p2\" | \"boarded p3\" | \"boarded p4\" | \"boarded p5\" | \"boarded p6\" | \"boarded p7\" | \"boarded p8\" | \"boarded p9\")))" } \ No newline at end of file diff --git a/tests/helpers/planutils/downward.py b/tests/helpers/planutils/downward.py index a6ce0172..6ef77122 100644 --- a/tests/helpers/planutils/downward.py +++ b/tests/helpers/planutils/downward.py @@ -68,7 +68,7 @@ def get_planner_cmd( def process_output(self, working_directory: Path, stdout: str) -> PlannerResult: """Process the output of the planner.""" - logger.debug("Processing output of LAMA") + logger.debug("Processing output of Fast-Downward.") # the sas_plan file is in the /root directory sas_file = working_directory / "sas_plan" diff --git a/tests/test_compiler/test_blocksworld_det.py b/tests/test_compiler/test_blocksworld_det.py index 2e412a3c..cdfafe4b 100644 --- a/tests/test_compiler/test_blocksworld_det.py +++ b/tests/test_compiler/test_blocksworld_det.py @@ -35,8 +35,8 @@ class TestBlocksworldDetSimpleSequence(BaseCompilerTest): PATH_TO_DOMAINS_DIR = BLOCKSWORLD_DIR PATH_TO_INSTANCES_DIR = BLOCKSWORLD_DIR - MIN_INSTANCE_ID = 2 - MAX_INSTANCE_ID = 10 + MIN_INSTANCE_ID = 3 + MAX_INSTANCE_ID = 3 def make_formula(self, instance_id: int, domain: Path, problem: Path) -> str: """ @@ -50,7 +50,7 @@ def make_formula(self, instance_id: int, domain: Path, problem: Path) -> str: trailing_brackets = "" for i in range(1, instance_id): last = i == instance_id - 1 - formula += f"O(on_b{i}_b{i + 1}" + (" & Y(" if not last else "") + formula += f'O("on b{i} b{i + 1}"' + (" & Y(" if not last else "") trailing_brackets += "))" if not last else ")" return formula + trailing_brackets diff --git a/tests/test_compiler/test_readme_example.py b/tests/test_compiler/test_readme_example.py index b2015447..383cf543 100644 --- a/tests/test_compiler/test_readme_example.py +++ b/tests/test_compiler/test_readme_example.py @@ -24,31 +24,18 @@ from pathlib import Path -import pytest -from pddl.logic import Predicate, constants from pddl.parser.domain import DomainParser from pddl.parser.problem import ProblemParser from pylogics.parsers import parse_pltl -from pylogics.syntax.pltl import Atomic as PLTLAtomic from plan4past.compiler import Compiler from tests.helpers.constants import EXAMPLES_DIR from tests.helpers.misc import check_compilation -@pytest.mark.parametrize( - "from_atoms_to_fluent", - [ - None, - { - PLTLAtomic("on_b_a"): Predicate("on", *constants("b a")), - PLTLAtomic("ontable_c"): Predicate("ontable", *constants("c")), - }, - ], -) -def test_readme_example(val, default_planner, from_atoms_to_fluent) -> None: +def test_readme_example(val, default_planner) -> None: """Test the example from the README.""" - formula = "on_b_a & O(ontable_c)" + formula = '"on b a" & O("ontable c")' domain_parser = DomainParser() problem_parser = ProblemParser() @@ -59,9 +46,7 @@ def test_readme_example(val, default_planner, from_atoms_to_fluent) -> None: problem = problem_parser(pddl_example_problem_path.read_text(encoding="utf-8")) goal = parse_pltl(formula) - compiler = Compiler( - domain, problem, goal, from_atoms_to_fluent=from_atoms_to_fluent - ) + compiler = Compiler(domain, problem, goal) compiler.compile() compiled_domain, compiled_problem = compiler.result diff --git a/tests/test_helpers/test_utils.py b/tests/test_helpers/test_utils.py index 18237ef1..4620fbca 100644 --- a/tests/test_helpers/test_utils.py +++ b/tests/test_helpers/test_utils.py @@ -22,55 +22,33 @@ """This module contains tests for the plan4past.helpers.utils module.""" import pytest -from pddl.logic import Predicate, constants -from pylogics.syntax.pltl import Atomic as PLTLAtomic -from pylogics.syntax.pltl import Before, Since from plan4past.helpers.utils import ( add_val_prefix, check_, - default_mapping, remove_before_prefix, remove_val_prefix, ) -def test_default_mapping() -> None: - """Test the default mapping function.""" - p_a_b = PLTLAtomic("p_a_b") - p_b_c = PLTLAtomic("p_b_c") - p_c_d = PLTLAtomic("p_c_d") - p2 = PLTLAtomic("p2") - before_p_a_b = Before(p_a_b) - p_b_c_since_p_c_d = Since(p_b_c, p_c_d) - - result = default_mapping(before_p_a_b & p_b_c_since_p_c_d & p2) - assert result == { - p_a_b: Predicate("p", *constants("a b")), - p_b_c: Predicate("p", *constants("b c")), - p_c_d: Predicate("p", *constants("c d")), - p2: Predicate("p2"), - } - - def test_val_prefix() -> None: """Test the add_val_prefix function.""" - assert add_val_prefix("Y-foo") == "val-Y-foo" - assert add_val_prefix("Yfoo") == "val-Yfoo" - assert add_val_prefix("foo") == "val-foo" - assert add_val_prefix("Y-foo-bar") == "val-Y-foo-bar" + assert add_val_prefix("Y-foo") == "VAL__Y-foo" + assert add_val_prefix("Yfoo") == "VAL__Yfoo" + assert add_val_prefix("foo") == "VAL__foo" + assert add_val_prefix("Y-foo-bar") == "VAL__Y-foo-bar" def test_remove_before_prefix() -> None: """Test the remove_before_prefix function.""" - assert remove_before_prefix("Y-foo") == "foo" - assert remove_before_prefix("Yfoo") == "foo" + assert remove_before_prefix("Y__foo") == "foo" + assert remove_before_prefix("YLPAR__foo__RPAR") == "foo" assert remove_before_prefix("foo") == "foo" def test_remove_val_prefix() -> None: """Test the remove_val_prefix function.""" - assert remove_val_prefix("val-foo") == "foo" + assert remove_val_prefix("VAL__foo") == "foo" assert remove_val_prefix("foo") == "foo" diff --git a/tests/test_utils/test_derived_visitor.py b/tests/test_utils/test_derived_visitor.py index aa299c92..7c54d5b2 100644 --- a/tests/test_utils/test_derived_visitor.py +++ b/tests/test_utils/test_derived_visitor.py @@ -24,7 +24,6 @@ from typing import Set import pytest -from pddl.logic import Constant from pddl.logic.base import And, Not, Or from pddl.logic.predicates import DerivedPredicate, Predicate from pylogics.syntax.pltl import Atomic as PLTLAtomic @@ -62,7 +61,7 @@ def test_derived_predicates_visitor_not_implemented_fail(): with pytest.raises( NotImplementedError, match="handler not implemented for object " ): - derived_predicates(1, {}) + derived_predicates(1) def test_derived_predicates_visitor_true(): @@ -70,7 +69,7 @@ def test_derived_predicates_visitor_true(): val = Predicate(add_val_prefix("true")) expected = {DerivedPredicate(val, And())} - actual = derived_predicates(PropositionalTrue(), {}) + actual = derived_predicates(PropositionalTrue()) assert _eq(actual, expected) @@ -79,7 +78,7 @@ def test_derived_predicates_visitor_false(): val = Predicate(add_val_prefix("false")) expected = {DerivedPredicate(val, Or())} - actual = derived_predicates(PropositionalFalse(), {}) + actual = derived_predicates(PropositionalFalse()) assert _eq(actual, expected) @@ -87,10 +86,10 @@ def test_derived_predicates_visitor_atomic(): """Test the derived predicates visitor for the atomic formula.""" a = PLTLAtomic("a") val = Predicate(add_val_prefix("a")) - condition = Predicate("p", Constant("a")) + condition = Predicate("a") expected = {DerivedPredicate(val, condition)} - actual = derived_predicates(a, {a: condition}) + actual = derived_predicates(a) assert _eq(actual, expected) @@ -99,10 +98,10 @@ def test_derived_predicates_visitor_and(): a = PLTLAtomic("a") b = PLTLAtomic("b") - condition_a = Predicate("p", Constant("a")) - condition_b = Predicate("p", Constant("b")) + condition_a = Predicate("a") + condition_b = Predicate("b") - val = Predicate(add_val_prefix("a-and-b")) + val = Predicate(add_val_prefix("LPAR__a__RPAR-__AND__-LPAR__b__RPAR")) val_a = Predicate(add_val_prefix("a")) val_b = Predicate(add_val_prefix("b")) @@ -114,7 +113,7 @@ def test_derived_predicates_visitor_and(): DerivedPredicate(val_b, condition_b), } - actual = derived_predicates(a & b, {a: condition_a, b: condition_b}) + actual = derived_predicates(a & b) assert _eq(actual, expected) @@ -123,10 +122,10 @@ def test_derived_predicates_visitor_or(): a = PLTLAtomic("a") b = PLTLAtomic("b") - condition_a = Predicate("p", Constant("a")) - condition_b = Predicate("p", Constant("b")) + condition_a = Predicate("a") + condition_b = Predicate("b") - val = Predicate(add_val_prefix("a-or-b")) + val = Predicate(add_val_prefix("LPAR__a__RPAR-__OR__-LPAR__b__RPAR")) val_a = Predicate(add_val_prefix("a")) val_b = Predicate(add_val_prefix("b")) @@ -138,7 +137,7 @@ def test_derived_predicates_visitor_or(): DerivedPredicate(val_b, condition_b), } - actual = derived_predicates(a | b, {a: condition_a, b: condition_b}) + actual = derived_predicates(a | b) assert _eq(actual, expected) @@ -146,16 +145,16 @@ def test_derived_predicates_visitor_not(): """Test the derived predicates visitor for the not formula.""" a = PLTLAtomic("a") - condition_a = Predicate("p", Constant("a")) + condition_a = Predicate("a") - val = Predicate(add_val_prefix("not-a")) + val = Predicate(add_val_prefix("NOT__LPAR__a__RPAR")) val_a = Predicate(add_val_prefix("a")) condition = Not(val_a) expected = {DerivedPredicate(val, condition), DerivedPredicate(val_a, condition_a)} - actual = derived_predicates(~a, {a: condition_a}) + actual = derived_predicates(~a) assert _eq(actual, expected) @@ -164,16 +163,16 @@ def test_derived_predicates_visitor_before(): a = PLTLAtomic("a") Ya = Before(a) - condition_a = Predicate("p", Constant("a")) + condition_a = Predicate("a") - val = Predicate(add_val_prefix("Ya")) + val = Predicate(add_val_prefix("YLPAR__a__RPAR")) val_a = Predicate(add_val_prefix("a")) - condition = Predicate("Ya") + condition = Predicate("YLPAR__a__RPAR") expected = {DerivedPredicate(val, condition), DerivedPredicate(val_a, condition_a)} - actual = derived_predicates(Ya, {a: condition_a}) + actual = derived_predicates(Ya) assert _eq(actual, expected) @@ -187,14 +186,18 @@ def test_derived_predicates_visitor_since(): val_a = Predicate(add_val_prefix("a")) val_b = Predicate(add_val_prefix("b")) val_c = Predicate(add_val_prefix("c")) - val_a_since_b_since_c = Predicate(add_val_prefix("a-S-b-S-c")) - val_b_since_c = Predicate(add_val_prefix("b-S-c")) - Y_a_since_b_since_c = Predicate("Y-a-S-b-S-c") - Y_b_since_c = Predicate("Y-b-S-c") - - condition_a = Predicate("p", Constant("a")) - condition_b = Predicate("p", Constant("b")) - condition_c = Predicate("p", Constant("c")) + val_a_since_b_since_c = Predicate( + add_val_prefix("LPAR__a__RPAR-S-LPAR__LPAR__b__RPAR-S-LPAR__c__RPAR__RPAR") + ) + val_b_since_c = Predicate(add_val_prefix("LPAR__b__RPAR-S-LPAR__c__RPAR")) + Y_a_since_b_since_c = Predicate( + "Y__LPAR__a__RPAR-S-LPAR__LPAR__b__RPAR-S-LPAR__c__RPAR__RPAR" + ) + Y_b_since_c = Predicate("Y__LPAR__b__RPAR-S-LPAR__c__RPAR") + + condition_a = Predicate("a") + condition_b = Predicate("b") + condition_c = Predicate("c") condition_b_since_c = Or(val_c, And(val_b, Y_b_since_c)) condition_a_since_b_since_c = Or(val_b_since_c, And(val_a, Y_a_since_b_since_c)) @@ -206,9 +209,7 @@ def test_derived_predicates_visitor_since(): DerivedPredicate(val_c, condition_c), } - actual = derived_predicates( - a_since_b_since_c, {a: condition_a, b: condition_b, c: condition_c} - ) + actual = derived_predicates(a_since_b_since_c) assert _eq(actual, expected) @@ -218,10 +219,10 @@ def test_derived_predicates_visitor_once(): once_a = Once(a) val_a = Predicate(add_val_prefix("a")) - val_once_a = Predicate(add_val_prefix("Oa")) - Y_once_a = Predicate("Y-Oa") + val_once_a = Predicate(add_val_prefix("OLPAR__a__RPAR")) + Y_once_a = Predicate("Y__OLPAR__a__RPAR") - condition_a = Predicate("p", Constant("a")) + condition_a = Predicate("a") condition_once_a = Or(val_a, Y_once_a) expected = { @@ -229,5 +230,5 @@ def test_derived_predicates_visitor_once(): DerivedPredicate(val_once_a, condition_once_a), } - actual = derived_predicates(once_a, {a: condition_a}) + actual = derived_predicates(once_a) assert _eq(actual, expected) diff --git a/tests/test_utils/test_mapping_parser.py b/tests/test_utils/test_mapping_parser.py deleted file mode 100644 index a9944f7a..00000000 --- a/tests/test_utils/test_mapping_parser.py +++ /dev/null @@ -1,168 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright 2021 -- 2023 WhiteMech -# -# ------------------------------ -# -# This file is part of Plan4Past. -# -# Plan4Past is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Plan4Past is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with Plan4Past. If not, see . -# - -"""This module contains tests for the plan4past.utils.mapping_parser module.""" -from textwrap import dedent - -import pytest -from pddl.logic import Constant, Predicate, constants -from pylogics.syntax.pltl import Atomic as PLTLAtomic -from pylogics.syntax.pltl import FalseFormula as PLTLFalse -from pylogics.syntax.pltl import TrueFormula as PLTLTrue - -from plan4past.utils.mapping_parser import MappingParserError, mapping_parser -from tests.helpers.constants import EXAMPLE_MAP_FILE - -_on_b_a = PLTLAtomic("on_b_a") -_ontable_c = PLTLAtomic("ontable_c") - -_pddl_on_b_a = Predicate("on", *constants("b a")) -_pddl_ontable_c = Predicate("ontable", Constant("c")) - - -@pytest.mark.parametrize( - "formula,expected_mapping", - [ - (PLTLTrue(), {}), - (PLTLFalse(), {}), - (_on_b_a, {_on_b_a: _pddl_on_b_a}), - (_ontable_c, {_ontable_c: _pddl_ontable_c}), - (_on_b_a & _ontable_c, {_on_b_a: _pddl_on_b_a, _ontable_c: _pddl_ontable_c}), - ], -) -def test_mapping_parser_successful_case(formula, expected_mapping): - """Test the mapping parser with the example map file.""" - actual_mapping = mapping_parser(EXAMPLE_MAP_FILE.read_text(), formula) - assert actual_mapping == expected_mapping - - -def test_mapping_parser_empty_file(): - """Test the mapping parser when the file is empty.""" - assert not mapping_parser("", PLTLTrue()) - - -def test_mapping_parser_empty_lines(): - """Test the mapping parser with empty lines.""" - assert not mapping_parser("\n\n", PLTLTrue()) - - -def test_mapping_parser_with_comments(): - """Test the mapping parser with comments.""" - assert mapping_parser(";;;;\n;\non_b_a,on b a", _on_b_a) == {_on_b_a: _pddl_on_b_a} - - -def test_mapping_parser_when_row_has_no_comma(): - """Test the mapping parser when a row is invalid (has no comma).""" - with pytest.raises( - MappingParserError, - match="invalid mapping at row 0: expected a mapping of the form ','", - ): - mapping_parser( - "invalid_row\n", - PLTLTrue(), - ) - - -def test_mapping_parser_when_row_has_more_than_one_comma(): - """Test the mapping parser when a row is invalid (has more than two commas).""" - with pytest.raises( - MappingParserError, - match="invalid mapping at row 0: expected a mapping of the form ','", - ): - mapping_parser( - "invalid_row,invalid_row,\n", - PLTLTrue(), - ) - - -def test_mapping_parser_bad_symbol_format(): - """Test the mapping parser when a row is invalid (bad symbol format).""" - with pytest.raises( - MappingParserError, - match="invalid mapping at row 0: symbol cannot be empty string and must match the regex ", - ): - mapping_parser( - "not a valid symbol,some_predicate\n", - PLTLTrue(), - ) - - -def test_mapping_parser_empty_predicate_name(): - """Test the mapping parser when a row is invalid (empty predicate name).""" - with pytest.raises( - MappingParserError, - match="invalid mapping at row 0: predicate cannot be empty string", - ): - mapping_parser( - "some_symbol,\n", - PLTLTrue(), - ) - - -def test_mapping_parser_invalid_predicate_name(): - """Test the mapping parser when a row is invalid (invalid predicate name).""" - with pytest.raises( - MappingParserError, - match=r"invalid mapping at row 0: got an invalid name for a predicate: 'not!'\. It must match the regex .*", - ): - mapping_parser( - "some_symbol,not! a valid predicate\n", - PLTLTrue(), - ) - - -def test_mapping_parser_invalid_constant_name(): - """Test the mapping parser when a row is invalid (invalid constant name).""" - with pytest.raises( - MappingParserError, - match=r"invalid mapping at row 0: got an invalid constant: Value 'wrong-constant-name!' " - r"does not match the regular expression .*", - ): - mapping_parser( - "some_symbol,predicate wrong-constant-name!\n", - PLTLTrue(), - ) - - -def test_mapping_parser_in_case_of_unmapped_symbols(): - """Test the mapping parser when a symbol is not mapped.""" - with pytest.raises( - MappingParserError, - match=r"invalid mapping: the following symbols of the formula are not mapped: {'a|b', 'b|a'}", - ): - mapping_parser( - dedent( - """\ - some_symbol,predicate some_constant - """ - ), - PLTLAtomic("a") & PLTLAtomic("b") & PLTLTrue(), - ) - - -def test_mapping_parser_symbol_occurs_more_than_once(): - """Test the mapping parser when a symbol occurs more than once.""" - with pytest.raises( - MappingParserError, - match="invalid mapping at row 1: symbol 'on_b_a' is mapped multiple times", - ): - mapping_parser("on_b_a,on b a\non_b_a,on b a", _on_b_a) diff --git a/tests/test_utils/test_predicates_visitor.py b/tests/test_utils/test_predicates_visitor.py index b398570d..9f32884e 100644 --- a/tests/test_utils/test_predicates_visitor.py +++ b/tests/test_utils/test_predicates_visitor.py @@ -84,7 +84,7 @@ def test_predicates_visitor_before(): """Test the predicates visitor for the before formula.""" a = PLTLAtomic("a") Ya = Before(a) - assert predicates(Ya) == {Predicate("Ya")} + assert predicates(Ya) == {Predicate("YLPAR__a__RPAR")} def test_predicates_visitor_since(): @@ -94,8 +94,8 @@ def test_predicates_visitor_since(): c = PLTLAtomic("c") a_since_b_since_c = Since(a, b, c) assert predicates(a_since_b_since_c) == { - Predicate("Y-b-S-c"), - Predicate("Y-a-S-b-S-c"), + Predicate("Y__LPAR__a__RPAR-S-LPAR__LPAR__b__RPAR-S-LPAR__c__RPAR__RPAR"), + Predicate("Y__LPAR__b__RPAR-S-LPAR__c__RPAR"), } @@ -103,4 +103,4 @@ def test_predicates_visitor_once(): """Test the predicates visitor for the once formula.""" a = PLTLAtomic("a") once_a = Once(a) - assert predicates(once_a) == {Predicate("Y-Oa")} + assert predicates(once_a) == {Predicate("Y__OLPAR__a__RPAR")} diff --git a/tests/test_utils/test_rewrite_formula_visitor.py b/tests/test_utils/test_rewrite_formula_visitor.py index 2bd8a6fc..7a5dbcbe 100644 --- a/tests/test_utils/test_rewrite_formula_visitor.py +++ b/tests/test_utils/test_rewrite_formula_visitor.py @@ -58,75 +58,75 @@ def test_rewrite_formula_visitor_false(): def test_rewrite_formula_visitor_atomic(): """Test the rewrite formula visitor for the atomic formula.""" - a = PLTLAtomic("a") + a = PLTLAtomic('"a"') assert rewrite(a) == a def test_rewrite_formula_visitor_and(): """Test the rewrite formula visitor for the and formula.""" - a = PLTLAtomic("a") - b = PLTLAtomic("b") - c = PLTLAtomic("c") - d = PLTLAtomic("d") + a = PLTLAtomic('"a"') + b = PLTLAtomic('"b"') + c = PLTLAtomic('"c"') + d = PLTLAtomic('"d"') assert rewrite(PLTLImplies(a, b) & PLTLImplies(c, d)) == (~a | b) & (~c | d) def test_rewrite_formula_visitor_or(): """Test the rewrite formula visitor for the or formula.""" - a = PLTLAtomic("a") - b = PLTLAtomic("b") - c = PLTLAtomic("c") - d = PLTLAtomic("d") + a = PLTLAtomic('"a"') + b = PLTLAtomic('"b"') + c = PLTLAtomic('"c"') + d = PLTLAtomic('"d"') assert rewrite(PLTLImplies(a, b) | PLTLImplies(c, d)) == (~a | b) | (~c | d) def test_rewrite_formula_visitor_not(): """Test the rewrite formula visitor for the not formula.""" - a = PLTLAtomic("a") - b = PLTLAtomic("b") + a = PLTLAtomic('"a"') + b = PLTLAtomic('"b"') assert rewrite(~PLTLImplies(a, b)) == ~(~a | b) def test_rewrite_formula_visitor_implies(): """Test the rewrite formula visitor for the implies formula.""" - a = PLTLAtomic("a") - b = PLTLAtomic("b") + a = PLTLAtomic('"a"') + b = PLTLAtomic('"b"') assert rewrite(PLTLImplies(a, b)) == (~a | b) def test_rewrite_formula_visitor_equivalence(): """Test the rewrite formula visitor for the equivalence formula.""" - a = PLTLAtomic("a") - b = PLTLAtomic("b") + a = PLTLAtomic('"a"') + b = PLTLAtomic('"b"') assert rewrite(PLTLEquivalence(a, b)) == ((a & b) | (~a & ~b)) def test_rewrite_formula_visitor_before(): """Test the rewrite formula visitor for the before formula.""" - a = PLTLAtomic("a") + a = PLTLAtomic('"a"') before_a = Before(a) assert rewrite(before_a) == before_a def test_rewrite_formula_visitor_since(): """Test the rewrite formula visitor for the before formula.""" - a = PLTLAtomic("a") - b = PLTLAtomic("b") - c = PLTLAtomic("c") - d = PLTLAtomic("d") + a = PLTLAtomic('"a"') + b = PLTLAtomic('"b"') + c = PLTLAtomic('"c"') + d = PLTLAtomic('"d"') a_since_b_since_c_implies_d = Since(a, b, PLTLImplies(c, d)) assert rewrite(a_since_b_since_c_implies_d) == Since(a, Since(b, (~c | d))) def test_rewrite_formula_visitor_once(): """Test the rewrite formula visitor for the once formula.""" - a = PLTLAtomic("a") + a = PLTLAtomic('"a"') once_a = Once(a) assert rewrite(once_a) == once_a def test_rewrite_formula_visitor_historically(): """Test the rewrite formula visitor for the historically formula.""" - a = PLTLAtomic("a") + a = PLTLAtomic('"a"') historically_a = Historically(a) assert rewrite(historically_a) == ~Once(~a) diff --git a/tests/test_utils/test_val_predicates_visitor.py b/tests/test_utils/test_val_predicates_visitor.py index c28f460c..32440eff 100644 --- a/tests/test_utils/test_val_predicates_visitor.py +++ b/tests/test_utils/test_val_predicates_visitor.py @@ -66,7 +66,7 @@ def test_val_predicates_visitor_and(): a = PLTLAtomic("a") b = PLTLAtomic("b") - val_a_and_b = Predicate(add_val_prefix("a-and-b")) + val_a_and_b = Predicate(add_val_prefix("LPAR__a__RPAR-__AND__-LPAR__b__RPAR")) val_a = Predicate(add_val_prefix(a.name)) val_b = Predicate(add_val_prefix(b.name)) @@ -78,7 +78,7 @@ def test_val_predicates_visitor_or(): a = PLTLAtomic("a") b = PLTLAtomic("b") - val_a_or_b = Predicate(add_val_prefix("a-or-b")) + val_a_or_b = Predicate(add_val_prefix("LPAR__a__RPAR-__OR__-LPAR__b__RPAR")) val_a = Predicate(add_val_prefix(a.name)) val_b = Predicate(add_val_prefix(b.name)) @@ -89,7 +89,7 @@ def test_val_predicates_visitor_not(): """Test the val predicates visitor for the not formula.""" a = PLTLAtomic("a") - val_not_a = Predicate(add_val_prefix("not-a")) + val_not_a = Predicate(add_val_prefix("NOT__LPAR__a__RPAR")) val_a = Predicate(add_val_prefix(a.name)) assert val_predicates(~a) == {val_not_a, val_a} @@ -100,7 +100,7 @@ def test_val_predicates_visitor_before(): a = PLTLAtomic("a") before_a = Before(a) - val_before_a = Predicate(add_val_prefix("Ya")) + val_before_a = Predicate(add_val_prefix("YLPAR__a__RPAR")) val_a = Predicate(add_val_prefix(a.name)) assert val_predicates(before_a) == {val_before_a, val_a} @@ -113,8 +113,10 @@ def test_val_predicates_visitor_since(): c = PLTLAtomic("c") a_since_b_since_c = Since(a, b, c) - val_a_since_b_since_c = Predicate(add_val_prefix("a-S-b-S-c")) - val_b_since_c = Predicate(add_val_prefix("b-S-c")) + val_a_since_b_since_c = Predicate( + add_val_prefix("LPAR__a__RPAR-S-LPAR__LPAR__b__RPAR-S-LPAR__c__RPAR__RPAR") + ) + val_b_since_c = Predicate(add_val_prefix("LPAR__b__RPAR-S-LPAR__c__RPAR")) val_a = Predicate(add_val_prefix(a.name)) val_b = Predicate(add_val_prefix(b.name)) val_c = Predicate(add_val_prefix(c.name)) @@ -133,7 +135,7 @@ def test_val_predicates_visitor_once(): a = PLTLAtomic("a") once_a = Once(a) - val_once_a = Predicate(add_val_prefix("Oa")) + val_once_a = Predicate(add_val_prefix("OLPAR__a__RPAR")) val_a = Predicate(add_val_prefix(a.name)) assert val_predicates(once_a) == {val_once_a, val_a}