Storm 1.11.1.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
SmtConstraint.cpp
Go to the documentation of this file.
2
4
5namespace storm::dft {
6namespace modelchecker {
7
8std::string IsMaximum::toSmtlib2(std::vector<std::string> const &varNames) const {
9 std::stringstream sstr;
10 sstr << "(and ";
11 // assert it is largereq than all values.
12 for (auto const &ovi : varIndices) {
13 sstr << "(>= " << varNames.at(varIndex) << " " << varNames.at(ovi) << ") ";
14 }
15 // assert it is one of the values.
16 sstr << "(or ";
17 for (auto const &ovi : varIndices) {
18 sstr << "(= " << varNames.at(varIndex) << " " << varNames.at(ovi) << ") ";
19 }
20 sstr << ")"; // end of the or
21 sstr << ")"; // end outer and.
22 return sstr.str();
23}
24
25storm::expressions::Expression IsMaximum::toExpression(std::vector<std::string> const &varNames,
26 std::shared_ptr<storm::expressions::ExpressionManager> manager) const {
27 std::vector<storm::expressions::Expression> outerAnd;
28 std::vector<storm::expressions::Expression> innerOr;
29 for (auto const &ovi : varIndices) {
30 outerAnd.push_back((manager->getVariableExpression(varNames.at(varIndex)) >= manager->getVariableExpression(varNames.at(ovi))));
31 innerOr.push_back((manager->getVariableExpression(varNames.at(varIndex)) == manager->getVariableExpression(varNames.at(ovi))));
32 }
33 outerAnd.push_back(disjunction(innerOr));
34 return conjunction(outerAnd);
35}
36
37std::string IsMinimum::toSmtlib2(std::vector<std::string> const &varNames) const {
38 std::stringstream sstr;
39 sstr << "(and ";
40 // assert it is smallereq than all values.
41 for (auto const &ovi : varIndices) {
42 sstr << "(<= " << varNames.at(varIndex) << " " << varNames.at(ovi) << ") ";
43 }
44 // assert it is one of the values.
45 sstr << "(or ";
46 for (auto const &ovi : varIndices) {
47 sstr << "(= " << varNames.at(varIndex) << " " << varNames.at(ovi) << ") ";
48 }
49 sstr << ")"; // end of the or
50 sstr << ")"; // end outer and.
51 return sstr.str();
52}
53
54storm::expressions::Expression IsMinimum::toExpression(std::vector<std::string> const &varNames,
55 std::shared_ptr<storm::expressions::ExpressionManager> manager) const {
56 std::vector<storm::expressions::Expression> outerAnd;
57 std::vector<storm::expressions::Expression> innerOr;
58 for (auto const &ovi : varIndices) {
59 outerAnd.push_back((manager->getVariableExpression(varNames.at(varIndex)) <= manager->getVariableExpression(varNames.at(ovi))));
60 innerOr.push_back((manager->getVariableExpression(varNames.at(varIndex)) == manager->getVariableExpression(varNames.at(ovi))));
61 }
62 outerAnd.push_back(disjunction(innerOr));
63 return conjunction(outerAnd);
64}
65
66std::string BetweenValues::toSmtlib2(std::vector<std::string> const &varNames) const {
67 std::stringstream sstr;
68 sstr << "(and ";
69 sstr << "(>= " << varNames.at(varIndex) << " " << lowerBound << ")";
70 sstr << "(<= " << varNames.at(varIndex) << " " << upperBound << ")";
71 sstr << ")";
72 return sstr.str();
73}
74
75storm::expressions::Expression BetweenValues::toExpression(std::vector<std::string> const &varNames,
76 std::shared_ptr<storm::expressions::ExpressionManager> manager) const {
77 return (manager->getVariableExpression(varNames.at(varIndex)) >= lowerBound) && (manager->getVariableExpression(varNames.at(varIndex)) <= upperBound);
78}
79
80std::string And::toSmtlib2(std::vector<std::string> const &varNames) const {
81 std::stringstream sstr;
82 if (constraints.empty()) {
83 sstr << "true";
84 } else {
85 sstr << "(and";
86 for (auto const &c : constraints) {
87 sstr << " " << c->toSmtlib2(varNames);
88 }
89 sstr << ")";
90 }
91 return sstr.str();
92}
93
94storm::expressions::Expression And::toExpression(std::vector<std::string> const &varNames,
95 std::shared_ptr<storm::expressions::ExpressionManager> manager) const {
96 if (constraints.empty()) {
97 return manager->boolean(true);
98 } else {
99 std::vector<storm::expressions::Expression> conjuncts;
100 for (auto const &c : constraints) {
101 conjuncts.push_back(c->toExpression(varNames, manager));
102 }
103 return conjunction(conjuncts);
104 }
105}
106
107std::string Or::toSmtlib2(std::vector<std::string> const &varNames) const {
108 std::stringstream sstr;
109 if (constraints.empty()) {
110 sstr << "false";
111 } else {
112 sstr << "(or";
113 for (auto const &c : constraints) {
114 sstr << " " << c->toSmtlib2(varNames);
115 }
116 sstr << ")";
117 }
118 return sstr.str();
119}
120
121storm::expressions::Expression Or::toExpression(std::vector<std::string> const &varNames,
122 std::shared_ptr<storm::expressions::ExpressionManager> manager) const {
123 if (constraints.empty()) {
124 return manager->boolean(false);
125 } else {
126 std::vector<storm::expressions::Expression> disjuncts;
127 for (auto const &c : constraints) {
128 disjuncts.push_back(c->toExpression(varNames, manager));
129 }
130 return disjunction(disjuncts);
131 }
132}
133
134std::string Implies::toSmtlib2(std::vector<std::string> const &varNames) const {
135 std::stringstream sstr;
136 sstr << "(=> " << lhs->toSmtlib2(varNames) << " " << rhs->toSmtlib2(varNames) << ")";
137 return sstr.str();
138}
139
140storm::expressions::Expression Implies::toExpression(std::vector<std::string> const &varNames,
141 std::shared_ptr<storm::expressions::ExpressionManager> manager) const {
142 return implies(lhs->toExpression(varNames, manager), rhs->toExpression(varNames, manager));
143}
144
145std::string Iff::toSmtlib2(std::vector<std::string> const &varNames) const {
146 std::stringstream sstr;
147 sstr << "(= " << lhs->toSmtlib2(varNames) << " " << rhs->toSmtlib2(varNames) << ")";
148 return sstr.str();
149}
150
151storm::expressions::Expression Iff::toExpression(std::vector<std::string> const &varNames,
152 std::shared_ptr<storm::expressions::ExpressionManager> manager) const {
153 return iff(lhs->toExpression(varNames, manager), rhs->toExpression(varNames, manager));
154}
155
156std::string IsTrue::toSmtlib2(std::vector<std::string> const &varNames) const {
157 std::stringstream sstr;
158 sstr << (value ? "true" : "false");
159 return sstr.str();
160}
161
162storm::expressions::Expression IsTrue::toExpression(std::vector<std::string> const &varNames,
163 std::shared_ptr<storm::expressions::ExpressionManager> manager) const {
164 return manager->boolean(value);
165}
166
167std::string IsBoolValue::toSmtlib2(std::vector<std::string> const &varNames) const {
168 std::stringstream sstr;
169 assert(varIndex < varNames.size());
170 if (value) {
171 sstr << varNames.at(varIndex);
172 } else {
173 sstr << "(not " << varNames.at(varIndex) << ")";
174 }
175 return sstr.str();
176}
177
178storm::expressions::Expression IsBoolValue::toExpression(std::vector<std::string> const &varNames,
179 std::shared_ptr<storm::expressions::ExpressionManager> manager) const {
180 if (value) {
181 return manager->getVariableExpression(varNames.at(varIndex));
182 } else {
183 return !(manager->getVariableExpression(varNames.at(varIndex)));
184 }
185}
186
187std::string IsConstantValue::toSmtlib2(std::vector<std::string> const &varNames) const {
188 std::stringstream sstr;
189 assert(varIndex < varNames.size());
190 sstr << "(= " << varNames.at(varIndex) << " " << value << ")";
191 return sstr.str();
192}
193
194storm::expressions::Expression IsConstantValue::toExpression(std::vector<std::string> const &varNames,
195 std::shared_ptr<storm::expressions::ExpressionManager> manager) const {
196 return manager->getVariableExpression(varNames.at(varIndex)) == manager->integer(value);
197}
198
199std::string IsNotConstantValue::toSmtlib2(std::vector<std::string> const &varNames) const {
200 std::stringstream sstr;
201 assert(varIndex < varNames.size());
202 sstr << "(distinct " << varNames.at(varIndex) << " " << value << ")";
203 return sstr.str();
204}
205
207 std::shared_ptr<storm::expressions::ExpressionManager> manager) const {
208 return manager->getVariableExpression(varNames.at(varIndex)) != manager->integer(value);
209}
210
211std::string IsLessConstant::toSmtlib2(std::vector<std::string> const &varNames) const {
212 std::stringstream sstr;
213 assert(varIndex < varNames.size());
214 sstr << "(< " << varNames.at(varIndex) << " " << value << ")";
215 return sstr.str();
216}
217
218storm::expressions::Expression IsLessConstant::toExpression(std::vector<std::string> const &varNames,
219 std::shared_ptr<storm::expressions::ExpressionManager> manager) const {
220 return manager->getVariableExpression(varNames.at(varIndex)) < value;
221}
222
223std::string IsLessEqualConstant::toSmtlib2(std::vector<std::string> const &varNames) const {
224 std::stringstream sstr;
225 assert(varIndex < varNames.size());
226 sstr << "(<= " << varNames.at(varIndex) << " " << value << ")";
227 return sstr.str();
228}
229
231 std::shared_ptr<storm::expressions::ExpressionManager> manager) const {
232 return manager->getVariableExpression(varNames.at(varIndex)) <= value;
233}
234
235std::string IsEqual::toSmtlib2(std::vector<std::string> const &varNames) const {
236 return "(= " + varNames.at(var1Index) + " " + varNames.at(var2Index) + ")";
237}
238
239storm::expressions::Expression IsEqual::toExpression(std::vector<std::string> const &varNames,
240 std::shared_ptr<storm::expressions::ExpressionManager> manager) const {
241 return manager->getVariableExpression(varNames.at(var1Index)) == manager->getVariableExpression(varNames.at(var2Index));
242}
243
244std::string IsUnequal::toSmtlib2(std::vector<std::string> const &varNames) const {
245 return "(distinct " + varNames.at(var1Index) + " " + varNames.at(var2Index) + ")";
246}
247
248storm::expressions::Expression IsUnequal::toExpression(std::vector<std::string> const &varNames,
249 std::shared_ptr<storm::expressions::ExpressionManager> manager) const {
250 return manager->getVariableExpression(varNames.at(var1Index)) != manager->getVariableExpression(varNames.at(var2Index));
251}
252
253std::string IsLess::toSmtlib2(std::vector<std::string> const &varNames) const {
254 return "(< " + varNames.at(var1Index) + " " + varNames.at(var2Index) + ")";
255}
256
257storm::expressions::Expression IsLess::toExpression(std::vector<std::string> const &varNames,
258 std::shared_ptr<storm::expressions::ExpressionManager> manager) const {
259 return manager->getVariableExpression(varNames.at(var1Index)) < manager->getVariableExpression(varNames.at(var2Index));
260}
261
262std::string IsLessEqual::toSmtlib2(std::vector<std::string> const &varNames) const {
263 return "(<= " + varNames.at(var1Index) + " " + varNames.at(var2Index) + ")";
264}
265
266storm::expressions::Expression IsLessEqual::toExpression(std::vector<std::string> const &varNames,
267 std::shared_ptr<storm::expressions::ExpressionManager> manager) const {
268 return manager->getVariableExpression(varNames.at(var1Index)) <= manager->getVariableExpression(varNames.at(var2Index));
269}
270
271std::string PairwiseDifferent::toSmtlib2(std::vector<std::string> const &varNames) const {
272 std::stringstream sstr;
273 sstr << "(distinct";
274 for (auto const &varIndex : varIndices) {
275 sstr << " " << varNames.at(varIndex);
276 }
277 sstr << ")";
278 return sstr.str();
279}
280
282 std::shared_ptr<storm::expressions::ExpressionManager> manager) const {
283 std::vector<storm::expressions::Expression> conjuncts;
284 for (uint64_t i = 0; i < varIndices.size(); ++i) {
285 for (uint64_t j = i + 1; j < varIndices.size(); ++j) {
286 // check all elements pairwise for inequality
287 conjuncts.push_back(manager->getVariableExpression(varNames.at(varIndices.at(i))) != manager->getVariableExpression(varNames.at(varIndices.at(j))));
288 }
289 }
290 // take the conjunction of all pairwise inequalities
291 return conjunction(conjuncts);
292}
293
294std::string Sorted::toSmtlib2(std::vector<std::string> const &varNames) const {
295 std::stringstream sstr;
296 sstr << "(and ";
297 for (uint64_t i = 1; i < varIndices.size(); ++i) {
298 sstr << "(<= " << varNames.at(varIndices.at(i - 1)) << " " << varNames.at(varIndices.at(i)) << ")";
299 }
300 sstr << ") ";
301 return sstr.str();
302}
303
304storm::expressions::Expression Sorted::toExpression(std::vector<std::string> const &varNames,
305 std::shared_ptr<storm::expressions::ExpressionManager> manager) const {
306 std::vector<storm::expressions::Expression> conjuncts;
307 for (uint64_t i = 1; i < varIndices.size(); ++i) {
308 conjuncts.push_back(manager->getVariableExpression(varNames.at(varIndices.at(i - 1))) <= manager->getVariableExpression(varNames.at(varIndices.at(i))));
309 }
310 // take the conjunction of all pairwise inequalities
311 return conjunction(conjuncts);
312}
313
314std::string IfThenElse::toSmtlib2(std::vector<std::string> const &varNames) const {
315 std::stringstream sstr;
316 sstr << "(ite " << ifConstraint->toSmtlib2(varNames) << " " << thenConstraint->toSmtlib2(varNames) << " " << elseConstraint->toSmtlib2(varNames) << ")";
317 return sstr.str();
318}
319
320storm::expressions::Expression IfThenElse::toExpression(std::vector<std::string> const &varNames,
321 std::shared_ptr<storm::expressions::ExpressionManager> manager) const {
322 return ite(ifConstraint->toExpression(varNames, manager), thenConstraint->toExpression(varNames, manager), elseConstraint->toExpression(varNames, manager));
323}
324
325std::string FalseCountIsEqualConstant::toSmtlib2(std::vector<std::string> const &varNames) const {
326 std::stringstream sstr;
327 sstr << "(= (+ ";
328 for (uint64_t i = 0; i < varIndices.size(); ++i) {
329 sstr << "(ite " << varNames.at(varIndices.at(i)) << " 0 1 )";
330 }
331 sstr << ") " << value << " )";
332 return sstr.str();
333}
334
336 std::shared_ptr<storm::expressions::ExpressionManager> manager) const {
337 std::vector<storm::expressions::Expression> boolToInt;
338 for (uint64_t i = 0; i < varIndices.size(); ++i) {
339 boolToInt.push_back(ite(manager->getVariableExpression(varNames.at(varIndices.at(i))), // If variable is true
340 manager->integer(0), // set 0
341 manager->integer(1))); // else 1
342 }
343 return sum(boolToInt) == manager->integer(value);
344}
345
346} // namespace modelchecker
347} // namespace storm::dft
std::string toSmtlib2(std::vector< std::string > const &varNames) const override
Generate a string describing the constraint in Smtlib2 format.
storm::expressions::Expression toExpression(std::vector< std::string > const &varNames, std::shared_ptr< storm::expressions::ExpressionManager > manager) const override
Generate an expression describing the constraint in Storm format.
std::string toSmtlib2(std::vector< std::string > const &varNames) const override
Generate a string describing the constraint in Smtlib2 format.
storm::expressions::Expression toExpression(std::vector< std::string > const &varNames, std::shared_ptr< storm::expressions::ExpressionManager > manager) const override
Generate an expression describing the constraint in Storm format.
std::string toSmtlib2(std::vector< std::string > const &varNames) const override
Generate a string describing the constraint in Smtlib2 format.
storm::expressions::Expression toExpression(std::vector< std::string > const &varNames, std::shared_ptr< storm::expressions::ExpressionManager > manager) const override
Generate an expression describing the constraint in Storm format.
std::string toSmtlib2(std::vector< std::string > const &varNames) const override
Generate a string describing the constraint in Smtlib2 format.
storm::expressions::Expression toExpression(std::vector< std::string > const &varNames, std::shared_ptr< storm::expressions::ExpressionManager > manager) const override
Generate an expression describing the constraint in Storm format.
storm::expressions::Expression toExpression(std::vector< std::string > const &varNames, std::shared_ptr< storm::expressions::ExpressionManager > manager) const override
Generate an expression describing the constraint in Storm format.
std::string toSmtlib2(std::vector< std::string > const &varNames) const override
Generate a string describing the constraint in Smtlib2 format.
storm::expressions::Expression toExpression(std::vector< std::string > const &varNames, std::shared_ptr< storm::expressions::ExpressionManager > manager) const override
Generate an expression describing the constraint in Storm format.
std::string toSmtlib2(std::vector< std::string > const &varNames) const override
Generate a string describing the constraint in Smtlib2 format.
std::string toSmtlib2(std::vector< std::string > const &varNames) const override
Generate a string describing the constraint in Smtlib2 format.
storm::expressions::Expression toExpression(std::vector< std::string > const &varNames, std::shared_ptr< storm::expressions::ExpressionManager > manager) const override
Generate an expression describing the constraint in Storm format.
storm::expressions::Expression toExpression(std::vector< std::string > const &varNames, std::shared_ptr< storm::expressions::ExpressionManager > manager) const override
Generate an expression describing the constraint in Storm format.
std::string toSmtlib2(std::vector< std::string > const &varNames) const override
Generate a string describing the constraint in Smtlib2 format.
std::string toSmtlib2(std::vector< std::string > const &varNames) const override
Generate a string describing the constraint in Smtlib2 format.
storm::expressions::Expression toExpression(std::vector< std::string > const &varNames, std::shared_ptr< storm::expressions::ExpressionManager > manager) const override
Generate an expression describing the constraint in Storm format.
std::string toSmtlib2(std::vector< std::string > const &varNames) const override
Generate a string describing the constraint in Smtlib2 format.
storm::expressions::Expression toExpression(std::vector< std::string > const &varNames, std::shared_ptr< storm::expressions::ExpressionManager > manager) const override
Generate an expression describing the constraint in Storm format.
std::string toSmtlib2(std::vector< std::string > const &varNames) const override
Generate a string describing the constraint in Smtlib2 format.
storm::expressions::Expression toExpression(std::vector< std::string > const &varNames, std::shared_ptr< storm::expressions::ExpressionManager > manager) const override
Generate an expression describing the constraint in Storm format.
std::string toSmtlib2(std::vector< std::string > const &varNames) const override
Generate a string describing the constraint in Smtlib2 format.
storm::expressions::Expression toExpression(std::vector< std::string > const &varNames, std::shared_ptr< storm::expressions::ExpressionManager > manager) const override
Generate an expression describing the constraint in Storm format.
std::string toSmtlib2(std::vector< std::string > const &varNames) const override
Generate a string describing the constraint in Smtlib2 format.
storm::expressions::Expression toExpression(std::vector< std::string > const &varNames, std::shared_ptr< storm::expressions::ExpressionManager > manager) const override
Generate an expression describing the constraint in Storm format.
storm::expressions::Expression toExpression(std::vector< std::string > const &varNames, std::shared_ptr< storm::expressions::ExpressionManager > manager) const override
Generate an expression describing the constraint in Storm format.
std::string toSmtlib2(std::vector< std::string > const &varNames) const override
Generate a string describing the constraint in Smtlib2 format.
storm::expressions::Expression toExpression(std::vector< std::string > const &varNames, std::shared_ptr< storm::expressions::ExpressionManager > manager) const override
Generate an expression describing the constraint in Storm format.
std::string toSmtlib2(std::vector< std::string > const &varNames) const override
Generate a string describing the constraint in Smtlib2 format.
storm::expressions::Expression toExpression(std::vector< std::string > const &varNames, std::shared_ptr< storm::expressions::ExpressionManager > manager) const override
Generate an expression describing the constraint in Storm format.
std::string toSmtlib2(std::vector< std::string > const &varNames) const override
Generate a string describing the constraint in Smtlib2 format.
std::string toSmtlib2(std::vector< std::string > const &varNames) const override
Generate a string describing the constraint in Smtlib2 format.
storm::expressions::Expression toExpression(std::vector< std::string > const &varNames, std::shared_ptr< storm::expressions::ExpressionManager > manager) const override
Generate an expression describing the constraint in Storm format.
storm::expressions::Expression toExpression(std::vector< std::string > const &varNames, std::shared_ptr< storm::expressions::ExpressionManager > manager) const override
Generate an expression describing the constraint in Storm format.
std::string toSmtlib2(std::vector< std::string > const &varNames) const override
Generate a string describing the constraint in Smtlib2 format.
std::string toSmtlib2(std::vector< std::string > const &varNames) const override
Generate a string describing the constraint in Smtlib2 format.
storm::expressions::Expression toExpression(std::vector< std::string > const &varNames, std::shared_ptr< storm::expressions::ExpressionManager > manager) const override
Generate an expression describing the constraint in Storm format.
std::string toSmtlib2(std::vector< std::string > const &varNames) const override
Generate a string describing the constraint in Smtlib2 format.
storm::expressions::Expression toExpression(std::vector< std::string > const &varNames, std::shared_ptr< storm::expressions::ExpressionManager > manager) const override
Generate an expression describing the constraint in Storm format.
std::string toSmtlib2(std::vector< std::string > const &varNames) const override
Generate a string describing the constraint in Smtlib2 format.
storm::expressions::Expression toExpression(std::vector< std::string > const &varNames, std::shared_ptr< storm::expressions::ExpressionManager > manager) const override
Generate an expression describing the constraint in Storm format.