Coverage for src/SymbSyntDec/modify.py: 90%
69 statements
« prev ^ index » next coverage.py v7.5.4, created at 2024-08-11 18:03 +0200
« prev ^ index » next coverage.py v7.5.4, created at 2024-08-11 18:03 +0200
1from pylogics_modalities.parsers import parse_pltl
2from pylogics_modalities.syntax.base import (
3 And as PLTLAnd,
4 Or as PLTLOr,
5 Formula,
6 Implies as PLTLImplies,
7 Not as PLTLNot,
8 _UnaryOp
9)
10from pylogics_modalities.syntax.pltl import (
11 Atomic as PLTLAtomic,
12 Before,
13 WeakBefore,
14 FalseFormula,
15 Historically,
16 Once,
17 PropositionalFalse,
18 PropositionalTrue,
19 Since,
20 Triggers
21)
22from functools import singledispatch
25def modify_unaryop(formula: _UnaryOp):
26 """Modify the sub-formulas for a given formula."""
27 return modify(formula.argument)
30@ singledispatch
31def modify(formula: object) -> Formula:
32 """Modify a formula."""
33 """Modify the formulas to exclude the modalities: Once, Historically; and the logical operation implies."""
34 raise NotImplementedError(
35 f"Modify not implemented for object of type {type(formula)}"
36 )
39@modify.register
40def modify_prop_true(formula: PropositionalTrue) -> Formula:
41 return formula
44@modify.register
45def modify_prop_false(formula: PropositionalFalse) -> Formula:
46 return formula
49@modify.register
50def modify_false(formula: FalseFormula) -> Formula:
51 return formula
54@modify.register
55def modify_atomic(formula: PLTLAtomic) -> Formula:
56 return formula
59@modify.register
60def modify_and(formula: PLTLAnd) -> Formula:
61 """Compute the base formula for all sub-formulas combined with And relation."""
62 sub = [modify(f) for f in formula.operands]
63 return PLTLAnd(*sub)
66@modify.register
67def modify_or(formula: PLTLOr) -> Formula:
68 """Compute the base formula for all sub-formulas combined with Or relation."""
69 sub = [modify(f) for f in formula.operands]
70 return PLTLOr(*sub)
73@modify.register
74def modify_not(formula: PLTLNot) -> Formula:
75 """Compute the base formula of the negated formula."""
76 return PLTLNot(modify_unaryop(formula))
79@modify.register
80def modify_implies(formula: PLTLImplies) -> Formula:
81 """Compute the base formula for an Implies formula. Returns A DNF formula"""
82 head = [PLTLNot(modify(f)) for f in formula.operands[:-1]]
83 tail = modify(formula.operands[-1])
84 return PLTLOr(*head, tail)
87@modify.register
88def modify_yesterday(formula: Before) -> Formula:
89 """Compute the base formula for a Before (Yesterday) formula."""
90 return Before(modify_unaryop(formula))
93@modify.register
94def modify_weak_yesterday(formula: WeakBefore) -> Formula:
95 """Compute the base formula for a WeakBefore (Weak Yesterday) formula."""
96 return WeakBefore(modify_unaryop(formula))
99@modify.register
100def modify_since(formula: Since) -> Formula:
101 """Compute the base formula for a Since formulas."""
102 if len(formula.operands) != 2:
103 head = formula.operands[0]
104 tail = Since(*formula.operands[1:])
105 return modify(Since(head, tail))
106 sub = [modify(f) for f in formula.operands]
107 return Since(*sub)
110@modify.register
111def modify_triggers(formula: Triggers) -> Formula:
112 """Compute the base formula for a Triggers formula."""
113 if len(formula.operands) != 2:
114 head = formula.operands[0]
115 tail = Triggers(*formula.operands[1:])
116 return modify(Triggers(head, tail))
117 sub = [modify(f) for f in formula.operands]
118 return Triggers(*sub)
121@modify.register
122def modify_once(formula: Once) -> Formula:
123 # Compute the base formula for a Once formula.
124 """Modify the modality to Once with use of the computed base formula. Example: "O(a)" translated into "true S a" """
125 sub = [parse_pltl("true"), modify_unaryop(formula)]
126 return Since(*sub)
129@modify.register
130def modify_historically(formula: Historically) -> Formula:
131 """Modify the modality to Since with use of the computed base formula. Example: "H(a)" translated into "false T a" """
132 sub = [parse_pltl("false"), modify_unaryop(formula)]
133 return Triggers(*sub)
136'''
137# Examples:
138formula_str = "!a S H(a)" # should be modifies to ( !a S (false T a))
139print(formula_str)
140formula_pltl = parse_pltl(formula_str)
141print(formula_pltl)
142formula_modified = modify(formula_pltl) # (since (not a) (triggers false a))
143print(formula_modified)
145formula_str = "O a" # should be modifies to (true S a)
146print(formula_str)
147formula_pltl = parse_pltl(formula_str)
148print(formula_pltl)
149# (since PropositionalTrue(Logic.PLTL) a)
150formula_modified = modify(formula_pltl)
151print(formula_modified)
153'''