Storm 1.14.0.1
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 case BinaryBooleanStateFormula::OperatorType::Or:
33 return std::string("| ") + left + " " + right;
34 }
35 return boost::any();
36}
37
38boost::any ToPrefixStringVisitor::visit(BinaryBooleanPathFormula const& f, boost::any const& data) const {
39 std::string left = boost::any_cast<std::string>(f.getLeftSubformula().accept(*this, data));
40 std::string right = boost::any_cast<std::string>(f.getRightSubformula().accept(*this, data));
41 switch (f.getOperator()) {
42 case BinaryBooleanPathFormula::OperatorType::And:
43 return std::string("& ") + left + " " + right;
44 case BinaryBooleanPathFormula::OperatorType::Or:
45 return std::string("| ") + left + " " + right;
46 }
47 return boost::any();
48}
49
50boost::any ToPrefixStringVisitor::visit(BooleanLiteralFormula const& f, boost::any const&) const {
52 if (f.isTrueFormula()) {
53 return std::string("t ");
54 } else {
55 return std::string("f ");
56 }
57}
58
59boost::any ToPrefixStringVisitor::visit(BoundedUntilFormula const& f, boost::any const& data) const {
60 STORM_LOG_THROW(!f.isMultiDimensional(), storm::exceptions::InvalidOperationException,
61 "Can not convert multi dimensional bounded until formula '" << f << "' to prefix string.");
62 STORM_LOG_THROW(!f.getTimeBoundReference().isRewardBound(), storm::exceptions::InvalidOperationException,
63 "Can not convert reward-bounded until formula '" << f << "' to prefix string.");
64
65 std::string left = boost::any_cast<std::string>(f.getLeftSubformula().accept(*this, data));
67 std::string right = boost::any_cast<std::string>(f.getRightSubformula().accept(*this, data));
68
69 // The prefix syntax used by tools like spot, ltl2dstar, ... does not support step bounds, so we have to nest some Xs.
70
71 std::ostringstream out;
72 auto repeat = [&out](uint64_t const& n, std::string const& str) {
73 for (uint64_t i = 0; i < n; ++i) {
74 out << str;
75 }
76 };
77
78 uint64_t lowerBound = f.hasLowerBound() ? f.getNonStrictLowerBound<uint64_t>() : 0ull;
79 if (lTrue) {
80 repeat(lowerBound, "X "); // X [..]
81 } else {
82 repeat(lowerBound, "& " + left + " X "); // ( left & X [..] )
83 }
84
85 if (f.hasUpperBound()) {
86 uint64_t upperBound = f.getNonStrictUpperBound<uint64_t>();
87 STORM_LOG_THROW(upperBound >= lowerBound, storm::exceptions::InvalidPropertyException,
88 "Step-bounded formula " << f << " considers an empty step-range.");
89 repeat(upperBound - lowerBound, "| " + right + " & " + left + " X "); // ( right | ( left & X [..] ) )
90 out << right + " ";
91 } else if (lTrue) {
92 out << "F " + right;
93 } else {
94 out << "U " + left + " " + right;
95 }
96 return out.str();
97}
98
99boost::any ToPrefixStringVisitor::visit(ConditionalFormula const&, boost::any const&) const {
100 STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Can not convert to prefix string.");
101}
102
103boost::any ToPrefixStringVisitor::visit(CumulativeRewardFormula const&, boost::any const&) const {
104 STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Can not convert to prefix string.");
105}
106
107boost::any ToPrefixStringVisitor::visit(EventuallyFormula const& f, boost::any const& data) const {
108 std::string subexpression = boost::any_cast<std::string>(f.getSubformula().accept(*this, data));
109 return std::string("F ") + subexpression;
110}
111
112boost::any ToPrefixStringVisitor::visit(TimeOperatorFormula const&, boost::any const&) const {
113 STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Can not convert to prefix string.");
114}
115
116boost::any ToPrefixStringVisitor::visit(GloballyFormula const& f, boost::any const& data) const {
117 std::string subexpression = boost::any_cast<std::string>(f.getSubformula().accept(*this, data));
118 return std::string("G ") + subexpression;
119}
120
121boost::any ToPrefixStringVisitor::visit(GameFormula const&, boost::any const&) const {
122 STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Can not convert to prefix string.");
123}
124
125boost::any ToPrefixStringVisitor::visit(InstantaneousRewardFormula const&, boost::any const&) const {
126 STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Can not convert to prefix string.");
127}
128
129boost::any ToPrefixStringVisitor::visit(LongRunAverageOperatorFormula const&, boost::any const&) const {
130 STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Can not convert to prefix string.");
131}
132
133boost::any ToPrefixStringVisitor::visit(LongRunAverageRewardFormula const&, boost::any const&) const {
134 STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Can not convert to prefix string.");
135}
136
137boost::any ToPrefixStringVisitor::visit(MultiObjectiveFormula const&, boost::any const&) const {
138 STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Can not convert to prefix string.");
139}
140
141boost::any ToPrefixStringVisitor::visit(QuantileFormula const&, boost::any const&) const {
142 STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Can not convert to prefix string.");
143}
144
145boost::any ToPrefixStringVisitor::visit(NextFormula const& f, boost::any const& data) const {
146 std::string subexpression = boost::any_cast<std::string>(f.getSubformula().accept(*this, data));
147 return std::string("X ") + subexpression;
148}
149
150boost::any ToPrefixStringVisitor::visit(ProbabilityOperatorFormula const&, boost::any const&) const {
151 STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Can not convert to prefix string.");
152}
153
154boost::any ToPrefixStringVisitor::visit(RewardOperatorFormula const&, boost::any const&) const {
155 STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Can not convert to prefix string.");
156}
157
158boost::any ToPrefixStringVisitor::visit(TotalRewardFormula const&, boost::any const&) const {
159 STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Can not convert to prefix string.");
160}
161
162boost::any ToPrefixStringVisitor::visit(UnaryBooleanStateFormula const& f, boost::any const& data) const {
163 std::string subexpression = boost::any_cast<std::string>(f.getSubformula().accept(*this, data));
164 switch (f.getOperator()) {
165 case UnaryBooleanStateFormula::OperatorType::Not:
166 return std::string("! ") + subexpression;
167 }
168 return boost::any();
169}
170
171boost::any ToPrefixStringVisitor::visit(UnaryBooleanPathFormula const& f, boost::any const& data) const {
172 std::string subexpression = boost::any_cast<std::string>(f.getSubformula().accept(*this, data));
173 switch (f.getOperator()) {
174 case UnaryBooleanPathFormula::OperatorType::Not:
175 return std::string("! ") + subexpression;
176 }
177 return boost::any();
178}
179
180boost::any ToPrefixStringVisitor::visit(UntilFormula const& f, boost::any const& data) const {
181 std::string left = boost::any_cast<std::string>(f.getLeftSubformula().accept(*this, data));
182 std::string right = boost::any_cast<std::string>(f.getRightSubformula().accept(*this, data));
183 return std::string("U ") + left + " " + right;
184}
185
186boost::any ToPrefixStringVisitor::visit(HOAPathFormula const&, boost::any const&) const {
187 STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Can not convert to prefix string.");
188}
189
190boost::any ToPrefixStringVisitor::visit(DiscountedCumulativeRewardFormula const&, boost::any const&) const {
191 STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Can not convert to prefix string.");
192}
193
194boost::any ToPrefixStringVisitor::visit(DiscountedTotalRewardFormula const&, boost::any const&) const {
195 STORM_LOG_THROW(false, storm::exceptions::InvalidOperationException, "Can not convert to prefix string.");
196}
197} // namespace logic
198} // 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:293
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:28