#include "storm/logic/VariableSubstitutionVisitor.h" #include "storm/logic/Formulas.h" namespace storm { namespace logic { VariableSubstitutionVisitor::VariableSubstitutionVisitor(std::map const& substitution) : substitution(substitution) { // Intentionally left empty. } std::shared_ptr VariableSubstitutionVisitor::substitute(Formula const& f) const { boost::any result = f.accept(*this, boost::any()); return boost::any_cast>(result); } boost::any VariableSubstitutionVisitor::visit(BoundedUntilFormula const& f, boost::any const& data) const { auto left = boost::any_cast>(f.getLeftSubformula().accept(*this, data)); auto right = boost::any_cast>(f.getRightSubformula().accept(*this, data)); boost::optional lowerBound; if (f.hasLowerBound()) { lowerBound = TimeBound(f.isLowerBoundStrict(), f.getLowerBound().substitute(substitution)); } boost::optional upperBound; if (f.hasUpperBound()) { upperBound = TimeBound(f.isUpperBoundStrict(), f.getUpperBound().substitute(substitution)); } return std::static_pointer_cast(std::make_shared(left, right, lowerBound, upperBound, f.getTimeBoundType())); } boost::any VariableSubstitutionVisitor::visit(CumulativeRewardFormula const& f, boost::any const& data) const { return std::static_pointer_cast(std::make_shared(storm::logic::TimeBound(f.isBoundStrict(), f.getBound().substitute(substitution)), f.getTimeBoundType())); } boost::any VariableSubstitutionVisitor::visit(InstantaneousRewardFormula const& f, boost::any const& data) const { return std::static_pointer_cast(std::make_shared(f.getBound().substitute(substitution), f.getTimeBoundType())); } boost::any VariableSubstitutionVisitor::visit(AtomicExpressionFormula const& f, boost::any const&) const { return std::static_pointer_cast(std::make_shared(f.getExpression().substitute(substitution))); } } }