Storm
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
FullPredicateSplitter.cpp
Go to the documentation of this file.
2
5
8
9namespace storm {
10namespace expressions {
11
12std::vector<storm::expressions::Expression>& getAtomicExpressions(boost::any const& data) {
13 return *boost::any_cast<std::vector<storm::expressions::Expression>*>(data);
14}
15
16std::vector<storm::expressions::Expression> FullPredicateSplitter::split(storm::expressions::Expression const& expression) {
17 STORM_LOG_THROW(expression.hasBooleanType(), storm::exceptions::InvalidArgumentException, "Expected predicate of boolean type.");
18
19 // Gather all atoms.
20 std::vector<storm::expressions::Expression> atomicExpressions;
21 expression.accept(*this, &atomicExpressions);
22
23 // Remove all boolean literals from the atoms.
24 std::vector<storm::expressions::Expression> atomsToKeep;
25 for (auto const& atom : atomicExpressions) {
26 if (!atom.isTrue() && !atom.isFalse()) {
27 atomsToKeep.push_back(atom);
28 }
29 }
30 atomicExpressions = std::move(atomsToKeep);
31
32 return atomicExpressions;
33}
34
35boost::any FullPredicateSplitter::visit(IfThenElseExpression const& expression, boost::any const& data) {
36 getAtomicExpressions(data).push_back(expression.toExpression());
37 return data;
38}
39
40boost::any FullPredicateSplitter::visit(BinaryBooleanFunctionExpression const& expression, boost::any const& data) {
41 expression.getFirstOperand()->accept(*this, data);
42 expression.getSecondOperand()->accept(*this, data);
43 return data;
44}
45
46boost::any FullPredicateSplitter::visit(BinaryNumericalFunctionExpression const&, boost::any const& data) {
47 return data;
48}
49
50boost::any FullPredicateSplitter::visit(BinaryRelationExpression const& expression, boost::any const& data) {
51 getAtomicExpressions(data).push_back(expression.toExpression());
52 return data;
53}
54
55boost::any FullPredicateSplitter::visit(VariableExpression const& expression, boost::any const& data) {
56 if (expression.hasBooleanType()) {
57 getAtomicExpressions(data).push_back(expression.toExpression());
58 }
59 return data;
60}
61
62boost::any FullPredicateSplitter::visit(UnaryBooleanFunctionExpression const& expression, boost::any const& data) {
63 expression.getOperand()->accept(*this, data);
64 return data;
65}
66
67boost::any FullPredicateSplitter::visit(UnaryNumericalFunctionExpression const&, boost::any const& data) {
68 return data;
69}
70
71boost::any FullPredicateSplitter::visit(BooleanLiteralExpression const&, boost::any const& data) {
72 return data;
73}
74
75boost::any FullPredicateSplitter::visit(IntegerLiteralExpression const&, boost::any const& data) {
76 return data;
77}
78
79boost::any FullPredicateSplitter::visit(RationalLiteralExpression const&, boost::any const& data) {
80 return data;
81}
82
83} // namespace expressions
84} // namespace storm
bool hasBooleanType() const
Retrieves whether the expression has a boolean type.
Expression toExpression() const
Converts the base expression to a proper expression.
std::shared_ptr< BaseExpression const > const & getSecondOperand() const
Retrieves the second operand of the expression.
std::shared_ptr< BaseExpression const > const & getFirstOperand() const
Retrieves the first operand of the expression.
bool hasBooleanType() const
Retrieves whether the expression has a boolean return type.
boost::any accept(ExpressionVisitor &visitor, boost::any const &data) const
Accepts the given visitor.
virtual boost::any visit(IfThenElseExpression const &expression, boost::any const &data) override
std::vector< storm::expressions::Expression > split(storm::expressions::Expression const &expression)
virtual std::shared_ptr< BaseExpression const > getOperand(uint_fast64_t operandIndex) const override
Retrieves the given operand from the expression.
#define STORM_LOG_THROW(cond, exception, message)
Definition macros.h:30
std::vector< storm::expressions::Expression > & getAtomicExpressions(boost::any const &data)
LabParser.cpp.
Definition cli.cpp:18