Storm
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
FragmentChecker.cpp
Go to the documentation of this file.
2
3#include <boost/any.hpp>
5
6namespace storm {
7namespace logic {
9 public:
10 InheritedInformation(FragmentSpecification const& fragmentSpecification) : fragmentSpecification(fragmentSpecification) {
11 // Intentionally left empty.
12 }
13
15 return fragmentSpecification;
16 }
17
18 private:
19 FragmentSpecification const& fragmentSpecification;
20};
21
23 bool result = boost::any_cast<bool>(f.accept(*this, InheritedInformation(specification)));
24
25 if (specification.isOperatorAtTopLevelRequired()) {
26 result &= f.isOperatorFormula();
27 }
29 result &= f.isMultiObjectiveFormula();
30 }
31 if (specification.isQuantileFormulaAtTopLevelRequired()) {
32 result &= f.isQuantileFormula();
33 }
34
35 return result;
36}
37
38boost::any FragmentChecker::visit(AtomicExpressionFormula const&, boost::any const& data) const {
39 InheritedInformation const& inherited = boost::any_cast<InheritedInformation const&>(data);
41}
42
43boost::any FragmentChecker::visit(AtomicLabelFormula const&, boost::any const& data) const {
44 InheritedInformation const& inherited = boost::any_cast<InheritedInformation const&>(data);
46}
47
48boost::any FragmentChecker::visit(BinaryBooleanStateFormula const& f, boost::any const& data) const {
49 InheritedInformation const& inherited = boost::any_cast<InheritedInformation const&>(data);
51 result = result && boost::any_cast<bool>(f.getLeftSubformula().accept(*this, data));
52 result = result && boost::any_cast<bool>(f.getRightSubformula().accept(*this, data));
53 return result;
54}
55
56boost::any FragmentChecker::visit(BinaryBooleanPathFormula const& f, boost::any const& data) const {
57 InheritedInformation const& inherited = boost::any_cast<InheritedInformation const&>(data);
58 bool result = inherited.getSpecification().areBinaryBooleanPathFormulasAllowed();
59 result = result && boost::any_cast<bool>(f.getLeftSubformula().accept(*this, data));
60 result = result && boost::any_cast<bool>(f.getRightSubformula().accept(*this, data));
61 return result;
62}
63
64boost::any FragmentChecker::visit(BooleanLiteralFormula const&, boost::any const& data) const {
65 InheritedInformation const& inherited = boost::any_cast<InheritedInformation const&>(data);
67}
68
69boost::any FragmentChecker::visit(BoundedUntilFormula const& f, boost::any const& data) const {
70 InheritedInformation const& inherited = boost::any_cast<InheritedInformation const&>(data);
71 bool result = inherited.getSpecification().areBoundedUntilFormulasAllowed();
72 if (f.isMultiDimensional()) {
74 }
75
76 for (uint64_t i = 0; i < f.getDimension(); ++i) {
77 auto tbr = f.getTimeBoundReference(i);
78 if (tbr.isStepBound()) {
79 result = result && inherited.getSpecification().areStepBoundedUntilFormulasAllowed();
80 } else if (tbr.isTimeBound()) {
81 result = result && inherited.getSpecification().areTimeBoundedUntilFormulasAllowed();
82 } else {
83 assert(tbr.isRewardBound());
84 result = result && inherited.getSpecification().areRewardBoundedUntilFormulasAllowed();
85 if (tbr.hasRewardAccumulation()) {
86 result = result && inherited.getSpecification().isRewardAccumulationAllowed();
87 }
88 }
89 }
90
92 for (uint64_t i = 0; i < f.getDimension(); ++i) {
94 result = result && !f.getLeftSubformula(i).isPathFormula();
95 result = result && !f.getRightSubformula(i).isPathFormula();
96 }
97 result = result && boost::any_cast<bool>(f.getLeftSubformula(i).accept(*this, data));
98 result = result && boost::any_cast<bool>(f.getRightSubformula(i).accept(*this, data));
99 }
100 } else {
102 result = result && !f.getLeftSubformula().isPathFormula();
103 result = result && !f.getRightSubformula().isPathFormula();
104 }
105 result = result && boost::any_cast<bool>(f.getLeftSubformula().accept(*this, data));
106 result = result && boost::any_cast<bool>(f.getRightSubformula().accept(*this, data));
107 }
108 return result;
109}
110
111boost::any FragmentChecker::visit(ConditionalFormula const& f, boost::any const& data) const {
112 InheritedInformation const& inherited = boost::any_cast<InheritedInformation const&>(data);
113 bool result = true;
115 result = result && inherited.getSpecification().areConditionalProbabilityFormulasAllowed();
116 } else if (f.isConditionalRewardFormula()) {
117 result = result && inherited.getSpecification().areConditionalRewardFormulasFormulasAllowed();
118 }
122 } else if (f.isConditionalRewardFormula()) {
124 }
125 }
126 result = result && boost::any_cast<bool>(f.getSubformula().accept(*this, data));
127 result = result && boost::any_cast<bool>(f.getConditionFormula().accept(*this, data));
128 return result;
129}
130
131boost::any FragmentChecker::visit(CumulativeRewardFormula const& f, boost::any const& data) const {
132 InheritedInformation const& inherited = boost::any_cast<InheritedInformation const&>(data);
133
134 bool result = inherited.getSpecification().areCumulativeRewardFormulasAllowed();
136 result = result && (!f.hasRewardAccumulation() || inherited.getSpecification().isRewardAccumulationAllowed());
137 for (uint64_t i = 0; i < f.getDimension(); ++i) {
138 auto tbr = f.getTimeBoundReference(i);
139 if (tbr.isStepBound()) {
141 } else if (tbr.isTimeBound()) {
143 } else {
144 assert(tbr.isRewardBound());
146 if (tbr.hasRewardAccumulation()) {
147 result = result && inherited.getSpecification().isRewardAccumulationAllowed();
148 }
149 }
150 }
151 return result;
152}
153
154boost::any FragmentChecker::visit(EventuallyFormula const& f, boost::any const& data) const {
155 InheritedInformation const& inherited = boost::any_cast<InheritedInformation const&>(data);
156 bool result = true;
160 result = result && !f.getSubformula().isPathFormula();
161 }
162 result = result && !f.hasRewardAccumulation();
163 } else if (f.isReachabilityRewardFormula()) {
164 result = result && inherited.getSpecification().areReachabilityRewardFormulasAllowed();
165 result = result && f.getSubformula().isStateFormula();
166 result = result && (!f.hasRewardAccumulation() || inherited.getSpecification().isRewardAccumulationAllowed());
167 } else if (f.isReachabilityTimeFormula()) {
168 result = result && inherited.getSpecification().areReachbilityTimeFormulasAllowed();
169 result = result && f.getSubformula().isStateFormula();
170 result = result && (!f.hasRewardAccumulation() || inherited.getSpecification().isRewardAccumulationAllowed());
171 }
172 result = result && boost::any_cast<bool>(f.getSubformula().accept(*this, data));
173 return result;
174}
175
176boost::any FragmentChecker::visit(TimeOperatorFormula const& f, boost::any const& data) const {
177 InheritedInformation const& inherited = boost::any_cast<InheritedInformation const&>(data);
178 bool result = inherited.getSpecification().areTimeOperatorsAllowed();
179 result = result && (!f.hasQualitativeResult() || inherited.getSpecification().areQualitativeOperatorResultsAllowed());
180 result = result && (!f.hasQuantitativeResult() || inherited.getSpecification().areQuantitativeOperatorResultsAllowed());
181 result = result && f.getSubformula().isTimePathFormula();
182 if (!inherited.getSpecification().areNestedOperatorsAllowed()) {
183 result = result &&
184 boost::any_cast<bool>(f.getSubformula().accept(*this, InheritedInformation(inherited.getSpecification().copy().setOperatorsAllowed(false))));
185 } else {
186 result = result && boost::any_cast<bool>(f.getSubformula().accept(*this, data));
187 }
188 return result;
189}
190
191boost::any FragmentChecker::visit(GloballyFormula const& f, boost::any const& data) const {
192 InheritedInformation const& inherited = boost::any_cast<InheritedInformation const&>(data);
193 bool result = inherited.getSpecification().areGloballyFormulasAllowed();
195 result = result && !f.getSubformula().isPathFormula();
196 }
197 result&& boost::any_cast<bool>(f.getSubformula().accept(*this, data));
198 return result;
199}
200
201boost::any FragmentChecker::visit(GameFormula const& f, boost::any const& data) const {
202 InheritedInformation const& inherited = boost::any_cast<InheritedInformation const&>(data);
203 bool result = inherited.getSpecification().areGameFormulasAllowed();
204 return result && boost::any_cast<bool>(f.getSubformula().accept(*this, data));
205}
206
207boost::any FragmentChecker::visit(InstantaneousRewardFormula const&, boost::any const& data) const {
208 InheritedInformation const& inherited = boost::any_cast<InheritedInformation const&>(data);
210}
211
212boost::any FragmentChecker::visit(LongRunAverageOperatorFormula const& f, boost::any const& data) const {
213 InheritedInformation const& inherited = boost::any_cast<InheritedInformation const&>(data);
214 bool result = inherited.getSpecification().areLongRunAverageOperatorsAllowed();
215 result = result && f.getSubformula().isStateFormula();
216 if (!inherited.getSpecification().areNestedOperatorsAllowed()) {
217 result = result &&
218 boost::any_cast<bool>(f.getSubformula().accept(*this, InheritedInformation(inherited.getSpecification().copy().setOperatorsAllowed(false))));
219 } else {
220 result = result && boost::any_cast<bool>(f.getSubformula().accept(*this, data));
221 }
222 return result;
223}
224
225boost::any FragmentChecker::visit(LongRunAverageRewardFormula const& f, boost::any const& data) const {
226 InheritedInformation const& inherited = boost::any_cast<InheritedInformation const&>(data);
227 bool result = (!f.hasRewardAccumulation() || inherited.getSpecification().isRewardAccumulationAllowed());
228 return result && inherited.getSpecification().areLongRunAverageRewardFormulasAllowed();
229}
230
231boost::any FragmentChecker::visit(MultiObjectiveFormula const& f, boost::any const& data) const {
232 InheritedInformation const& inherited = boost::any_cast<InheritedInformation const&>(data);
233
234 FragmentSpecification subFormulaFragment(inherited.getSpecification());
236 subFormulaFragment.setMultiObjectiveFormulasAllowed(false);
237 }
239 subFormulaFragment.setNestedOperatorsAllowed(false);
240 }
241
242 bool result = inherited.getSpecification().areMultiObjectiveFormulasAllowed();
243 for (auto const& subF : f.getSubformulas()) {
245 result = result && subF->isOperatorFormula();
246 }
247 result = result && boost::any_cast<bool>(subF->accept(*this, InheritedInformation(subFormulaFragment)));
248 }
249 return result;
250}
251
252boost::any FragmentChecker::visit(QuantileFormula const& f, boost::any const& data) const {
253 InheritedInformation const& inherited = boost::any_cast<InheritedInformation const&>(data);
254 if (!inherited.getSpecification().areQuantileFormulasAllowed()) {
255 return false;
256 }
257 return f.getSubformula().accept(*this, data);
258}
259
260boost::any FragmentChecker::visit(NextFormula const& f, boost::any const& data) const {
261 InheritedInformation const& inherited = boost::any_cast<InheritedInformation const&>(data);
262 bool result = inherited.getSpecification().areNextFormulasAllowed();
264 result = result && !f.getSubformula().isPathFormula();
265 }
266 result&& boost::any_cast<bool>(f.getSubformula().accept(*this, data));
267 return result;
268}
269
270boost::any FragmentChecker::visit(ProbabilityOperatorFormula const& f, boost::any const& data) const {
271 InheritedInformation const& inherited = boost::any_cast<InheritedInformation const&>(data);
272 bool result = inherited.getSpecification().areProbabilityOperatorsAllowed();
273 result = result && (!f.hasQualitativeResult() || inherited.getSpecification().areQualitativeOperatorResultsAllowed());
274 result = result && (!f.hasQuantitativeResult() || inherited.getSpecification().areQuantitativeOperatorResultsAllowed());
277 if (!inherited.getSpecification().areNestedOperatorsAllowed()) {
278 result = result &&
279 boost::any_cast<bool>(f.getSubformula().accept(*this, InheritedInformation(inherited.getSpecification().copy().setOperatorsAllowed(false))));
280 } else {
281 result = result && boost::any_cast<bool>(f.getSubformula().accept(*this, data));
282 }
283 return result;
284}
285
286boost::any FragmentChecker::visit(RewardOperatorFormula const& f, boost::any const& data) const {
287 InheritedInformation const& inherited = boost::any_cast<InheritedInformation const&>(data);
288 bool result = inherited.getSpecification().areRewardOperatorsAllowed();
289 result = result && (!f.hasQualitativeResult() || inherited.getSpecification().areQualitativeOperatorResultsAllowed());
290 result = result && (!f.hasQuantitativeResult() || inherited.getSpecification().areQuantitativeOperatorResultsAllowed());
292
293 if (!inherited.getSpecification().areNestedOperatorsAllowed()) {
294 result = result &&
295 boost::any_cast<bool>(f.getSubformula().accept(*this, InheritedInformation(inherited.getSpecification().copy().setOperatorsAllowed(false))));
296 } else {
297 result = result && boost::any_cast<bool>(f.getSubformula().accept(*this, data));
298 }
299 return result;
300}
301
302boost::any FragmentChecker::visit(TotalRewardFormula const& f, boost::any const& data) const {
303 InheritedInformation const& inherited = boost::any_cast<InheritedInformation const&>(data);
304 bool result = (!f.hasRewardAccumulation() || inherited.getSpecification().isRewardAccumulationAllowed());
305 result = result && inherited.getSpecification().areTotalRewardFormulasAllowed();
306 return result;
307}
308
309boost::any FragmentChecker::visit(UnaryBooleanStateFormula const& f, boost::any const& data) const {
310 InheritedInformation const& inherited = boost::any_cast<InheritedInformation const&>(data);
311 bool result = inherited.getSpecification().areUnaryBooleanStateFormulasAllowed();
312 result = result && boost::any_cast<bool>(f.getSubformula().accept(*this, data));
313 return result;
314}
315
316boost::any FragmentChecker::visit(UnaryBooleanPathFormula const& f, boost::any const& data) const {
317 InheritedInformation const& inherited = boost::any_cast<InheritedInformation const&>(data);
318 bool result = inherited.getSpecification().areUnaryBooleanPathFormulasAllowed();
319 result = result && boost::any_cast<bool>(f.getSubformula().accept(*this, data));
320 return result;
321}
322
323boost::any FragmentChecker::visit(UntilFormula const& f, boost::any const& data) const {
324 InheritedInformation const& inherited = boost::any_cast<InheritedInformation const&>(data);
325 bool result = inherited.getSpecification().areUntilFormulasAllowed();
327 result = result && !f.getLeftSubformula().isPathFormula();
328 result = result && !f.getRightSubformula().isPathFormula();
329 }
330 result = result && boost::any_cast<bool>(f.getLeftSubformula().accept(*this, data));
331 result = result && boost::any_cast<bool>(f.getRightSubformula().accept(*this, data));
332 return result;
333}
334
335boost::any FragmentChecker::visit(HOAPathFormula const& f, boost::any const& data) const {
336 InheritedInformation const& inherited = boost::any_cast<InheritedInformation const&>(data);
337 bool result = inherited.getSpecification().areHOAPathFormulasAllowed();
338 for (auto& mapped : f.getAPMapping()) {
339 result = result && boost::any_cast<bool>(mapped.second->accept(*this, data));
340 }
341 return result;
342}
343} // namespace logic
344} // namespace storm
Formula const & getRightSubformula() const
Formula const & getLeftSubformula() const
Formula const & getRightSubformula() const
Formula const & getLeftSubformula() const
TimeBoundReference const & getTimeBoundReference(unsigned i=0) const
virtual bool isConditionalRewardFormula() const override
Formula const & getConditionFormula() const
Formula const & getSubformula() const
virtual bool isConditionalProbabilityFormula() const override
TimeBoundReference const & getTimeBoundReference() const
virtual bool isReachabilityRewardFormula() const override
virtual bool isReachabilityProbabilityFormula() const override
virtual bool isReachabilityTimeFormula() const override
virtual bool isReachabilityRewardFormula() const
Definition Formula.cpp:152
virtual bool isProbabilityPathFormula() const
Definition Formula.cpp:120
virtual bool isMultiObjectiveFormula() const
Definition Formula.cpp:28
virtual bool isRewardPathFormula() const
Definition Formula.cpp:124
virtual bool isOperatorFormula() const
Definition Formula.cpp:180
virtual bool isQuantileFormula() const
Definition Formula.cpp:32
virtual bool isReachabilityProbabilityFormula() const
Definition Formula.cpp:92
virtual bool isPathFormula() const
Definition Formula.cpp:20
virtual bool isTimePathFormula() const
Definition Formula.cpp:128
virtual bool isEventuallyFormula() const
Definition Formula.cpp:88
virtual bool isConditionalRewardFormula() const
Definition Formula.cpp:116
virtual bool isStateFormula() const
Definition Formula.cpp:24
virtual bool isConditionalProbabilityFormula() const
Definition Formula.cpp:112
boost::any accept(FormulaVisitor const &visitor) const
Definition Formula.cpp:16
bool conformsToSpecification(Formula const &f, FragmentSpecification const &specification) const
virtual boost::any visit(AtomicExpressionFormula const &f, boost::any const &data) const override
FragmentSpecification & setMultiObjectiveFormulasAllowed(bool newValue)
FragmentSpecification & setOperatorsAllowed(bool newValue)
FragmentSpecification & setNestedOperatorsAllowed(bool newValue)
const ap_to_formula_map & getAPMapping() const
FragmentSpecification const & getSpecification() const
InheritedInformation(FragmentSpecification const &fragmentSpecification)
std::vector< std::shared_ptr< Formula const > > const & getSubformulas() const
virtual bool hasQualitativeResult() const override
virtual bool hasQuantitativeResult() const override
Formula const & getSubformula() const
Formula const & getSubformula() const
Formula const & getSubformula() const
LabParser.cpp.
Definition cli.cpp:18