80 lines
3.2 KiB
80 lines
3.2 KiB
#include "storm/storage/expressions/FullPredicateSplitter.h"
|
|
|
|
#include "storm/storage/expressions/Expression.h"
|
|
#include "storm/storage/expressions/Expressions.h"
|
|
|
|
#include "storm/utility/macros.h"
|
|
#include "storm/exceptions/InvalidArgumentException.h"
|
|
|
|
namespace storm {
|
|
namespace expressions {
|
|
|
|
std::vector<storm::expressions::Expression> FullPredicateSplitter::split(storm::expressions::Expression const& expression) {
|
|
STORM_LOG_THROW(expression.hasBooleanType(), storm::exceptions::InvalidArgumentException, "Expected predicate of boolean type.");
|
|
|
|
// Gather all atoms.
|
|
atomicExpressions.clear();
|
|
expression.accept(*this, boost::none);
|
|
|
|
// Remove all boolean literals from the atoms.
|
|
std::vector<storm::expressions::Expression> atomsToKeep;
|
|
for (auto const& atom : atomicExpressions) {
|
|
if (!atom.isTrue() && !atom.isFalse()) {
|
|
atomsToKeep.push_back(atom);
|
|
}
|
|
}
|
|
atomicExpressions = std::move(atomsToKeep);
|
|
|
|
return atomicExpressions;
|
|
}
|
|
|
|
boost::any FullPredicateSplitter::visit(IfThenElseExpression const& expression, boost::any const&) {
|
|
atomicExpressions.push_back(expression.toExpression());
|
|
return boost::any();
|
|
}
|
|
|
|
boost::any FullPredicateSplitter::visit(BinaryBooleanFunctionExpression const& expression, boost::any const& data) {
|
|
expression.getFirstOperand()->accept(*this, data);
|
|
expression.getSecondOperand()->accept(*this, data);
|
|
return boost::any();
|
|
}
|
|
|
|
boost::any FullPredicateSplitter::visit(BinaryNumericalFunctionExpression const&, boost::any const&) {
|
|
return boost::any();
|
|
}
|
|
|
|
boost::any FullPredicateSplitter::visit(BinaryRelationExpression const& expression, boost::any const&) {
|
|
atomicExpressions.push_back(expression.toExpression());
|
|
return boost::any();
|
|
}
|
|
|
|
boost::any FullPredicateSplitter::visit(VariableExpression const& expression, boost::any const&) {
|
|
if (expression.hasBooleanType()) {
|
|
atomicExpressions.push_back(expression.toExpression());
|
|
}
|
|
return boost::any();
|
|
}
|
|
|
|
boost::any FullPredicateSplitter::visit(UnaryBooleanFunctionExpression const& expression, boost::any const& data) {
|
|
expression.getOperand()->accept(*this, data);
|
|
return boost::any();
|
|
}
|
|
|
|
boost::any FullPredicateSplitter::visit(UnaryNumericalFunctionExpression const&, boost::any const&) {
|
|
return boost::any();
|
|
}
|
|
|
|
boost::any FullPredicateSplitter::visit(BooleanLiteralExpression const&, boost::any const&) {
|
|
return boost::any();
|
|
}
|
|
|
|
boost::any FullPredicateSplitter::visit(IntegerLiteralExpression const&, boost::any const&) {
|
|
return boost::any();
|
|
}
|
|
|
|
boost::any FullPredicateSplitter::visit(RationalLiteralExpression const&, boost::any const&) {
|
|
return boost::any();
|
|
}
|
|
|
|
}
|
|
}
|