#ifndef STORM_STORAGE_PRISM_FORMULA_H_ #define STORM_STORAGE_PRISM_FORMULA_H_ #include #include #include "storm/storage/prism/LocatedInformation.h" #include "storm/storage/expressions/Expression.h" #include "storm/storage/expressions/Variable.h" #include "storm/utility/OsDetection.h" namespace storm { namespace prism { class Formula : public LocatedInformation { public: /*! * Creates a formula with the given placeholder variable and expression. * * @param variable The placeholder variable that is used in expressions to represent this formula. * @param expression The expression associated with this formula. * @param filename The filename in which the transition reward is defined. * @param lineNumber The line number in which the transition reward is defined. */ Formula(storm::expressions::Variable const& variable, storm::expressions::Expression const& expression, std::string const& filename = "", uint_fast64_t lineNumber = 0); /*! * Creates a formula with the given name * * @param name the name of the formula. * @param expression The expression associated with this formula. * @param filename The filename in which the transition reward is defined. * @param lineNumber The line number in which the transition reward is defined. */ Formula(std::string const& name, storm::expressions::Expression const& expression, std::string const& filename = "", uint_fast64_t lineNumber = 0); // Create default implementations of constructors/assignment. Formula() = default; Formula(Formula const& other) = default; Formula& operator=(Formula const& other)= default; Formula(Formula&& other) = default; Formula& operator=(Formula&& other) = default; /*! * Retrieves the name that is associated with this formula. * * @return The name that is associated with this formula. */ std::string const& getName() const; /*! * Retrieves wheter a placeholder variable is used in expressions to represent this formula. * */ bool hasExpressionVariable() const; /*! * Retrieves the placeholder variable that is used in expressions to represent this formula. * * @return The placeholder variable that is used in expressions to represent this formula. */ storm::expressions::Variable const& getExpressionVariable() const; /*! * Retrieves the expression that is associated with this formula. * * @return The expression that is associated with this formula. */ storm::expressions::Expression const& getExpression() const; /*! * Retrieves the return type of the formula, i.e., the return-type of the defining expression. * * @return The return type of the formula. */ storm::expressions::Type const& getType() const; /*! * Substitutes all variables in the expression of the formula according to the given map. * * @param substitution The substitution to perform. * @return The resulting formula. */ Formula substitute(std::map const& substitution) const; friend std::ostream& operator<<(std::ostream& stream, Formula const& formula); private: // The name of the formula. std::string name; // Expression variable that is used as a placeholder for this formula boost::optional variable; // A predicate that needs to be satisfied by states for the label to be attached. storm::expressions::Expression expression; }; } // namespace prism } // namespace storm #endif /* STORM_STORAGE_PRISM_FORMULA_H_ */