Coverage for src/SymbSyntDec/past.py: 28%
18 statements
« prev ^ index » next coverage.py v7.5.4, created at 2024-08-11 18:00 +0200
« prev ^ index » next coverage.py v7.5.4, created at 2024-08-11 18:00 +0200
1from pylogics_modalities.parsers import parse_pltl
3from pylogics_modalities.syntax.base import (Formula, And as PLTLAnd)
4import re
7def past_declare_pattern(declare_pattern_set) -> Formula:
8 pltl_formula = None
9 for element in declare_pattern_set:
10 if pltl_formula is None:
11 pltl_formula = past_declare_pattern_call(element)
12 else:
13 pltl_formula = PLTLAnd(
14 pltl_formula, past_declare_pattern_call(element))
16 return pltl_formula
19def past_declare_pattern_call(declare_pattern) -> str:
20 transformations = {
21 r"existence\(\s*(.+?)\s*\)": "O({p})",
22 r"absence2\(\s*(.+?)\s*\)": "H({p} -> Z H(!{p}))",
23 r"choice\(\s*(.+?)\s*,\s*(.+?)\s*\)": "O({p} | {q})",
24 r"exc-choice\(\s*(.+?)\s*,\s*(.+?)\s*\)": "O({p} | {q}) & (H(!{p}) | H(!{q}))",
25 r"resp-existence\(\s*(.+?)\s*,\s*(.+?)\s*\)": "H(!{p}) | O({q})",
26 r"coexistence\(\s*(.+?)\s*,\s*(.+?)\s*\)": "(H(!{p}) | O({q})) & (H(!{q}) | O({p}))",
27 r"response\(\s*(.+?)\s*,\s*(.+?)\s*\)": "{q} T (!{p} | {q})",
28 r"precedence\(\s*(.+?)\s*,\s*(.+?)\s*\)": "H({q} -> O({p}))",
29 r"succession\(\s*(.+?)\s*,\s*(.+?)\s*\)": "{p} T (!{p} | {q}) & H({q} -> O({p}))",
30 r"alt-response\(\s*(.+?)\s*,\s*(.+?)\s*\)": "({p} | {q}) T (!{p}) & H({q} -> Z({q} T (({p}|!{q})&Z({q} T (!{p})))))",
31 r"alt-precedence\(\s*(.+?)\s*,\s*(.+?)\s*\)": "H({q} -> O({p})) & H({q} & !{p} -> Z({q} T ({q} & !{p})))",
32 r"alt-succession\(\s*(.+?)\s*,\s*(.+?)\s*\)": "( ({p} | {q}) T (!{p}) & H({q} -> Z({q} T (({p}|!{q})&Z({q} T (!{p}))))) ) & ( H({q} -> O({p})) & H({q} & !{p} -> Z({q} T ({q} & !{p}))) )",
33 r"chain-response\(\s*(.+?)\s*,\s*(.+?)\s*\)": "!{p} & H(!{q} | ({p} -> {q}))",
34 r"chain-precedence\(\s*(.+?)\s*,\s*(.+?)\s*\)": "H({q} -> Z({p}))",
35 r"chain-succession\(\s*(.+?)\s*,\s*(.+?)\s*\)": "(!{p} & H(!{q} | ({p} -> {q}))) & (H({q} -> Z({p})))",
36 r"not-coexistence\(\s*(.+?)\s*,\s*(.+?)\s*\)": "H(!{p} | H(!{q}))",
37 r"neg-succession\(\s*(.+?)\s*,\s*(.+?)\s*\)": "H(!{p} | {q}) S ({p} & !{q} & Z H(!{p}))",
38 r"neg-chain-succession\(\s*(.+?)\s*,\s*(.+?)\s*\)": "H(Y({q} -> !{q}) & H(Y({q} -> !{p})))"
39 }
41 for pattern, template in transformations.items():
42 match = re.fullmatch(pattern, declare_pattern)
43 if match:
44 formatted_template = template.format(p=match.group(
45 1), q=match.group(2) if len(match.groups()) > 1 else None)
46 return parse_pltl(formatted_template)
48 return "Unknown pattern"