#ifndef STORM_LOGIC_FORMULA_H_ #define STORM_LOGIC_FORMULA_H_ #include <memory> #include <vector> #include <iostream> #include <set> #include <boost/any.hpp> #include "src/storage/expressions/Variable.h" #include "src/storage/expressions/Expression.h" #include "src/logic/FormulasForwardDeclarations.h" namespace storm { namespace logic { // Forward-declare visitor for accept() method. class FormulaVisitor; // Forward-declare fragment specification for isInFragment() method. class FragmentSpecification; // Forward-declare formula information class for info() method. class FormulaInformation; class Formula : public std::enable_shared_from_this<Formula const> { public: // Make the destructor virtual to allow deletion of objects of subclasses via a pointer to this class. virtual ~Formula() { // Intentionally left empty. }; friend std::ostream& operator<<(std::ostream& out, Formula const& formula); // Basic formula types. virtual bool isPathFormula() const; virtual bool isStateFormula() const; virtual bool isConditionalProbabilityFormula() const; virtual bool isConditionalRewardFormula() const; virtual bool isProbabilityPathFormula() const; virtual bool isRewardPathFormula() const; virtual bool isTimePathFormula() const; virtual bool isBinaryBooleanStateFormula() const; virtual bool isUnaryBooleanStateFormula() const; // Operator formulas. virtual bool isOperatorFormula() const; virtual bool isLongRunAverageOperatorFormula() const; virtual bool isTimeOperatorFormula() const; virtual bool isProbabilityOperatorFormula() const; virtual bool isRewardOperatorFormula() const; // Atomic state formulas. virtual bool isBooleanLiteralFormula() const; virtual bool isTrueFormula() const; virtual bool isFalseFormula() const; virtual bool isAtomicExpressionFormula() const; virtual bool isAtomicLabelFormula() const; // Probability path formulas. virtual bool isNextFormula() const; virtual bool isUntilFormula() const; virtual bool isBoundedUntilFormula() const; virtual bool isGloballyFormula() const; virtual bool isEventuallyFormula() const; virtual bool isReachabilityProbabilityFormula() const; // Reward formulas. virtual bool isCumulativeRewardFormula() const; virtual bool isInstantaneousRewardFormula() const; virtual bool isReachabilityRewardFormula() const; virtual bool isLongRunAverageRewardFormula() const; // Expected time formulas. virtual bool isReachabilityTimeFormula() const; // Type checks for abstract intermediate classes. virtual bool isBinaryPathFormula() const; virtual bool isBinaryStateFormula() const; virtual bool isUnaryPathFormula() const; virtual bool isUnaryStateFormula() const; // Accessors for the return type of a formula. virtual bool hasQualitativeResult() const; virtual bool hasQuantitativeResult() const; bool isInFragment(FragmentSpecification const& fragment) const; FormulaInformation info() const; virtual boost::any accept(FormulaVisitor const& visitor, boost::any const& data = boost::any()) const = 0; static std::shared_ptr<Formula const> getTrueFormula(); PathFormula& asPathFormula(); PathFormula const& asPathFormula() const; StateFormula& asStateFormula(); StateFormula const& asStateFormula() const; BinaryStateFormula& asBinaryStateFormula(); BinaryStateFormula const& asBinaryStateFormula() const; UnaryStateFormula& asUnaryStateFormula(); UnaryStateFormula const& asUnaryStateFormula() const; BinaryBooleanStateFormula& asBinaryBooleanStateFormula(); BinaryBooleanStateFormula const& asBinaryBooleanStateFormula() const; UnaryBooleanStateFormula& asUnaryBooleanStateFormula(); UnaryBooleanStateFormula const& asUnaryBooleanStateFormula() const; BooleanLiteralFormula& asBooleanLiteralFormula(); BooleanLiteralFormula const& asBooleanLiteralFormula() const; AtomicExpressionFormula& asAtomicExpressionFormula(); AtomicExpressionFormula const& asAtomicExpressionFormula() const; AtomicLabelFormula& asAtomicLabelFormula(); AtomicLabelFormula const& asAtomicLabelFormula() const; UntilFormula& asUntilFormula(); UntilFormula const& asUntilFormula() const; BoundedUntilFormula& asBoundedUntilFormula(); BoundedUntilFormula const& asBoundedUntilFormula() const; EventuallyFormula& asEventuallyFormula(); EventuallyFormula const& asEventuallyFormula() const; EventuallyFormula& asReachabilityProbabilityFormula(); EventuallyFormula const& asReachabilityProbabilityFormula() const; EventuallyFormula& asReachabilityRewardFormula(); EventuallyFormula const& asReachabilityRewardFormula() const; EventuallyFormula& asReachabilityTimeFormula(); EventuallyFormula const& asReachabilityTimeFormula() const; GloballyFormula& asGloballyFormula(); GloballyFormula const& asGloballyFormula() const; BinaryPathFormula& asBinaryPathFormula(); BinaryPathFormula const& asBinaryPathFormula() const; UnaryPathFormula& asUnaryPathFormula(); UnaryPathFormula const& asUnaryPathFormula() const; ConditionalFormula& asConditionalFormula(); ConditionalFormula const& asConditionalFormula() const; NextFormula& asNextFormula(); NextFormula const& asNextFormula() const; LongRunAverageOperatorFormula& asLongRunAverageOperatorFormula(); LongRunAverageOperatorFormula const& asLongRunAverageOperatorFormula() const; TimeOperatorFormula& asTimeOperatorFormula(); TimeOperatorFormula const& asTimeOperatorFormula() const; CumulativeRewardFormula& asCumulativeRewardFormula(); CumulativeRewardFormula const& asCumulativeRewardFormula() const; InstantaneousRewardFormula& asInstantaneousRewardFormula(); InstantaneousRewardFormula const& asInstantaneousRewardFormula() const; LongRunAverageRewardFormula& asLongRunAverageRewardFormula(); LongRunAverageRewardFormula const& asLongRunAverageRewardFormula() const; ProbabilityOperatorFormula& asProbabilityOperatorFormula(); ProbabilityOperatorFormula const& asProbabilityOperatorFormula() const; RewardOperatorFormula& asRewardOperatorFormula(); RewardOperatorFormula const& asRewardOperatorFormula() const; OperatorFormula& asOperatorFormula(); OperatorFormula const& asOperatorFormula() const; std::vector<std::shared_ptr<AtomicExpressionFormula const>> getAtomicExpressionFormulas() const; std::vector<std::shared_ptr<AtomicLabelFormula const>> getAtomicLabelFormulas() const; std::set<std::string> getReferencedRewardModels() const; std::shared_ptr<Formula const> asSharedPointer(); std::shared_ptr<Formula const> asSharedPointer() const; std::shared_ptr<Formula> substitute(std::map<storm::expressions::Variable, storm::expressions::Expression> const& substitution) const; std::shared_ptr<Formula> substitute(std::map<std::string, storm::expressions::Expression> const& labelSubstitution) const; /*! * Takes the formula and converts it to an equivalent expression. The formula may contain atomic labels, but * then the given mapping must provide a corresponding expression. Other than that, only atomic expression * formulas and boolean connectives may appear in the formula. * * @param manager The manager responsible for the expressions in the formula and the resulting expression. * @param A mapping from labels to the expressions that define them. * @return An equivalent expression. */ storm::expressions::Expression toExpression(storm::expressions::ExpressionManager const& manager, std::map<std::string, storm::expressions::Expression> const& labelToExpressionMapping = {}) const; std::string toString() const; virtual std::ostream& writeToStream(std::ostream& out) const = 0; virtual void gatherAtomicExpressionFormulas(std::vector<std::shared_ptr<AtomicExpressionFormula const>>& atomicExpressionFormulas) const; virtual void gatherAtomicLabelFormulas(std::vector<std::shared_ptr<AtomicLabelFormula const>>& atomicLabelFormulas) const; virtual void gatherReferencedRewardModels(std::set<std::string>& referencedRewardModels) const; private: // Currently empty. }; std::ostream& operator<<(std::ostream& out, Formula const& formula); } } #endif /* STORM_LOGIC_FORMULA_H_ */