Storm
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
ToPrefixStringVisitor.cpp
Go to the documentation of this file.
2#include <boost/any.hpp>
3
5
9
10namespace storm {
11namespace logic {
12
14 boost::any result = f.accept(*this, boost::any());
15 return boost::any_cast<std::string>(result);
16}
17
18boost::any ToPrefixStringVisitor::visit(AtomicExpressionFormula const&, boost::any const&) const {
19 STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Can not convert to prefix string");
20}
21
22boost::any ToPrefixStringVisitor::visit(AtomicLabelFormula const& f, boost::any const&) const {
23 return std::string("\"" + f.getLabel() + "\" ");
24}
25
26boost::any ToPrefixStringVisitor::visit(BinaryBooleanStateFormula const& f, boost::any const& data) const {
27 std::string left = boost::any_cast<std::string>(f.getLeftSubformula().accept(*this, data));
28 std::string right = boost::any_cast<std::string>(f.getRightSubformula().accept(*this, data));
29 switch (f.getOperator()) {
30 case BinaryBooleanStateFormula::OperatorType::And:
31 return std::string("& ") + left + " " + right;
32 break;
33 case BinaryBooleanStateFormula::OperatorType::Or:
34 return std::string("| ") + left + " " + right;
35 break;
36 }
37 return boost::any();
38}
39
40boost::any ToPrefixStringVisitor::visit(BinaryBooleanPathFormula const& f, boost::any const& data) const {
41 std::string left = boost::any_cast<std::string>(f.getLeftSubformula().accept(*this, data));
42 std::string right = boost::any_cast<std::string>(f.getRightSubformula().accept(*this, data));
43 switch (f.getOperator()) {
44 case BinaryBooleanPathFormula::OperatorType::And:
45 return std::string("& ") + left + " " + right;
46 break;
47 case BinaryBooleanPathFormula::OperatorType::Or:
48 return std::string("| ") + left + " " + right;
49 break;
50 }
51 return boost::any();
52}
53
54boost::any ToPrefixStringVisitor::visit(BooleanLiteralFormula const& f, boost::any const&) const {
56 if (f.isTrueFormula()) {
57 return std::string("t ");
58 } else {
59 return std::string("f ");
60 }
61 return result;
62}
63
64boost::any ToPrefixStringVisitor::visit(BoundedUntilFormula const& f, boost::any const& data) const {
65 STORM_LOG_THROW(!f.isMultiDimensional(), storm::exceptions::InvalidOperationException,
66 "Can not convert multi dimensional bounded until formula '" << f << "' to prefix string.");
67 STORM_LOG_THROW(!f.getTimeBoundReference().isRewardBound(), storm::exceptions::InvalidOperationException,
68 "Can not convert reward-bounded until formula '" << f << "' to prefix string.");
69
70 std::string left = boost::any_cast<std::string>(f.getLeftSubformula().accept(*this, data));
72 std::string right = boost::any_cast<std::string>(f.getRightSubformula().accept(*this, data));
73
74 // The prefix syntax used by tools like spot, ltl2dstar, ... does not support step bounds, so we have to nest some Xs.
75
76 std::ostringstream out;
77 auto repeat = [&out](uint64_t const& n, std::string const& str) {
78 for (uint64_t i = 0; i < n; ++i) {
79 out << str;
80 }
81 };
82
83 uint64_t lowerBound = f.hasLowerBound() ? f.getNonStrictLowerBound<uint64_t>() : 0ull;
84 if (lTrue) {
85 repeat(lowerBound, "X "); // X [..]
86 } else {
87 repeat(lowerBound, "& " + left + " X "); // ( left & X [..] )
88 }
89
90 if (f.hasUpperBound()) {
91 uint64_t upperBound = f.getNonStrictUpperBound<uint64_t>();
92 STORM_LOG_THROW(upperBound >= lowerBound, storm::exceptions::InvalidPropertyException,
93 "step-bounded formula " << f << " considers an empty step-range.");
94 repeat(upperBound - lowerBound, "| " + right + " & " + left + " X "); // ( right | ( left & X [..] ) )
95 out << right + " ";
96 } else if (lTrue) {
97 out << "F " + right;
98 } else {
99 out << "U " + left + " " + right;
100 }
101 return out.str();
102}
103
104boost::any ToPrefixStringVisitor::visit(ConditionalFormula const&, boost::any const&) const {
105 STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Can not convert to prefix string");
106}
107
108boost::any ToPrefixStringVisitor::visit(CumulativeRewardFormula const&, boost::any const&) const {
109 STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Can not convert to prefix string");
110}
111
112boost::any ToPrefixStringVisitor::visit(EventuallyFormula const& f, boost::any const& data) const {
113 std::string subexpression = boost::any_cast<std::string>(f.getSubformula().accept(*this, data));
114 return std::string("F ") + subexpression;
115}
116
117boost::any ToPrefixStringVisitor::visit(TimeOperatorFormula const&, boost::any const&) const {
118 STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Can not convert to prefix string");
119}
120
121boost::any ToPrefixStringVisitor::visit(GloballyFormula const& f, boost::any const& data) const {
122 std::string subexpression = boost::any_cast<std::string>(f.getSubformula().accept(*this, data));
123 return std::string("G ") + subexpression;
124}
125
126boost::any ToPrefixStringVisitor::visit(GameFormula const&, boost::any const&) const {
127 STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Can not convert to prefix string");
128}
129
130boost::any ToPrefixStringVisitor::visit(InstantaneousRewardFormula const&, boost::any const&) const {
131 STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Can not convert to prefix string");
132}
133
134boost::any ToPrefixStringVisitor::visit(LongRunAverageOperatorFormula const&, boost::any const&) const {
135 STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Can not convert to prefix string");
136}
137
138boost::any ToPrefixStringVisitor::visit(LongRunAverageRewardFormula const&, boost::any const&) const {
139 STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Can not convert to prefix string");
140}
141
142boost::any ToPrefixStringVisitor::visit(MultiObjectiveFormula const&, boost::any const&) const {
143 STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Can not convert to prefix string");
144}
145
146boost::any ToPrefixStringVisitor::visit(QuantileFormula const&, boost::any const&) const {
147 STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Can not convert to prefix string");
148}
149
150boost::any ToPrefixStringVisitor::visit(NextFormula const& f, boost::any const& data) const {
151 std::string subexpression = boost::any_cast<std::string>(f.getSubformula().accept(*this, data));
152 return std::string("X ") + subexpression;
153}
154
155boost::any ToPrefixStringVisitor::visit(ProbabilityOperatorFormula const&, boost::any const&) const {
156 STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Can not convert to prefix string");
157}
158
159boost::any ToPrefixStringVisitor::visit(RewardOperatorFormula const&, boost::any const&) const {
160 STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Can not convert to prefix string");
161}
162
163boost::any ToPrefixStringVisitor::visit(TotalRewardFormula const&, boost::any const&) const {
164 STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Can not convert to prefix string");
165}
166
167boost::any ToPrefixStringVisitor::visit(UnaryBooleanStateFormula const& f, boost::any const& data) const {
168 std::string subexpression = boost::any_cast<std::string>(f.getSubformula().accept(*this, data));
169 switch (f.getOperator()) {
170 case UnaryBooleanStateFormula::OperatorType::Not:
171 return std::string("! ") + subexpression;
172 break;
173 }
174 return boost::any();
175}
176
177boost::any ToPrefixStringVisitor::visit(UnaryBooleanPathFormula const& f, boost::any const& data) const {
178 std::string subexpression = boost::any_cast<std::string>(f.getSubformula().accept(*this, data));
179 switch (f.getOperator()) {
180 case UnaryBooleanPathFormula::OperatorType::Not:
181 return std::string("! ") + subexpression;
182 break;
183 }
184 return boost::any();
185}
186
187boost::any ToPrefixStringVisitor::visit(UntilFormula const& f, boost::any const& data) const {
188 std::string left = boost::any_cast<std::string>(f.getLeftSubformula().accept(*this, data));
189 std::string right = boost::any_cast<std::string>(f.getRightSubformula().accept(*this, data));
190 return std::string("U ") + left + " " + right;
191}
192
193boost::any ToPrefixStringVisitor::visit(HOAPathFormula const&, boost::any const&) const {
194 STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Can not convert to prefix string");
195}
196} // namespace logic
197} // namespace storm
std::string const & getLabel() const
Formula const & getRightSubformula() const
Formula const & getLeftSubformula() const
Formula const & getRightSubformula() const
Formula const & getLeftSubformula() const
virtual bool isTrueFormula() const override
ValueType getNonStrictLowerBound(unsigned i=0) const
TimeBoundReference const & getTimeBoundReference(unsigned i=0) const
ValueType getNonStrictUpperBound(unsigned i=0) const
virtual bool isBooleanLiteralFormula() const
Definition Formula.cpp:60
BooleanLiteralFormula & asBooleanLiteralFormula()
Definition Formula.cpp:285
boost::any accept(FormulaVisitor const &visitor) const
Definition Formula.cpp:16
virtual boost::any visit(AtomicExpressionFormula const &f, boost::any const &data) const override
std::string toPrefixString(Formula const &f) const
Formula const & getSubformula() const
Formula const & getSubformula() const
#define STORM_LOG_THROW(cond, exception, message)
Definition macros.h:30
LabParser.cpp.
Definition cli.cpp:18