|
45 | 45 | TRUE_PREDICATE,
|
46 | 46 | )
|
47 | 47 | from plan4past.exceptions import ProblemUnsolvableException
|
48 |
| -from plan4past.helpers.compilation_helper import CompilationManager, YesterdayAtom |
| 48 | +from plan4past.helpers.compilation_helper import ( |
| 49 | + CompilationManager, |
| 50 | + PredicateMapping, |
| 51 | + YesterdayAtom, |
| 52 | +) |
49 | 53 | from plan4past.helpers.utils import (
|
50 | 54 | add_val_prefix,
|
51 | 55 | check_,
|
|
55 | 59 | )
|
56 | 60 | from plan4past.helpers.yesterday_atom_helper import QUOTED_ATOM
|
57 | 61 | from plan4past.utils.atoms_visitor import find_atoms
|
58 |
| -from plan4past.utils.derived_visitor import derived_predicates |
| 62 | +from plan4past.utils.derived_visitor import DerivedPredicatesVisitor |
59 | 63 | from plan4past.utils.dnf_visitor import dnf
|
60 | 64 | from plan4past.utils.nnf_visitor import nnf
|
61 |
| -from plan4past.utils.predicates_visitor import predicates |
| 65 | +from plan4past.utils.predicates_visitor import PredicatesVisitor |
62 | 66 | from plan4past.utils.pylogics2pddl import Pylogics2PddlTranslator
|
63 | 67 | from plan4past.utils.rewrite_formula_visitor import rewrite
|
64 |
| -from plan4past.utils.val_predicates_visitor import val_predicates |
| 68 | +from plan4past.utils.val_predicates_visitor import ValPredicatesVisitor |
65 | 69 |
|
66 | 70 |
|
67 | 71 | class Compiler:
|
@@ -93,6 +97,7 @@ def __init__(
|
93 | 97 |
|
94 | 98 | check_(self.formula.logic == Logic.PLTL, "only PPLTL is supported!")
|
95 | 99 |
|
| 100 | + self._predicate_mapping = PredicateMapping() |
96 | 101 | self._executed: bool = False
|
97 | 102 | self._result_domain: Optional[Domain] = None
|
98 | 103 | self._result_problem: Optional[Problem] = None
|
@@ -134,18 +139,27 @@ def result(self) -> Tuple[Domain, Problem]:
|
134 | 139 |
|
135 | 140 | def compile(self):
|
136 | 141 | """Compute the new domain and the new problem."""
|
137 |
| - if not self._executed: |
138 |
| - self._compile_domain() |
139 |
| - self._compile_problem() |
140 |
| - self._executed = True |
| 142 | + if self._executed: |
| 143 | + return |
| 144 | + |
| 145 | + self._compile_domain() |
| 146 | + self._compile_problem() |
| 147 | + |
| 148 | + self._executed = True |
141 | 149 |
|
142 | 150 | def _compile_domain(self):
|
143 | 151 | """Compute the new domain."""
|
144 |
| - new_predicates = predicates(self.formula).union(val_predicates(self.formula)) |
145 |
| - new_derived_predicates = derived_predicates( |
146 |
| - self.formula, self.from_atoms_to_fluent |
| 152 | + subformula_predicates_set = PredicatesVisitor(self._predicate_mapping).visit( |
| 153 | + self.formula |
| 154 | + ) |
| 155 | + val_predicates_set = ValPredicatesVisitor(self._predicate_mapping).visit( |
| 156 | + self.formula |
147 | 157 | )
|
148 |
| - new_whens = _compute_whens(self.formula) |
| 158 | + new_predicates = subformula_predicates_set.union(val_predicates_set) |
| 159 | + new_derived_predicates = DerivedPredicatesVisitor( |
| 160 | + self._predicate_mapping, self.from_atoms_to_fluent |
| 161 | + ).visit(self.formula) |
| 162 | + new_whens = _compute_whens(subformula_predicates_set) |
149 | 163 | domain_actions = _update_domain_actions_det(self.domain.actions, new_whens)
|
150 | 164 |
|
151 | 165 | self._result_domain = Domain(
|
@@ -174,26 +188,25 @@ def _compile_problem(self):
|
174 | 188 | else set(self.problem.init)
|
175 | 189 | )
|
176 | 190 |
|
| 191 | + goal_predicate = self._predicate_mapping.get_predicate(self.formula) |
177 | 192 | self._result_problem = Problem(
|
178 | 193 | name=self.problem.name,
|
179 | 194 | domain_name=self.domain.name,
|
180 | 195 | requirements=self.problem.requirements,
|
181 | 196 | objects=[*self.problem.objects],
|
182 | 197 | init=new_init,
|
183 |
| - goal=And( |
184 |
| - Predicate(add_val_prefix(replace_symbols(to_string(self.formula)))) |
185 |
| - ), |
| 198 | + goal=And(Predicate(add_val_prefix(goal_predicate.name))), |
186 | 199 | )
|
187 | 200 |
|
188 | 201 |
|
189 |
| -def _compute_whens(formula: Formula) -> Set[When]: |
| 202 | +def _compute_whens(predicates: Set[Predicate]) -> Set[When]: |
190 | 203 | """Compute conditional effects for formula progression."""
|
191 | 204 | return {
|
192 | 205 | When(Predicate(add_val_prefix(remove_yesterday_prefix(p.name))), p)
|
193 |
| - for p in predicates(formula) |
| 206 | + for p in predicates |
194 | 207 | }.union(
|
195 | 208 | When(Not(Predicate(add_val_prefix(remove_yesterday_prefix(p.name)))), Not(p))
|
196 |
| - for p in predicates(formula) |
| 209 | + for p in predicates |
197 | 210 | )
|
198 | 211 |
|
199 | 212 |
|
|
0 commit comments