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

1from pylogics_modalities.parsers import parse_pltl 

2 

3from pylogics_modalities.syntax.base import (Formula, And as PLTLAnd) 

4import re 

5 

6 

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)) 

15 

16 return pltl_formula 

17 

18 

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 } 

40 

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) 

47 

48 return "Unknown pattern"