Storm 1.14.0.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
TraverseFormulaVisitor.cpp
Go to the documentation of this file.
2
3#include <boost/any.hpp>
4#include <cstdint>
5#include <utility>
6
8
9namespace storm::logic {
10
11TraverseFormulaVisitor::TraverseFormulaVisitor(std::function<bool(Formula const&)> callback) : callback(std::move(callback)) {}
12
14 f.accept(*this, boost::any());
15}
16
17boost::any TraverseFormulaVisitor::visit(AtomicExpressionFormula const& f, boost::any const&) const {
18 callback(f);
19 return boost::any();
20}
21
22boost::any TraverseFormulaVisitor::visit(AtomicLabelFormula const& f, boost::any const&) const {
23 callback(f);
24 return boost::any();
25}
26
27boost::any TraverseFormulaVisitor::visit(BinaryBooleanStateFormula const& f, boost::any const& data) const {
28 if (callback(f)) {
29 f.getLeftSubformula().accept(*this, data);
30 f.getRightSubformula().accept(*this, data);
31 }
32 return boost::any();
33}
34
35boost::any TraverseFormulaVisitor::visit(BinaryBooleanPathFormula const& f, boost::any const& data) const {
36 if (callback(f)) {
37 f.getLeftSubformula().accept(*this, data);
38 f.getRightSubformula().accept(*this, data);
39 }
40 return boost::any();
41}
42
43boost::any TraverseFormulaVisitor::visit(BooleanLiteralFormula const& f, boost::any const&) const {
44 callback(f);
45 return boost::any();
46}
47
48boost::any TraverseFormulaVisitor::visit(BoundedUntilFormula const& f, boost::any const& data) const {
49 if (callback(f)) {
51 for (uint64_t i = 0; i < f.getDimension(); ++i) {
52 f.getLeftSubformula(i).accept(*this, data);
53 f.getRightSubformula(i).accept(*this, data);
54 }
55 } else {
56 // All dimensions share the same subformulas, which we thus only visit once.
57 f.getLeftSubformula().accept(*this, data);
58 f.getRightSubformula().accept(*this, data);
59 }
60 }
61 return boost::any();
62}
63
64boost::any TraverseFormulaVisitor::visit(ConditionalFormula const& f, boost::any const& data) const {
65 if (callback(f)) {
66 f.getSubformula().accept(*this, data);
67 f.getConditionFormula().accept(*this, data);
68 }
69 return boost::any();
70}
71
72boost::any TraverseFormulaVisitor::visit(CumulativeRewardFormula const& f, boost::any const&) const {
73 callback(f);
74 return boost::any();
75}
76
77boost::any TraverseFormulaVisitor::visit(EventuallyFormula const& f, boost::any const& data) const {
78 if (callback(f)) {
79 f.getSubformula().accept(*this, data);
80 }
81 return boost::any();
82}
83
84boost::any TraverseFormulaVisitor::visit(TimeOperatorFormula const& f, boost::any const& data) const {
85 if (callback(f)) {
86 f.getSubformula().accept(*this, data);
87 }
88 return boost::any();
89}
90
91boost::any TraverseFormulaVisitor::visit(GloballyFormula const& f, boost::any const& data) const {
92 if (callback(f)) {
93 f.getSubformula().accept(*this, data);
94 }
95 return boost::any();
96}
97
98boost::any TraverseFormulaVisitor::visit(GameFormula const& f, boost::any const& data) const {
99 if (callback(f)) {
100 f.getSubformula().accept(*this, data);
101 }
102 return boost::any();
103}
104
105boost::any TraverseFormulaVisitor::visit(InstantaneousRewardFormula const& f, boost::any const&) const {
106 callback(f);
107 return boost::any();
108}
109
110boost::any TraverseFormulaVisitor::visit(LongRunAverageOperatorFormula const& f, boost::any const& data) const {
111 if (callback(f)) {
112 f.getSubformula().accept(*this, data);
113 }
114 return boost::any();
115}
116
117boost::any TraverseFormulaVisitor::visit(LongRunAverageRewardFormula const& f, boost::any const&) const {
118 callback(f);
119 return boost::any();
120}
121
122boost::any TraverseFormulaVisitor::visit(MultiObjectiveFormula const& f, boost::any const& data) const {
123 if (callback(f)) {
124 for (auto const& subformula : f.getSubformulas()) {
125 subformula->accept(*this, data);
126 }
127 }
128 return boost::any();
129}
130
131boost::any TraverseFormulaVisitor::visit(QuantileFormula const& f, boost::any const& data) const {
132 if (callback(f)) {
133 f.getSubformula().accept(*this, data);
134 }
135 return boost::any();
136}
137
138boost::any TraverseFormulaVisitor::visit(NextFormula const& f, boost::any const& data) const {
139 if (callback(f)) {
140 f.getSubformula().accept(*this, data);
141 }
142 return boost::any();
143}
144
145boost::any TraverseFormulaVisitor::visit(ProbabilityOperatorFormula const& f, boost::any const& data) const {
146 if (callback(f)) {
147 f.getSubformula().accept(*this, data);
148 }
149 return boost::any();
150}
151
152boost::any TraverseFormulaVisitor::visit(RewardOperatorFormula const& f, boost::any const& data) const {
153 if (callback(f)) {
154 f.getSubformula().accept(*this, data);
155 }
156 return boost::any();
157}
158
159boost::any TraverseFormulaVisitor::visit(TotalRewardFormula const& f, boost::any const&) const {
160 callback(f);
161 return boost::any();
162}
163
164boost::any TraverseFormulaVisitor::visit(UnaryBooleanStateFormula const& f, boost::any const& data) const {
165 if (callback(f)) {
166 f.getSubformula().accept(*this, data);
167 }
168 return boost::any();
169}
170
171boost::any TraverseFormulaVisitor::visit(UnaryBooleanPathFormula const& f, boost::any const& data) const {
172 if (callback(f)) {
173 f.getSubformula().accept(*this, data);
174 }
175 return boost::any();
176}
177
178boost::any TraverseFormulaVisitor::visit(UntilFormula const& f, boost::any const& data) const {
179 if (callback(f)) {
180 f.getLeftSubformula().accept(*this, data);
181 f.getRightSubformula().accept(*this, data);
182 }
183 return boost::any();
184}
185
186boost::any TraverseFormulaVisitor::visit(WeakUntilFormula const& f, boost::any const& data) const {
187 if (callback(f)) {
188 f.getLeftSubformula().accept(*this, data);
189 f.getRightSubformula().accept(*this, data);
190 }
191 return boost::any();
192}
193
194boost::any TraverseFormulaVisitor::visit(ReleaseFormula const& f, boost::any const& data) const {
195 if (callback(f)) {
196 f.getLeftSubformula().accept(*this, data);
197 f.getRightSubformula().accept(*this, data);
198 }
199 return boost::any();
200}
201
202boost::any TraverseFormulaVisitor::visit(HOAPathFormula const& f, boost::any const& data) const {
203 if (callback(f)) {
204 for (auto const& mapped : f.getAPMapping()) {
205 mapped.second->accept(*this, data);
206 }
207 }
208 return boost::any();
209}
210
211boost::any TraverseFormulaVisitor::visit(DiscountedCumulativeRewardFormula const& f, boost::any const&) const {
212 callback(f);
213 return boost::any();
214}
215
216boost::any TraverseFormulaVisitor::visit(DiscountedTotalRewardFormula const& f, boost::any const&) const {
217 callback(f);
218 return boost::any();
219}
220
221} // namespace storm::logic
Formula const & getRightSubformula() const
Formula const & getLeftSubformula() const
Formula const & getRightSubformula() const
Formula const & getLeftSubformula() const
Formula const & getConditionFormula() const
Formula const & getSubformula() const
boost::any accept(FormulaVisitor const &visitor) const
Definition Formula.cpp:17
const ap_to_formula_map & getAPMapping() const
std::vector< std::shared_ptr< Formula const > > const & getSubformulas() const
Formula const & getSubformula() const
void traverse(Formula const &f) const
Visits the given formula and, as far as the callback demands it, its subformulas in pre-order.
TraverseFormulaVisitor(std::function< bool(Formula const &)> callback)
virtual boost::any visit(AtomicExpressionFormula const &f, boost::any const &data) const override
Formula const & getSubformula() const
Formula const & getSubformula() const