diff --git a/src/storm/logic/AtomicExpressionFormula.cpp b/src/storm/logic/AtomicExpressionFormula.cpp index 6fe7b6fdb..1a8d4caa8 100644 --- a/src/storm/logic/AtomicExpressionFormula.cpp +++ b/src/storm/logic/AtomicExpressionFormula.cpp @@ -28,8 +28,15 @@ namespace storm { expression.gatherVariables(usedVariables); } - std::ostream& AtomicExpressionFormula::writeToStream(std::ostream& out) const { + std::ostream& AtomicExpressionFormula::writeToStream(std::ostream& out, bool allowParentheses) const { + bool parentheses = allowParentheses & (this->expression.isLiteral() || this->expression.isVariable()); + if (parentheses) { + out << "("; + } out << expression; + if (parentheses) { + out << ")"; + } return out; } } diff --git a/src/storm/logic/AtomicExpressionFormula.h b/src/storm/logic/AtomicExpressionFormula.h index 21168493b..8bb0b3018 100644 --- a/src/storm/logic/AtomicExpressionFormula.h +++ b/src/storm/logic/AtomicExpressionFormula.h @@ -19,7 +19,7 @@ namespace storm { storm::expressions::Expression const& getExpression() const; - virtual std::ostream& writeToStream(std::ostream& out) const override; + virtual std::ostream& writeToStream(std::ostream& out, bool allowParentheses = false) const override; virtual void gatherAtomicExpressionFormulas(std::vector<std::shared_ptr<AtomicExpressionFormula const>>& atomicExpressionFormulas) const override; virtual void gatherUsedVariables(std::set<storm::expressions::Variable>& usedVariables) const override; diff --git a/src/storm/logic/AtomicLabelFormula.cpp b/src/storm/logic/AtomicLabelFormula.cpp index 15790609a..413617c68 100644 --- a/src/storm/logic/AtomicLabelFormula.cpp +++ b/src/storm/logic/AtomicLabelFormula.cpp @@ -25,7 +25,8 @@ namespace storm { atomicExpressionFormulas.push_back(std::dynamic_pointer_cast<AtomicLabelFormula const>(this->shared_from_this())); } - std::ostream& AtomicLabelFormula::writeToStream(std::ostream& out) const { + std::ostream& AtomicLabelFormula::writeToStream(std::ostream& out, bool /*allowParentheses*/) const { + // No parentheses necessary out << "\"" << label << "\""; return out; } diff --git a/src/storm/logic/AtomicLabelFormula.h b/src/storm/logic/AtomicLabelFormula.h index 1173701a0..8314cdb92 100644 --- a/src/storm/logic/AtomicLabelFormula.h +++ b/src/storm/logic/AtomicLabelFormula.h @@ -23,7 +23,7 @@ namespace storm { virtual void gatherAtomicLabelFormulas(std::vector<std::shared_ptr<AtomicLabelFormula const>>& atomicLabelFormulas) const override; - virtual std::ostream& writeToStream(std::ostream& out) const override; + virtual std::ostream& writeToStream(std::ostream& out, bool allowParentheses = false) const override; private: std::string label; diff --git a/src/storm/logic/BinaryBooleanPathFormula.cpp b/src/storm/logic/BinaryBooleanPathFormula.cpp index b759db23b..1b1b45bf0 100644 --- a/src/storm/logic/BinaryBooleanPathFormula.cpp +++ b/src/storm/logic/BinaryBooleanPathFormula.cpp @@ -41,15 +41,19 @@ namespace storm { return this->getOperator() == OperatorType::Or; } - std::ostream& BinaryBooleanPathFormula::writeToStream(std::ostream& out) const { - out << "("; - this->getLeftSubformula().writeToStream(out); + std::ostream& BinaryBooleanPathFormula::writeToStream(std::ostream& out, bool allowParentheses) const { + if (allowParentheses) { + out << "("; + } + this->getLeftSubformula().writeToStream(out, true); switch (operatorType) { case OperatorType::And: out << " & "; break; case OperatorType::Or: out << " | "; break; } - this->getRightSubformula().writeToStream(out); - out << ")"; + this->getRightSubformula().writeToStream(out, true); + if (allowParentheses) { + out << ")"; + } return out; } } diff --git a/src/storm/logic/BinaryBooleanPathFormula.h b/src/storm/logic/BinaryBooleanPathFormula.h index 10286f23f..344aed715 100644 --- a/src/storm/logic/BinaryBooleanPathFormula.h +++ b/src/storm/logic/BinaryBooleanPathFormula.h @@ -31,7 +31,7 @@ namespace storm { virtual bool isAnd() const; virtual bool isOr() const; - virtual std::ostream& writeToStream(std::ostream& out) const override; + virtual std::ostream& writeToStream(std::ostream& out, bool allowParentheses = false) const override; private: OperatorType operatorType; diff --git a/src/storm/logic/BinaryBooleanStateFormula.cpp b/src/storm/logic/BinaryBooleanStateFormula.cpp index ec630eb59..925a155bf 100644 --- a/src/storm/logic/BinaryBooleanStateFormula.cpp +++ b/src/storm/logic/BinaryBooleanStateFormula.cpp @@ -31,15 +31,19 @@ namespace storm { return this->getOperator() == OperatorType::Or; } - std::ostream& BinaryBooleanStateFormula::writeToStream(std::ostream& out) const { - out << "("; - this->getLeftSubformula().writeToStream(out); + std::ostream& BinaryBooleanStateFormula::writeToStream(std::ostream& out, bool allowParentheses) const { + if (allowParentheses) { + out << "("; + } + this->getLeftSubformula().writeToStream(out, true); switch (operatorType) { case OperatorType::And: out << " & "; break; case OperatorType::Or: out << " | "; break; } - this->getRightSubformula().writeToStream(out); - out << ")"; + this->getRightSubformula().writeToStream(out, true); + if (allowParentheses) { + out << ")"; + } return out; } } diff --git a/src/storm/logic/BinaryBooleanStateFormula.h b/src/storm/logic/BinaryBooleanStateFormula.h index 085b4fb24..26bb3b717 100644 --- a/src/storm/logic/BinaryBooleanStateFormula.h +++ b/src/storm/logic/BinaryBooleanStateFormula.h @@ -27,7 +27,7 @@ namespace storm { virtual bool isAnd() const; virtual bool isOr() const; - virtual std::ostream& writeToStream(std::ostream& out) const override; + virtual std::ostream& writeToStream(std::ostream& out, bool allowParentheses = false) const override; private: OperatorType operatorType; diff --git a/src/storm/logic/BooleanLiteralFormula.cpp b/src/storm/logic/BooleanLiteralFormula.cpp index 15f961509..552c048b4 100644 --- a/src/storm/logic/BooleanLiteralFormula.cpp +++ b/src/storm/logic/BooleanLiteralFormula.cpp @@ -24,7 +24,8 @@ namespace storm { return visitor.visit(*this, data); } - std::ostream& BooleanLiteralFormula::writeToStream(std::ostream& out) const { + std::ostream& BooleanLiteralFormula::writeToStream(std::ostream& out, bool /*allowParentheses */) const { + // No parentheses necessary if (value) { out << "true"; } else { diff --git a/src/storm/logic/BooleanLiteralFormula.h b/src/storm/logic/BooleanLiteralFormula.h index 2cc59ea15..ef83b6349 100644 --- a/src/storm/logic/BooleanLiteralFormula.h +++ b/src/storm/logic/BooleanLiteralFormula.h @@ -19,7 +19,7 @@ namespace storm { virtual boost::any accept(FormulaVisitor const& visitor, boost::any const& data) const override; - virtual std::ostream& writeToStream(std::ostream& out) const override; + virtual std::ostream& writeToStream(std::ostream& out, bool allowParentheses = false) const override; private: bool value; diff --git a/src/storm/logic/BoundedUntilFormula.cpp b/src/storm/logic/BoundedUntilFormula.cpp index 572712257..e22b626a0 100644 --- a/src/storm/logic/BoundedUntilFormula.cpp +++ b/src/storm/logic/BoundedUntilFormula.cpp @@ -309,7 +309,7 @@ namespace storm { return std::make_shared<BoundedUntilFormula const>(getLeftSubformula(i).asSharedPointer(), getRightSubformula(i).asSharedPointer(), lowerBound.at(i), upperBound.at(i), getTimeBoundReference(i)); } - std::ostream& BoundedUntilFormula::writeToStream(std::ostream& out) const { + std::ostream& BoundedUntilFormula::writeToStream(std::ostream& out, bool allowParentheses) const { if (hasMultiDimensionalSubformulas()) { out << "multi("; restrictToDimension(0)->writeToStream(out); @@ -319,8 +319,10 @@ namespace storm { } out << ")"; } else { - - this->getLeftSubformula().writeToStream(out); + if (allowParentheses) { + out << "("; + } + this->getLeftSubformula().writeToStream(out, true); out << " U"; if (this->isMultiDimensional()) { @@ -379,7 +381,10 @@ namespace storm { out << "}"; } - this->getRightSubformula().writeToStream(out); + this->getRightSubformula().writeToStream(out, true); + if (allowParentheses) { + out << ")"; + } } return out; diff --git a/src/storm/logic/BoundedUntilFormula.h b/src/storm/logic/BoundedUntilFormula.h index df1ff92b5..65da690da 100644 --- a/src/storm/logic/BoundedUntilFormula.h +++ b/src/storm/logic/BoundedUntilFormula.h @@ -67,7 +67,7 @@ namespace storm { std::shared_ptr<BoundedUntilFormula const> restrictToDimension(unsigned i) const; - virtual std::ostream& writeToStream(std::ostream& out) const override; + virtual std::ostream& writeToStream(std::ostream& out, bool allowParentheses = false) const override; private: static void checkNoVariablesInBound(storm::expressions::Expression const& bound); diff --git a/src/storm/logic/ConditionalFormula.cpp b/src/storm/logic/ConditionalFormula.cpp index a02af1877..70f82eaec 100644 --- a/src/storm/logic/ConditionalFormula.cpp +++ b/src/storm/logic/ConditionalFormula.cpp @@ -62,10 +62,16 @@ namespace storm { return true; } - std::ostream& ConditionalFormula::writeToStream(std::ostream& out) const { - this->getSubformula().writeToStream(out); + std::ostream& ConditionalFormula::writeToStream(std::ostream& out, bool allowParentheses) const { + if (allowParentheses) { + out << "("; + } + this->getSubformula().writeToStream(out, true); out << " || "; - this->getConditionFormula().writeToStream(out); + this->getConditionFormula().writeToStream(out, true); + if (allowParentheses) { + out << ")"; + } return out; } } diff --git a/src/storm/logic/ConditionalFormula.h b/src/storm/logic/ConditionalFormula.h index 3a32b3463..1c973085a 100644 --- a/src/storm/logic/ConditionalFormula.h +++ b/src/storm/logic/ConditionalFormula.h @@ -23,7 +23,7 @@ namespace storm { virtual boost::any accept(FormulaVisitor const& visitor, boost::any const& data) const override; - virtual std::ostream& writeToStream(std::ostream& out) const override; + virtual std::ostream& writeToStream(std::ostream& out, bool allowParentheses = false) const override; virtual void gatherAtomicExpressionFormulas(std::vector<std::shared_ptr<AtomicExpressionFormula const>>& atomicExpressionFormulas) const override; virtual void gatherAtomicLabelFormulas(std::vector<std::shared_ptr<AtomicLabelFormula const>>& atomicLabelFormulas) const override; diff --git a/src/storm/logic/CumulativeRewardFormula.cpp b/src/storm/logic/CumulativeRewardFormula.cpp index ccafab82c..482731108 100644 --- a/src/storm/logic/CumulativeRewardFormula.cpp +++ b/src/storm/logic/CumulativeRewardFormula.cpp @@ -161,7 +161,8 @@ namespace storm { return std::make_shared<CumulativeRewardFormula const>(bounds.at(i), getTimeBoundReference(i), rewardAccumulation); } - std::ostream& CumulativeRewardFormula::writeToStream(std::ostream& out) const { + std::ostream& CumulativeRewardFormula::writeToStream(std::ostream& out, bool /*allowParentheses*/ ) const { + // No parentheses necessary out << "C"; if (hasRewardAccumulation()) { out << "[" << getRewardAccumulation() << "]"; diff --git a/src/storm/logic/CumulativeRewardFormula.h b/src/storm/logic/CumulativeRewardFormula.h index 80924865a..b15b17de8 100644 --- a/src/storm/logic/CumulativeRewardFormula.h +++ b/src/storm/logic/CumulativeRewardFormula.h @@ -26,7 +26,7 @@ namespace storm { virtual void gatherReferencedRewardModels(std::set<std::string>& referencedRewardModels) const override; virtual void gatherUsedVariables(std::set<storm::expressions::Variable>& usedVariables) const override; - virtual std::ostream& writeToStream(std::ostream& out) const override; + virtual std::ostream& writeToStream(std::ostream& out, bool allowParentheses = false) const override; TimeBoundReference const& getTimeBoundReference() const; TimeBoundReference const& getTimeBoundReference(unsigned i) const; diff --git a/src/storm/logic/EventuallyFormula.cpp b/src/storm/logic/EventuallyFormula.cpp index 12a77d49b..dcea3d9e2 100644 --- a/src/storm/logic/EventuallyFormula.cpp +++ b/src/storm/logic/EventuallyFormula.cpp @@ -55,12 +55,18 @@ namespace storm { return visitor.visit(*this, data); } - std::ostream& EventuallyFormula::writeToStream(std::ostream& out) const { + std::ostream& EventuallyFormula::writeToStream(std::ostream& out, bool allowParentheses) const { + if (allowParentheses) { + out << "("; + } out << "F "; if (hasRewardAccumulation()) { out << "[" << getRewardAccumulation() << "]"; } - this->getSubformula().writeToStream(out); + this->getSubformula().writeToStream(out, !this->getSubformula().isUnaryFormula()); + if (allowParentheses) { + out << ")"; + } return out; } } diff --git a/src/storm/logic/EventuallyFormula.h b/src/storm/logic/EventuallyFormula.h index 5fa30da6d..fdce64eb5 100644 --- a/src/storm/logic/EventuallyFormula.h +++ b/src/storm/logic/EventuallyFormula.h @@ -29,7 +29,7 @@ namespace storm { virtual boost::any accept(FormulaVisitor const& visitor, boost::any const& data) const override; - virtual std::ostream& writeToStream(std::ostream& out) const override; + virtual std::ostream& writeToStream(std::ostream& out, bool allowParentheses = false) const override; bool hasRewardAccumulation() const; RewardAccumulation const& getRewardAccumulation() const; diff --git a/src/storm/logic/Formula.cpp b/src/storm/logic/Formula.cpp index 752389b36..b71316097 100644 --- a/src/storm/logic/Formula.cpp +++ b/src/storm/logic/Formula.cpp @@ -179,6 +179,10 @@ namespace storm { bool Formula::isOperatorFormula() const { return false; } + + bool Formula::isUnaryFormula() const { + return isUnaryPathFormula() || isUnaryStateFormula(); + } bool Formula::hasQualitativeResult() const { return true; diff --git a/src/storm/logic/Formula.h b/src/storm/logic/Formula.h index 72631e2fe..92100326a 100644 --- a/src/storm/logic/Formula.h +++ b/src/storm/logic/Formula.h @@ -94,6 +94,7 @@ namespace storm { virtual bool isBinaryStateFormula() const; virtual bool isUnaryPathFormula() const; virtual bool isUnaryStateFormula() const; + bool isUnaryFormula() const; // Accessors for the return type of a formula. virtual bool hasQualitativeResult() const; @@ -236,7 +237,14 @@ namespace storm { 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; + + /*! + * Writes the forumla to the given output stream + * @param allowParenthesis if true, the output is *potentially* surrounded by parentheses depending on whether parentheses are needed to avoid ambiguity when this formula appears as a subformula of some larger formula. + * @return + */ + virtual std::ostream& writeToStream(std::ostream& out, bool allowParentheses = false) const = 0; + std::string toPrefixString() const; virtual void gatherAtomicExpressionFormulas(std::vector<std::shared_ptr<AtomicExpressionFormula const>>& atomicExpressionFormulas) const; diff --git a/src/storm/logic/GameFormula.cpp b/src/storm/logic/GameFormula.cpp index 8387e38fd..462631c62 100644 --- a/src/storm/logic/GameFormula.cpp +++ b/src/storm/logic/GameFormula.cpp @@ -32,9 +32,10 @@ namespace storm { return visitor.visit(*this, data); } - std::ostream& GameFormula::writeToStream(std::ostream& out) const { + std::ostream& GameFormula::writeToStream(std::ostream& out, bool /* allowParentheses */) const { + // No parenthesis necessary out << "<<" << coalition << ">> "; - this->getSubformula().writeToStream(out); + this->getSubformula().writeToStream(out, true); return out; } } diff --git a/src/storm/logic/GameFormula.h b/src/storm/logic/GameFormula.h index a14825cc5..1cadc5f62 100644 --- a/src/storm/logic/GameFormula.h +++ b/src/storm/logic/GameFormula.h @@ -24,7 +24,7 @@ namespace storm { virtual boost::any accept(FormulaVisitor const& visitor, boost::any const& data) const override; - virtual std::ostream& writeToStream(std::ostream& out) const override; + virtual std::ostream& writeToStream(std::ostream& out, bool allowParentheses = false) const override; private: PlayerCoalition coalition; diff --git a/src/storm/logic/GloballyFormula.cpp b/src/storm/logic/GloballyFormula.cpp index af429be92..cb9bac874 100644 --- a/src/storm/logic/GloballyFormula.cpp +++ b/src/storm/logic/GloballyFormula.cpp @@ -20,9 +20,15 @@ namespace storm { return visitor.visit(*this, data); } - std::ostream& GloballyFormula::writeToStream(std::ostream& out) const { + std::ostream& GloballyFormula::writeToStream(std::ostream& out, bool allowParentheses) const { + if (allowParentheses) { + out << "("; + } out << "G "; - this->getSubformula().writeToStream(out); + this->getSubformula().writeToStream(out, !this->getSubformula().isUnaryFormula()); + if (allowParentheses) { + out << ")"; + } return out; } } diff --git a/src/storm/logic/GloballyFormula.h b/src/storm/logic/GloballyFormula.h index 6c44ba2a1..3eaa834c3 100644 --- a/src/storm/logic/GloballyFormula.h +++ b/src/storm/logic/GloballyFormula.h @@ -18,7 +18,7 @@ namespace storm { virtual boost::any accept(FormulaVisitor const& visitor, boost::any const& data) const override; - virtual std::ostream& writeToStream(std::ostream& out) const override; + virtual std::ostream& writeToStream(std::ostream& out, bool allowParentheses = false) const override; }; } } diff --git a/src/storm/logic/HOAPathFormula.cpp b/src/storm/logic/HOAPathFormula.cpp index 915f4f13d..cd17a6a46 100644 --- a/src/storm/logic/HOAPathFormula.cpp +++ b/src/storm/logic/HOAPathFormula.cpp @@ -76,7 +76,8 @@ namespace storm { } - std::ostream& HOAPathFormula::writeToStream(std::ostream& out) const { + std::ostream& HOAPathFormula::writeToStream(std::ostream& out, bool /* allowParentheses */ ) const { + // No parentheses necessary out << "HOA: { "; out << "\"" << automatonFile << "\""; for (auto& mapping : apToFormulaMap) { diff --git a/src/storm/logic/HOAPathFormula.h b/src/storm/logic/HOAPathFormula.h index 81352243e..fd9ba1a93 100644 --- a/src/storm/logic/HOAPathFormula.h +++ b/src/storm/logic/HOAPathFormula.h @@ -39,7 +39,7 @@ namespace storm { virtual void gatherAtomicLabelFormulas(std::vector<std::shared_ptr<AtomicLabelFormula const>>& atomicLabelFormulas) const override; virtual void gatherReferencedRewardModels(std::set<std::string>& referencedRewardModels) const override; - virtual std::ostream& writeToStream(std::ostream& out) const override; + virtual std::ostream& writeToStream(std::ostream& out, bool allowParentheses = false) const override; std::shared_ptr<storm::automata::DeterministicAutomaton> readAutomaton() const; diff --git a/src/storm/logic/InstantaneousRewardFormula.cpp b/src/storm/logic/InstantaneousRewardFormula.cpp index 1ed2c1f66..c5e615515 100644 --- a/src/storm/logic/InstantaneousRewardFormula.cpp +++ b/src/storm/logic/InstantaneousRewardFormula.cpp @@ -68,7 +68,8 @@ namespace storm { STORM_LOG_THROW(!bound.containsVariables(), storm::exceptions::InvalidOperationException, "Cannot evaluate time-instant '" << bound << "' as it contains undefined constants."); } - std::ostream& InstantaneousRewardFormula::writeToStream(std::ostream& out) const { + std::ostream& InstantaneousRewardFormula::writeToStream(std::ostream& out, bool /* allowParentheses */) const { + // No parentheses necessary. out << "I=" << this->getBound(); return out; } diff --git a/src/storm/logic/InstantaneousRewardFormula.h b/src/storm/logic/InstantaneousRewardFormula.h index 69e5dd38f..6d6b440f6 100644 --- a/src/storm/logic/InstantaneousRewardFormula.h +++ b/src/storm/logic/InstantaneousRewardFormula.h @@ -22,7 +22,7 @@ namespace storm { virtual boost::any accept(FormulaVisitor const& visitor, boost::any const& data) const override; - virtual std::ostream& writeToStream(std::ostream& out) const override; + virtual std::ostream& writeToStream(std::ostream& out, bool allowParentheses = false) const override; TimeBoundType const& getTimeBoundType() const; bool isStepBounded() const; diff --git a/src/storm/logic/LongRunAverageOperatorFormula.cpp b/src/storm/logic/LongRunAverageOperatorFormula.cpp index 6f4c061cb..24997ed73 100644 --- a/src/storm/logic/LongRunAverageOperatorFormula.cpp +++ b/src/storm/logic/LongRunAverageOperatorFormula.cpp @@ -18,10 +18,11 @@ namespace storm { boost::any LongRunAverageOperatorFormula::accept(FormulaVisitor const& visitor, boost::any const& data) const { return visitor.visit(*this, data); } - - std::ostream& LongRunAverageOperatorFormula::writeToStream(std::ostream& out) const { + + std::ostream& LongRunAverageOperatorFormula::writeToStream(std::ostream& out, bool /* allowParentheses */) const { + // No parentheses necessary out << "LRA"; - OperatorFormula::writeToStream(out); + OperatorFormula::writeToStream(out, false); return out; } } diff --git a/src/storm/logic/LongRunAverageOperatorFormula.h b/src/storm/logic/LongRunAverageOperatorFormula.h index 9cc156408..4774537b9 100644 --- a/src/storm/logic/LongRunAverageOperatorFormula.h +++ b/src/storm/logic/LongRunAverageOperatorFormula.h @@ -17,7 +17,7 @@ namespace storm { virtual boost::any accept(FormulaVisitor const& visitor, boost::any const& data) const override; - virtual std::ostream& writeToStream(std::ostream& out) const override; + virtual std::ostream& writeToStream(std::ostream& out, bool allowParentheses = false) const override; }; } } diff --git a/src/storm/logic/LongRunAverageRewardFormula.cpp b/src/storm/logic/LongRunAverageRewardFormula.cpp index 294c8de95..4dd7a2a33 100644 --- a/src/storm/logic/LongRunAverageRewardFormula.cpp +++ b/src/storm/logic/LongRunAverageRewardFormula.cpp @@ -32,7 +32,8 @@ namespace storm { return visitor.visit(*this, data); } - std::ostream& LongRunAverageRewardFormula::writeToStream(std::ostream& out) const { + std::ostream& LongRunAverageRewardFormula::writeToStream(std::ostream& out, bool /* allowParentheses */) const { + // No parentheses necessary out << "LRA"; if (hasRewardAccumulation()) { out << "[" << getRewardAccumulation() << "]"; diff --git a/src/storm/logic/LongRunAverageRewardFormula.h b/src/storm/logic/LongRunAverageRewardFormula.h index 45bbe3de5..03b21b761 100644 --- a/src/storm/logic/LongRunAverageRewardFormula.h +++ b/src/storm/logic/LongRunAverageRewardFormula.h @@ -23,7 +23,7 @@ namespace storm { virtual boost::any accept(FormulaVisitor const& visitor, boost::any const& data) const override; - virtual std::ostream& writeToStream(std::ostream& out) const override; + virtual std::ostream& writeToStream(std::ostream& out, bool allowParentheses = false) const override; private: boost::optional<RewardAccumulation> rewardAccumulation; diff --git a/src/storm/logic/MultiObjectiveFormula.cpp b/src/storm/logic/MultiObjectiveFormula.cpp index 0ecf795b0..edae6a1ea 100644 --- a/src/storm/logic/MultiObjectiveFormula.cpp +++ b/src/storm/logic/MultiObjectiveFormula.cpp @@ -84,7 +84,8 @@ namespace storm { } } - std::ostream& MultiObjectiveFormula::writeToStream(std::ostream &out) const { + std::ostream& MultiObjectiveFormula::writeToStream(std::ostream &out, bool /* allowParentheses */) const { + // No parentheses necessary out << "multi("; for(uint_fast64_t index = 0; index < this->getNumberOfSubformulas(); ++index){ if(index>0){ diff --git a/src/storm/logic/MultiObjectiveFormula.h b/src/storm/logic/MultiObjectiveFormula.h index 9ec5204d9..faf774958 100644 --- a/src/storm/logic/MultiObjectiveFormula.h +++ b/src/storm/logic/MultiObjectiveFormula.h @@ -27,7 +27,7 @@ namespace storm { virtual void gatherAtomicLabelFormulas(std::vector<std::shared_ptr<AtomicLabelFormula const>>& atomicLabelFormulas) const override; virtual void gatherReferencedRewardModels(std::set<std::string>& referencedRewardModels) const override; - virtual std::ostream& writeToStream(std::ostream& out) const override; + virtual std::ostream& writeToStream(std::ostream& out, bool allowParentheses = false) const override; private: std::vector<std::shared_ptr<Formula const>> subformulas; }; diff --git a/src/storm/logic/NextFormula.cpp b/src/storm/logic/NextFormula.cpp index f38df2ac0..c99d4d35c 100644 --- a/src/storm/logic/NextFormula.cpp +++ b/src/storm/logic/NextFormula.cpp @@ -20,9 +20,15 @@ namespace storm { return visitor.visit(*this, data); } - std::ostream& NextFormula::writeToStream(std::ostream& out) const { + std::ostream& NextFormula::writeToStream(std::ostream& out, bool allowParentheses) const { + if (allowParentheses) { + out << "("; + } out << "X "; - this->getSubformula().writeToStream(out); + this->getSubformula().writeToStream(out, !this->getSubformula().isUnaryFormula()); + if (allowParentheses) { + out << ")"; + } return out; } } diff --git a/src/storm/logic/NextFormula.h b/src/storm/logic/NextFormula.h index 2083fee98..e67010de0 100644 --- a/src/storm/logic/NextFormula.h +++ b/src/storm/logic/NextFormula.h @@ -18,7 +18,7 @@ namespace storm { virtual boost::any accept(FormulaVisitor const& visitor, boost::any const& data) const override; - virtual std::ostream& writeToStream(std::ostream& out) const override; + virtual std::ostream& writeToStream(std::ostream& out, bool allowParentheses = false) const override; }; } } diff --git a/src/storm/logic/OperatorFormula.cpp b/src/storm/logic/OperatorFormula.cpp index 890d5476c..7bf7bd55f 100644 --- a/src/storm/logic/OperatorFormula.cpp +++ b/src/storm/logic/OperatorFormula.cpp @@ -104,7 +104,8 @@ namespace storm { } } - std::ostream& OperatorFormula::writeToStream(std::ostream& out) const { + std::ostream& OperatorFormula::writeToStream(std::ostream& out, bool /* allowParentheses */) const { + // No parentheses necessary if (hasOptimalityType()) { out << (getOptimalityType() == OptimizationDirection::Minimize ? "min" : "max"); } diff --git a/src/storm/logic/OperatorFormula.h b/src/storm/logic/OperatorFormula.h index c4d3067fb..807661aa2 100644 --- a/src/storm/logic/OperatorFormula.h +++ b/src/storm/logic/OperatorFormula.h @@ -56,7 +56,7 @@ namespace storm { virtual void gatherUsedVariables(std::set<storm::expressions::Variable>& usedVariables) const override; - virtual std::ostream& writeToStream(std::ostream& out) const override; + virtual std::ostream& writeToStream(std::ostream& out, bool allowParentheses = false) const override; protected: OperatorInformation operatorInformation; diff --git a/src/storm/logic/ProbabilityOperatorFormula.cpp b/src/storm/logic/ProbabilityOperatorFormula.cpp index 0c36a07a5..25af22871 100644 --- a/src/storm/logic/ProbabilityOperatorFormula.cpp +++ b/src/storm/logic/ProbabilityOperatorFormula.cpp @@ -19,9 +19,10 @@ namespace storm { return visitor.visit(*this, data); } - std::ostream& ProbabilityOperatorFormula::writeToStream(std::ostream& out) const { + std::ostream& ProbabilityOperatorFormula::writeToStream(std::ostream& out, bool /* allowParentheses */) const { + // No parentheses necessary out << "P"; - OperatorFormula::writeToStream(out); + OperatorFormula::writeToStream(out, false); return out; } } diff --git a/src/storm/logic/ProbabilityOperatorFormula.h b/src/storm/logic/ProbabilityOperatorFormula.h index 37950b3cb..92c8a3e87 100644 --- a/src/storm/logic/ProbabilityOperatorFormula.h +++ b/src/storm/logic/ProbabilityOperatorFormula.h @@ -17,7 +17,7 @@ namespace storm { virtual boost::any accept(FormulaVisitor const& visitor, boost::any const& data) const override; - virtual std::ostream& writeToStream(std::ostream& out) const override; + virtual std::ostream& writeToStream(std::ostream& out, bool allowParentheses = false) const override; }; } } diff --git a/src/storm/logic/QuantileFormula.cpp b/src/storm/logic/QuantileFormula.cpp index 4e1e21aef..679d14d99 100644 --- a/src/storm/logic/QuantileFormula.cpp +++ b/src/storm/logic/QuantileFormula.cpp @@ -73,7 +73,8 @@ namespace storm { subformula->gatherReferencedRewardModels(referencedRewardModels); } - std::ostream& QuantileFormula::writeToStream(std::ostream& out) const { + std::ostream& QuantileFormula::writeToStream(std::ostream& out, bool /* allowParentheses */) const { + // No parentheses necessary out << "quantile("; for (auto const& bv : boundVariables) { out << bv.getName() << ", "; diff --git a/src/storm/logic/QuantileFormula.h b/src/storm/logic/QuantileFormula.h index 8765013a7..4bfe0a5a1 100644 --- a/src/storm/logic/QuantileFormula.h +++ b/src/storm/logic/QuantileFormula.h @@ -29,7 +29,7 @@ namespace storm { virtual void gatherAtomicLabelFormulas(std::vector<std::shared_ptr<AtomicLabelFormula const>>& atomicLabelFormulas) const override; virtual void gatherReferencedRewardModels(std::set<std::string>& referencedRewardModels) const override; - virtual std::ostream& writeToStream(std::ostream& out) const override; + virtual std::ostream& writeToStream(std::ostream& out, bool allowParentheses = false) const override; private: std::vector<storm::expressions::Variable> boundVariables; std::shared_ptr<Formula const> subformula; diff --git a/src/storm/logic/RewardOperatorFormula.cpp b/src/storm/logic/RewardOperatorFormula.cpp index 28d1678e5..bdceca897 100644 --- a/src/storm/logic/RewardOperatorFormula.cpp +++ b/src/storm/logic/RewardOperatorFormula.cpp @@ -44,7 +44,8 @@ namespace storm { return rewardMeasureType; } - std::ostream& RewardOperatorFormula::writeToStream(std::ostream& out) const { + std::ostream& RewardOperatorFormula::writeToStream(std::ostream& out, bool /* allowParentheses */) const { + // No parentheses necessary out << "R"; out << "[" << rewardMeasureType << "]"; if (this->hasRewardModelName()) { diff --git a/src/storm/logic/RewardOperatorFormula.h b/src/storm/logic/RewardOperatorFormula.h index af9a09056..77564714b 100644 --- a/src/storm/logic/RewardOperatorFormula.h +++ b/src/storm/logic/RewardOperatorFormula.h @@ -20,7 +20,7 @@ namespace storm { virtual void gatherReferencedRewardModels(std::set<std::string>& referencedRewardModels) const override; - virtual std::ostream& writeToStream(std::ostream& out) const override; + virtual std::ostream& writeToStream(std::ostream& out, bool allowParentheses = false) const override; /*! * Retrieves whether the reward model refers to a specific reward model. diff --git a/src/storm/logic/TimeOperatorFormula.cpp b/src/storm/logic/TimeOperatorFormula.cpp index f32568cdc..5fe746a12 100644 --- a/src/storm/logic/TimeOperatorFormula.cpp +++ b/src/storm/logic/TimeOperatorFormula.cpp @@ -24,7 +24,8 @@ namespace storm { return rewardMeasureType; } - std::ostream& TimeOperatorFormula::writeToStream(std::ostream& out) const { + std::ostream& TimeOperatorFormula::writeToStream(std::ostream& out, bool /* allowParentheses */) const { + // No parentheses necessary out << "T"; out << "[" << rewardMeasureType << "]"; OperatorFormula::writeToStream(out); diff --git a/src/storm/logic/TimeOperatorFormula.h b/src/storm/logic/TimeOperatorFormula.h index 080cec30d..0a52cb879 100644 --- a/src/storm/logic/TimeOperatorFormula.h +++ b/src/storm/logic/TimeOperatorFormula.h @@ -19,7 +19,7 @@ namespace storm { virtual boost::any accept(FormulaVisitor const& visitor, boost::any const& data) const override; - virtual std::ostream& writeToStream(std::ostream& out) const override; + virtual std::ostream& writeToStream(std::ostream& out, bool allowParentheses = false) const override; /*! * Retrieves the measure type of the operator. diff --git a/src/storm/logic/TotalRewardFormula.cpp b/src/storm/logic/TotalRewardFormula.cpp index fb6f60873..8bd8e26eb 100644 --- a/src/storm/logic/TotalRewardFormula.cpp +++ b/src/storm/logic/TotalRewardFormula.cpp @@ -32,7 +32,8 @@ namespace storm { return visitor.visit(*this, data); } - std::ostream& TotalRewardFormula::writeToStream(std::ostream& out) const { + std::ostream& TotalRewardFormula::writeToStream(std::ostream& out, bool /* allowParentheses */) const { + // No parentheses necessary out << "C"; if (hasRewardAccumulation()) { out << "[" << getRewardAccumulation() << "]"; diff --git a/src/storm/logic/TotalRewardFormula.h b/src/storm/logic/TotalRewardFormula.h index 1fa366723..42bce45c8 100644 --- a/src/storm/logic/TotalRewardFormula.h +++ b/src/storm/logic/TotalRewardFormula.h @@ -24,7 +24,7 @@ namespace storm { virtual boost::any accept(FormulaVisitor const& visitor, boost::any const& data) const override; - virtual std::ostream& writeToStream(std::ostream& out) const override; + virtual std::ostream& writeToStream(std::ostream& out, bool allowParentheses = false) const override; private: boost::optional<RewardAccumulation> rewardAccumulation; diff --git a/src/storm/logic/UnaryBooleanPathFormula.cpp b/src/storm/logic/UnaryBooleanPathFormula.cpp index 7613032b6..707599e0b 100644 --- a/src/storm/logic/UnaryBooleanPathFormula.cpp +++ b/src/storm/logic/UnaryBooleanPathFormula.cpp @@ -36,12 +36,17 @@ namespace storm { return this->getOperator() == OperatorType::Not; } - std::ostream& UnaryBooleanPathFormula::writeToStream(std::ostream& out) const { + std::ostream& UnaryBooleanPathFormula::writeToStream(std::ostream& out, bool allowParentheses) const { + if (allowParentheses) { + out << "("; + } switch (operatorType) { - case OperatorType::Not: out << "!("; break; + case OperatorType::Not: out << "!"; break; + } + this->getSubformula().writeToStream(out, !this->getSubformula().isUnaryFormula()); + if (allowParentheses) { + out << ")"; } - this->getSubformula().writeToStream(out); - out << ")"; return out; } } diff --git a/src/storm/logic/UnaryBooleanPathFormula.h b/src/storm/logic/UnaryBooleanPathFormula.h index 3323f6949..f8a78aed5 100644 --- a/src/storm/logic/UnaryBooleanPathFormula.h +++ b/src/storm/logic/UnaryBooleanPathFormula.h @@ -28,7 +28,7 @@ namespace storm { virtual bool isNot() const; - virtual std::ostream& writeToStream(std::ostream& out) const override; + virtual std::ostream& writeToStream(std::ostream& out, bool allowParentheses = false) const override; private: OperatorType operatorType; diff --git a/src/storm/logic/UnaryBooleanStateFormula.cpp b/src/storm/logic/UnaryBooleanStateFormula.cpp index ef75a0f9b..5592d4589 100644 --- a/src/storm/logic/UnaryBooleanStateFormula.cpp +++ b/src/storm/logic/UnaryBooleanStateFormula.cpp @@ -27,12 +27,17 @@ namespace storm { return this->getOperator() == OperatorType::Not; } - std::ostream& UnaryBooleanStateFormula::writeToStream(std::ostream& out) const { + std::ostream& UnaryBooleanStateFormula::writeToStream(std::ostream& out, bool allowParentheses) const { + if (allowParentheses) { + out << "("; + } switch (operatorType) { - case OperatorType::Not: out << "!("; break; + case OperatorType::Not: out << "!"; break; + } + this->getSubformula().writeToStream(out, !this->getSubformula().isUnaryFormula()); + if (allowParentheses) { + out << ")"; } - this->getSubformula().writeToStream(out); - out << ")"; return out; } } diff --git a/src/storm/logic/UnaryBooleanStateFormula.h b/src/storm/logic/UnaryBooleanStateFormula.h index 4c3cd3c17..14aef7eb1 100644 --- a/src/storm/logic/UnaryBooleanStateFormula.h +++ b/src/storm/logic/UnaryBooleanStateFormula.h @@ -24,7 +24,7 @@ namespace storm { virtual bool isNot() const; - virtual std::ostream& writeToStream(std::ostream& out) const override; + virtual std::ostream& writeToStream(std::ostream& out, bool allowParentheses = false) const override; private: OperatorType operatorType; diff --git a/src/storm/logic/UntilFormula.cpp b/src/storm/logic/UntilFormula.cpp index d4b09bd4d..945bb9283 100644 --- a/src/storm/logic/UntilFormula.cpp +++ b/src/storm/logic/UntilFormula.cpp @@ -20,10 +20,16 @@ namespace storm { return visitor.visit(*this, data); } - std::ostream& UntilFormula::writeToStream(std::ostream& out) const { - this->getLeftSubformula().writeToStream(out); + std::ostream& UntilFormula::writeToStream(std::ostream& out, bool allowParentheses) const { + if (allowParentheses) { + out << "("; + } + this->getLeftSubformula().writeToStream(out, true); out << " U "; - this->getRightSubformula().writeToStream(out); + this->getRightSubformula().writeToStream(out, true); + if (allowParentheses) { + out << ")"; + } return out; } } diff --git a/src/storm/logic/UntilFormula.h b/src/storm/logic/UntilFormula.h index a26542a38..db8804504 100644 --- a/src/storm/logic/UntilFormula.h +++ b/src/storm/logic/UntilFormula.h @@ -18,7 +18,7 @@ namespace storm { virtual boost::any accept(FormulaVisitor const& visitor, boost::any const& data) const override; - virtual std::ostream& writeToStream(std::ostream& out) const override; + virtual std::ostream& writeToStream(std::ostream& out, bool allowParentheses = false) const override; }; } }