Storm
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
SmtConstraint.cpp
Go to the documentation of this file.
2#include <string>
3#include "DFTASFChecker.h"
4
5namespace storm::dft {
6namespace modelchecker {
7
8/*
9 * Variable[VarIndex] is the maximum of the others
10 */
11class IsMaximum : public SmtConstraint {
12 public:
13 IsMaximum(uint64_t varIndex, std::vector<uint64_t> const &varIndices) : varIndex(varIndex), varIndices(varIndices) {}
14
15 virtual ~IsMaximum() {}
16
17 std::string toSmtlib2(std::vector<std::string> const &varNames) const override {
18 std::stringstream sstr;
19 sstr << "(and ";
20 // assert it is largereq than all values.
21 for (auto const &ovi : varIndices) {
22 sstr << "(>= " << varNames.at(varIndex) << " " << varNames.at(ovi) << ") ";
23 }
24 // assert it is one of the values.
25 sstr << "(or ";
26 for (auto const &ovi : varIndices) {
27 sstr << "(= " << varNames.at(varIndex) << " " << varNames.at(ovi) << ") ";
28 }
29 sstr << ")"; // end of the or
30 sstr << ")"; // end outer and.
31 return sstr.str();
32 }
33
34 storm::expressions::Expression toExpression(std::vector<std::string> const &varNames,
35 std::shared_ptr<storm::expressions::ExpressionManager> manager) const override {
36 std::vector<storm::expressions::Expression> outerAnd;
37 std::vector<storm::expressions::Expression> innerOr;
38 for (auto const &ovi : varIndices) {
39 outerAnd.push_back((manager->getVariableExpression(varNames.at(varIndex)) >= manager->getVariableExpression(varNames.at(ovi))));
40 innerOr.push_back((manager->getVariableExpression(varNames.at(varIndex)) == manager->getVariableExpression(varNames.at(ovi))));
41 }
42 outerAnd.push_back(disjunction(innerOr));
43 return conjunction(outerAnd);
44 }
45
46 private:
47 uint64_t varIndex;
48 std::vector<uint64_t> varIndices;
49};
50
51/*
52 * First is the minimum of the others
53 */
54class IsMinimum : public SmtConstraint {
55 public:
56 IsMinimum(uint64_t varIndex, std::vector<uint64_t> const &varIndices) : varIndex(varIndex), varIndices(varIndices) {}
57
58 virtual ~IsMinimum() {}
59
60 std::string toSmtlib2(std::vector<std::string> const &varNames) const override {
61 std::stringstream sstr;
62 sstr << "(and ";
63 // assert it is smallereq than all values.
64 for (auto const &ovi : varIndices) {
65 sstr << "(<= " << varNames.at(varIndex) << " " << varNames.at(ovi) << ") ";
66 }
67 // assert it is one of the values.
68 sstr << "(or ";
69 for (auto const &ovi : varIndices) {
70 sstr << "(= " << varNames.at(varIndex) << " " << varNames.at(ovi) << ") ";
71 }
72 sstr << ")"; // end of the or
73 sstr << ")"; // end outer and.
74 return sstr.str();
75 }
76
77 storm::expressions::Expression toExpression(std::vector<std::string> const &varNames,
78 std::shared_ptr<storm::expressions::ExpressionManager> manager) const override {
79 std::vector<storm::expressions::Expression> outerAnd;
80 std::vector<storm::expressions::Expression> innerOr;
81 for (auto const &ovi : varIndices) {
82 outerAnd.push_back((manager->getVariableExpression(varNames.at(varIndex)) <= manager->getVariableExpression(varNames.at(ovi))));
83 innerOr.push_back((manager->getVariableExpression(varNames.at(varIndex)) == manager->getVariableExpression(varNames.at(ovi))));
84 }
85 outerAnd.push_back(disjunction(innerOr));
86 return conjunction(outerAnd);
87 }
88
89 private:
90 uint64_t varIndex;
91 std::vector<uint64_t> varIndices;
92};
93
95 public:
96 BetweenValues(uint64_t varIndex, uint64_t lower, uint64_t upper) : varIndex(varIndex), upperBound(upper), lowerBound(lower) {}
97
98 virtual ~BetweenValues() {}
99
100 std::string toSmtlib2(std::vector<std::string> const &varNames) const override {
101 std::stringstream sstr;
102 sstr << "(and ";
103 sstr << "(>= " << varNames.at(varIndex) << " " << lowerBound << ")";
104 sstr << "(<= " << varNames.at(varIndex) << " " << upperBound << ")";
105 sstr << ")";
106 return sstr.str();
107 }
108
109 storm::expressions::Expression toExpression(std::vector<std::string> const &varNames,
110 std::shared_ptr<storm::expressions::ExpressionManager> manager) const override {
111 return (manager->getVariableExpression(varNames.at(varIndex)) >= lowerBound) && (manager->getVariableExpression(varNames.at(varIndex)) <= upperBound);
112 }
113
114 private:
115 uint64_t varIndex;
116 uint64_t upperBound;
117 uint64_t lowerBound;
118};
119
120class And : public SmtConstraint {
121 public:
122 And(std::vector<std::shared_ptr<SmtConstraint>> const &constraints) : constraints(constraints) {}
123
124 virtual ~And() {}
125
126 std::string toSmtlib2(std::vector<std::string> const &varNames) const override {
127 std::stringstream sstr;
128 if (constraints.empty()) {
129 sstr << "true";
130 } else {
131 sstr << "(and";
132 for (auto const &c : constraints) {
133 sstr << " " << c->toSmtlib2(varNames);
134 }
135 sstr << ")";
136 }
137 return sstr.str();
138 }
139
140 storm::expressions::Expression toExpression(std::vector<std::string> const &varNames,
141 std::shared_ptr<storm::expressions::ExpressionManager> manager) const override {
142 if (constraints.empty()) {
143 return manager->boolean(true);
144 } else {
145 std::vector<storm::expressions::Expression> conjuncts;
146 for (auto const &c : constraints) {
147 conjuncts.push_back(c->toExpression(varNames, manager));
148 }
149 return conjunction(conjuncts);
150 }
151 }
152
153 private:
154 std::vector<std::shared_ptr<SmtConstraint>> constraints;
155};
156
157class Or : public SmtConstraint {
158 public:
159 Or(std::vector<std::shared_ptr<SmtConstraint>> const &constraints) : constraints(constraints) {}
160
161 virtual ~Or() {}
162
163 std::string toSmtlib2(std::vector<std::string> const &varNames) const override {
164 std::stringstream sstr;
165 if (constraints.empty()) {
166 sstr << "false";
167 } else {
168 sstr << "(or";
169 for (auto const &c : constraints) {
170 sstr << " " << c->toSmtlib2(varNames);
171 }
172 sstr << ")";
173 }
174 return sstr.str();
175 }
176
177 storm::expressions::Expression toExpression(std::vector<std::string> const &varNames,
178 std::shared_ptr<storm::expressions::ExpressionManager> manager) const override {
179 if (constraints.empty()) {
180 return manager->boolean(false);
181 } else {
182 std::vector<storm::expressions::Expression> disjuncts;
183 for (auto const &c : constraints) {
184 disjuncts.push_back(c->toExpression(varNames, manager));
185 }
186 return disjunction(disjuncts);
187 }
188 }
189
190 private:
191 std::vector<std::shared_ptr<SmtConstraint>> constraints;
192};
193
194class Implies : public SmtConstraint {
195 public:
196 Implies(std::shared_ptr<SmtConstraint> l, std::shared_ptr<SmtConstraint> r) : lhs(l), rhs(r) {}
197
198 std::string toSmtlib2(std::vector<std::string> const &varNames) const override {
199 std::stringstream sstr;
200 sstr << "(=> " << lhs->toSmtlib2(varNames) << " " << rhs->toSmtlib2(varNames) << ")";
201 return sstr.str();
202 }
203
204 storm::expressions::Expression toExpression(std::vector<std::string> const &varNames,
205 std::shared_ptr<storm::expressions::ExpressionManager> manager) const override {
206 return implies(lhs->toExpression(varNames, manager), rhs->toExpression(varNames, manager));
207 }
208
209 private:
210 std::shared_ptr<SmtConstraint> lhs;
211 std::shared_ptr<SmtConstraint> rhs;
212};
213
214class Iff : public SmtConstraint {
215 public:
216 Iff(std::shared_ptr<SmtConstraint> l, std::shared_ptr<SmtConstraint> r) : lhs(l), rhs(r) {}
217
218 std::string toSmtlib2(std::vector<std::string> const &varNames) const override {
219 std::stringstream sstr;
220 sstr << "(= " << lhs->toSmtlib2(varNames) << " " << rhs->toSmtlib2(varNames) << ")";
221 return sstr.str();
222 }
223
224 storm::expressions::Expression toExpression(std::vector<std::string> const &varNames,
225 std::shared_ptr<storm::expressions::ExpressionManager> manager) const override {
226 return iff(lhs->toExpression(varNames, manager), rhs->toExpression(varNames, manager));
227 }
228
229 private:
230 std::shared_ptr<SmtConstraint> lhs;
231 std::shared_ptr<SmtConstraint> rhs;
232};
233
234class IsTrue : public SmtConstraint {
235 public:
236 IsTrue(bool val) : value(val) {}
237
238 virtual ~IsTrue() {}
239
240 std::string toSmtlib2(std::vector<std::string> const &varNames) const override {
241 std::stringstream sstr;
242 sstr << (value ? "true" : "false");
243 return sstr.str();
244 }
245
246 storm::expressions::Expression toExpression(std::vector<std::string> const &varNames,
247 std::shared_ptr<storm::expressions::ExpressionManager> manager) const override {
248 return manager->boolean(value);
249 }
250
251 private:
252 bool value;
253};
254
256 public:
257 IsBoolValue(uint64_t varIndex, bool val) : varIndex(varIndex), value(val) {}
258
259 virtual ~IsBoolValue() {}
260
261 std::string toSmtlib2(std::vector<std::string> const &varNames) const override {
262 std::stringstream sstr;
263 assert(varIndex < varNames.size());
264 if (value) {
265 sstr << varNames.at(varIndex);
266 } else {
267 sstr << "(not " << varNames.at(varIndex) << ")";
268 }
269 return sstr.str();
270 }
271
272 storm::expressions::Expression toExpression(std::vector<std::string> const &varNames,
273 std::shared_ptr<storm::expressions::ExpressionManager> manager) const override {
274 if (value) {
275 return manager->getVariableExpression(varNames.at(varIndex));
276 } else {
277 return !(manager->getVariableExpression(varNames.at(varIndex)));
278 }
279 }
280
281 private:
282 uint64_t varIndex;
283 bool value;
284};
285
287 public:
288 IsConstantValue(uint64_t varIndex, uint64_t val) : varIndex(varIndex), value(val) {}
289
290 virtual ~IsConstantValue() {}
291
292 std::string toSmtlib2(std::vector<std::string> const &varNames) const override {
293 std::stringstream sstr;
294 assert(varIndex < varNames.size());
295 sstr << "(= " << varNames.at(varIndex) << " " << value << ")";
296 return sstr.str();
297 }
298
299 storm::expressions::Expression toExpression(std::vector<std::string> const &varNames,
300 std::shared_ptr<storm::expressions::ExpressionManager> manager) const override {
301 return manager->getVariableExpression(varNames.at(varIndex)) == manager->integer(value);
302 }
303
304 private:
305 uint64_t varIndex;
306 uint64_t value;
307};
308
310 public:
311 IsNotConstantValue(uint64_t varIndex, uint64_t val) : varIndex(varIndex), value(val) {}
312
314
315 std::string toSmtlib2(std::vector<std::string> const &varNames) const override {
316 std::stringstream sstr;
317 assert(varIndex < varNames.size());
318 sstr << "(distinct " << varNames.at(varIndex) << " " << value << ")";
319 return sstr.str();
320 }
321
322 storm::expressions::Expression toExpression(std::vector<std::string> const &varNames,
323 std::shared_ptr<storm::expressions::ExpressionManager> manager) const override {
324 return manager->getVariableExpression(varNames.at(varIndex)) != manager->integer(value);
325 }
326
327 private:
328 uint64_t varIndex;
329 uint64_t value;
330};
331
333 public:
334 IsLessConstant(uint64_t varIndex, uint64_t val) : varIndex(varIndex), value(val) {}
335
336 virtual ~IsLessConstant() {}
337
338 std::string toSmtlib2(std::vector<std::string> const &varNames) const override {
339 std::stringstream sstr;
340 assert(varIndex < varNames.size());
341 sstr << "(< " << varNames.at(varIndex) << " " << value << ")";
342 return sstr.str();
343 }
344
345 storm::expressions::Expression toExpression(std::vector<std::string> const &varNames,
346 std::shared_ptr<storm::expressions::ExpressionManager> manager) const override {
347 return manager->getVariableExpression(varNames.at(varIndex)) < value;
348 }
349
350 private:
351 uint64_t varIndex;
352 uint64_t value;
353};
354
356 public:
357 IsGreaterConstant(uint64_t varIndex, uint64_t val) : varIndex(varIndex), value(val) {}
358
360
361 std::string toSmtlib2(std::vector<std::string> const &varNames) const override {
362 std::stringstream sstr;
363 assert(varIndex < varNames.size());
364 sstr << "(< " << value << " " << varNames.at(varIndex) << ")";
365 return sstr.str();
366 }
367
368 storm::expressions::Expression toExpression(std::vector<std::string> const &varNames,
369 std::shared_ptr<storm::expressions::ExpressionManager> manager) const override {
370 return manager->getVariableExpression(varNames.at(varIndex)) > value;
371 }
372
373 private:
374 uint64_t varIndex;
375 uint64_t value;
376};
377
379 public:
380 IsLessEqualConstant(uint64_t varIndex, uint64_t val) : varIndex(varIndex), value(val) {}
381
383
384 std::string toSmtlib2(std::vector<std::string> const &varNames) const override {
385 std::stringstream sstr;
386 assert(varIndex < varNames.size());
387 sstr << "(<= " << varNames.at(varIndex) << " " << value << ")";
388 return sstr.str();
389 }
390
391 storm::expressions::Expression toExpression(std::vector<std::string> const &varNames,
392 std::shared_ptr<storm::expressions::ExpressionManager> manager) const override {
393 return manager->getVariableExpression(varNames.at(varIndex)) <= value;
394 }
395
396 private:
397 uint64_t varIndex;
398 uint64_t value;
399};
400
402 public:
403 IsGreaterEqualConstant(uint64_t varIndex, uint64_t val) : varIndex(varIndex), value(val) {}
404
406
407 std::string toSmtlib2(std::vector<std::string> const &varNames) const override {
408 std::stringstream sstr;
409 assert(varIndex < varNames.size());
410 sstr << "(<= " << value << " " << varNames.at(varIndex) << ")";
411 return sstr.str();
412 }
413
414 storm::expressions::Expression toExpression(std::vector<std::string> const &varNames,
415 std::shared_ptr<storm::expressions::ExpressionManager> manager) const override {
416 return manager->getVariableExpression(varNames.at(varIndex)) >= value;
417 }
418
419 private:
420 uint64_t varIndex;
421 uint64_t value;
422};
423
424class IsEqual : public SmtConstraint {
425 public:
426 IsEqual(uint64_t varIndex1, uint64_t varIndex2) : var1Index(varIndex1), var2Index(varIndex2) {}
427
428 virtual ~IsEqual() {}
429
430 std::string toSmtlib2(std::vector<std::string> const &varNames) const override {
431 return "(= " + varNames.at(var1Index) + " " + varNames.at(var2Index) + ")";
432 }
433
434 storm::expressions::Expression toExpression(std::vector<std::string> const &varNames,
435 std::shared_ptr<storm::expressions::ExpressionManager> manager) const override {
436 return manager->getVariableExpression(varNames.at(var1Index)) == manager->getVariableExpression(varNames.at(var2Index));
437 }
438
439 private:
440 uint64_t var1Index;
441 uint64_t var2Index;
442};
443
444class IsUnequal : public SmtConstraint {
445 public:
446 IsUnequal(uint64_t varIndex1, uint64_t varIndex2) : var1Index(varIndex1), var2Index(varIndex2) {}
447
448 virtual ~IsUnequal() {}
449
450 std::string toSmtlib2(std::vector<std::string> const &varNames) const override {
451 return "(distinct " + varNames.at(var1Index) + " " + varNames.at(var2Index) + ")";
452 }
453
454 storm::expressions::Expression toExpression(std::vector<std::string> const &varNames,
455 std::shared_ptr<storm::expressions::ExpressionManager> manager) const override {
456 return manager->getVariableExpression(varNames.at(var1Index)) != manager->getVariableExpression(varNames.at(var2Index));
457 }
458
459 private:
460 uint64_t var1Index;
461 uint64_t var2Index;
462};
463
464class IsLess : public SmtConstraint {
465 public:
466 IsLess(uint64_t varIndex1, uint64_t varIndex2) : var1Index(varIndex1), var2Index(varIndex2) {}
467
468 virtual ~IsLess() {}
469
470 std::string toSmtlib2(std::vector<std::string> const &varNames) const override {
471 return "(< " + varNames.at(var1Index) + " " + varNames.at(var2Index) + ")";
472 }
473
474 storm::expressions::Expression toExpression(std::vector<std::string> const &varNames,
475 std::shared_ptr<storm::expressions::ExpressionManager> manager) const override {
476 return manager->getVariableExpression(varNames.at(var1Index)) < manager->getVariableExpression(varNames.at(var2Index));
477 }
478
479 private:
480 uint64_t var1Index;
481 uint64_t var2Index;
482};
483
485 public:
486 IsLessEqual(uint64_t varIndex1, uint64_t varIndex2) : var1Index(varIndex1), var2Index(varIndex2) {}
487
488 virtual ~IsLessEqual() {}
489
490 std::string toSmtlib2(std::vector<std::string> const &varNames) const override {
491 return "(<= " + varNames.at(var1Index) + " " + varNames.at(var2Index) + ")";
492 }
493
494 storm::expressions::Expression toExpression(std::vector<std::string> const &varNames,
495 std::shared_ptr<storm::expressions::ExpressionManager> manager) const override {
496 return manager->getVariableExpression(varNames.at(var1Index)) <= manager->getVariableExpression(varNames.at(var2Index));
497 }
498
499 private:
500 uint64_t var1Index;
501 uint64_t var2Index;
502};
503
505 public:
506 IsGreaterEqual(uint64_t varIndex1, uint64_t varIndex2) : var1Index(varIndex1), var2Index(varIndex2) {}
507
508 virtual ~IsGreaterEqual() {}
509
510 std::string toSmtlib2(std::vector<std::string> const &varNames) const override {
511 return "(>= " + varNames.at(var1Index) + " " + varNames.at(var2Index) + ")";
512 }
513
514 storm::expressions::Expression toExpression(std::vector<std::string> const &varNames,
515 std::shared_ptr<storm::expressions::ExpressionManager> manager) const override {
516 return manager->getVariableExpression(varNames.at(var1Index)) >= manager->getVariableExpression(varNames.at(var2Index));
517 }
518
519 private:
520 uint64_t var1Index;
521 uint64_t var2Index;
522};
523
525 public:
526 PairwiseDifferent(std::vector<uint64_t> const &indices) : varIndices(indices) {}
527
529
530 std::string toSmtlib2(std::vector<std::string> const &varNames) const override {
531 std::stringstream sstr;
532 sstr << "(distinct";
533 // for(uint64_t i = 0; i < varIndices.size(); ++i) {
534 // for(uint64_t j = i + 1; j < varIndices.size(); ++j) {
535 // sstr << "()";
536 // }
537 // }
538 for (auto const &varIndex : varIndices) {
539 sstr << " " << varNames.at(varIndex);
540 }
541 sstr << ")";
542 return sstr.str();
543 }
544
545 storm::expressions::Expression toExpression(std::vector<std::string> const &varNames,
546 std::shared_ptr<storm::expressions::ExpressionManager> manager) const override {
547 std::vector<storm::expressions::Expression> conjuncts;
548 for (uint64_t i = 0; i < varIndices.size(); ++i) {
549 for (uint64_t j = i + 1; j < varIndices.size(); ++j) {
550 // check all elements pairwise for inequality
551 conjuncts.push_back(manager->getVariableExpression(varNames.at(varIndices.at(i))) !=
552 manager->getVariableExpression(varNames.at(varIndices.at(j))));
553 }
554 }
555 // take the conjunction of all pairwise inequalities
556 return conjunction(conjuncts);
557 }
558
559 private:
560 std::vector<uint64_t> varIndices;
561};
562
563class Sorted : public SmtConstraint {
564 public:
565 Sorted(std::vector<uint64_t> varIndices) : varIndices(varIndices) {}
566
567 virtual ~Sorted() {}
568
569 std::string toSmtlib2(std::vector<std::string> const &varNames) const override {
570 std::stringstream sstr;
571 sstr << "(and ";
572 for (uint64_t i = 1; i < varIndices.size(); ++i) {
573 sstr << "(<= " << varNames.at(varIndices.at(i - 1)) << " " << varNames.at(varIndices.at(i)) << ")";
574 }
575 sstr << ") ";
576 return sstr.str();
577 }
578
579 storm::expressions::Expression toExpression(std::vector<std::string> const &varNames,
580 std::shared_ptr<storm::expressions::ExpressionManager> manager) const override {
581 std::vector<storm::expressions::Expression> conjuncts;
582 for (uint64_t i = 1; i < varIndices.size(); ++i) {
583 conjuncts.push_back(manager->getVariableExpression(varNames.at(varIndices.at(i - 1))) <=
584 manager->getVariableExpression(varNames.at(varIndices.at(i))));
585 }
586 // take the conjunction of all pairwise inequalities
587 return conjunction(conjuncts);
588 }
589
590 private:
591 std::vector<uint64_t> varIndices;
592};
593
594class IfThenElse : public SmtConstraint {
595 public:
596 IfThenElse(std::shared_ptr<SmtConstraint> ifC, std::shared_ptr<SmtConstraint> thenC, std::shared_ptr<SmtConstraint> elseC)
597 : ifConstraint(ifC), thenConstraint(thenC), elseConstraint(elseC) {}
598
599 std::string toSmtlib2(std::vector<std::string> const &varNames) const override {
600 std::stringstream sstr;
601 sstr << "(ite " << ifConstraint->toSmtlib2(varNames) << " " << thenConstraint->toSmtlib2(varNames) << " " << elseConstraint->toSmtlib2(varNames) << ")";
602 return sstr.str();
603 }
604
605 storm::expressions::Expression toExpression(std::vector<std::string> const &varNames,
606 std::shared_ptr<storm::expressions::ExpressionManager> manager) const override {
607 return ite(ifConstraint->toExpression(varNames, manager), thenConstraint->toExpression(varNames, manager),
608 elseConstraint->toExpression(varNames, manager));
609 }
610
611 private:
612 std::shared_ptr<SmtConstraint> ifConstraint;
613 std::shared_ptr<SmtConstraint> thenConstraint;
614 std::shared_ptr<SmtConstraint> elseConstraint;
615};
616
618 public:
619 TrueCountIsLessConstant(std::vector<uint64_t> varIndices, uint64_t val) : varIndices(varIndices), value(val) {}
620
621 std::string toSmtlib2(std::vector<std::string> const &varNames) const override {
622 std::stringstream sstr;
623 sstr << "(< (+ ";
624 for (uint64_t i = 0; i < varIndices.size(); ++i) {
625 sstr << "(ite " << varNames.at(varIndices.at(i)) << " 1 0 )";
626 }
627 sstr << ") " << value << " )";
628 return sstr.str();
629 }
630
631 storm::expressions::Expression toExpression(std::vector<std::string> const &varNames,
632 std::shared_ptr<storm::expressions::ExpressionManager> manager) const override {
633 std::vector<storm::expressions::Expression> boolToInt;
634 for (uint64_t i = 0; i < varIndices.size(); ++i) {
635 boolToInt.push_back(ite(manager->getVariableExpression(varNames.at(varIndices.at(i))), // If variable is true
636 manager->integer(1), // set 1
637 manager->integer(0))); // else 0
638 }
639 return sum(boolToInt) < manager->integer(value);
640 }
641
642 private:
643 std::vector<uint64_t> varIndices;
644 uint64_t value;
645};
646
648 public:
649 FalseCountIsEqualConstant(std::vector<uint64_t> varIndices, uint64_t val) : varIndices(varIndices), value(val) {}
650
651 std::string toSmtlib2(std::vector<std::string> const &varNames) const override {
652 std::stringstream sstr;
653 sstr << "(= (+ ";
654 for (uint64_t i = 0; i < varIndices.size(); ++i) {
655 sstr << "(ite " << varNames.at(varIndices.at(i)) << " 0 1 )";
656 }
657 sstr << ") " << value << " )";
658 return sstr.str();
659 }
660
661 storm::expressions::Expression toExpression(std::vector<std::string> const &varNames,
662 std::shared_ptr<storm::expressions::ExpressionManager> manager) const override {
663 std::vector<storm::expressions::Expression> boolToInt;
664 for (uint64_t i = 0; i < varIndices.size(); ++i) {
665 boolToInt.push_back(ite(manager->getVariableExpression(varNames.at(varIndices.at(i))), // If variable is true
666 manager->integer(0), // set 0
667 manager->integer(1))); // else 1
668 }
669 return sum(boolToInt) == manager->integer(value);
670 }
671
672 private:
673 std::vector<uint64_t> varIndices;
674 uint64_t value;
675};
676
678 public:
679 TrueCountIsConstantValue(std::vector<uint64_t> varIndices, uint64_t val) : varIndices(varIndices), value(val) {}
680
681 std::string toSmtlib2(std::vector<std::string> const &varNames) const override {
682 std::stringstream sstr;
683 sstr << "(= (+ ";
684 for (uint64_t i = 0; i < varIndices.size(); ++i) {
685 sstr << "(ite " << varNames.at(varIndices.at(i)) << " 1 0 )";
686 }
687 sstr << ") " << value << " )";
688 return sstr.str();
689 }
690
691 storm::expressions::Expression toExpression(std::vector<std::string> const &varNames,
692 std::shared_ptr<storm::expressions::ExpressionManager> manager) const override {
693 std::vector<storm::expressions::Expression> boolToInt;
694 for (uint64_t i = 0; i < varIndices.size(); ++i) {
695 boolToInt.push_back(ite(manager->getVariableExpression(varNames.at(varIndices.at(i))), // If variable is true
696 manager->integer(1), // set 1
697 manager->integer(0))); // else 0
698 }
699 return sum(boolToInt) == manager->integer(value);
700 }
701
702 private:
703 std::vector<uint64_t> varIndices;
704 uint64_t value;
705};
706
707} // namespace modelchecker
708} // namespace storm::dft
std::string toSmtlib2(std::vector< std::string > const &varNames) const override
Generate a string describing the constraint in Smtlib2 format.
And(std::vector< std::shared_ptr< SmtConstraint > > const &constraints)
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.
BetweenValues(uint64_t varIndex, uint64_t lower, uint64_t upper)
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.
FalseCountIsEqualConstant(std::vector< uint64_t > varIndices, uint64_t val)
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.
IfThenElse(std::shared_ptr< SmtConstraint > ifC, std::shared_ptr< SmtConstraint > thenC, std::shared_ptr< SmtConstraint > elseC)
Iff(std::shared_ptr< SmtConstraint > l, std::shared_ptr< SmtConstraint > r)
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.
Implies(std::shared_ptr< SmtConstraint > l, std::shared_ptr< SmtConstraint > r)
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.
IsBoolValue(uint64_t varIndex, bool val)
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.
IsConstantValue(uint64_t varIndex, uint64_t val)
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.
IsEqual(uint64_t varIndex1, uint64_t varIndex2)
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.
IsGreaterConstant(uint64_t varIndex, uint64_t val)
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.
IsGreaterEqualConstant(uint64_t varIndex, uint64_t val)
std::string toSmtlib2(std::vector< std::string > const &varNames) const override
Generate a string describing the constraint in Smtlib2 format.
IsGreaterEqual(uint64_t varIndex1, uint64_t varIndex2)
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.
IsLessConstant(uint64_t varIndex, uint64_t val)
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.
IsLessEqualConstant(uint64_t varIndex, uint64_t val)
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.
IsLessEqual(uint64_t varIndex1, uint64_t varIndex2)
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.
IsLess(uint64_t varIndex1, uint64_t varIndex2)
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.
IsMaximum(uint64_t varIndex, std::vector< uint64_t > const &varIndices)
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.
IsMinimum(uint64_t varIndex, std::vector< uint64_t > const &varIndices)
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.
IsNotConstantValue(uint64_t varIndex, uint64_t val)
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.
IsUnequal(uint64_t varIndex1, uint64_t varIndex2)
Or(std::vector< std::shared_ptr< SmtConstraint > > const &constraints)
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.
PairwiseDifferent(std::vector< uint64_t > const &indices)
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.
Sorted(std::vector< uint64_t > varIndices)
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.
TrueCountIsConstantValue(std::vector< uint64_t > varIndices, uint64_t val)
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.
TrueCountIsLessConstant(std::vector< uint64_t > varIndices, uint64_t val)