25 FormulaParserGrammar(std::shared_ptr<storm::expressions::ExpressionManager const>
const& manager);
40 qi::symbols<char, storm::expressions::Expression>
const&
getIdentifiers()
const;
45 struct keywordsStruct : qi::symbols<char, uint_fast64_t> {
47 add(
"true", 1)(
"false", 2)(
"min", 3)(
"max", 4)(
"F", 5)(
"G", 6)(
"X", 7)(
"U", 8)(
"C", 9)(
"I", 10)(
"P", 11)(
"R", 12)(
"S", 13);
51 keywordsStruct keywords_;
53 struct nonStandardKeywordsStruct : qi::symbols<char, uint_fast64_t> {
54 nonStandardKeywordsStruct() {
55 add(
"T", 1)(
"LRA", 2)(
"MP", 3)(
"multi", 4)(
"quantile", 5)(
"HOA", 6);
60 nonStandardKeywordsStruct nonStandardKeywords_;
62 struct relationalOperatorStruct : qi::symbols<char, storm::logic::ComparisonType> {
63 relationalOperatorStruct() {
70 relationalOperatorStruct relationalOperator_;
72 struct optimalityOperatorStruct : qi::symbols<char, storm::OptimizationDirection> {
73 optimalityOperatorStruct() {
74 add(
"min", storm::OptimizationDirection::Minimize)(
"max", storm::OptimizationDirection::Maximize);
79 optimalityOperatorStruct optimalityOperator_;
81 struct filterTypeStruct : qi::symbols<char, storm::modelchecker::FilterType> {
92 filterTypeStruct filterType_;
94 struct operatorKeyword : qi::symbols<char, storm::logic::FormulaContext> {
100 operatorKeyword operatorKeyword_;
102 enum class FormulaKind {
106 qi::rule<
Iterator, qi::unused_type(FormulaKind), Skipper> isPathFormula;
109 std::shared_ptr<storm::expressions::ExpressionManager const> constManager;
110 std::shared_ptr<storm::expressions::ExpressionManager>
manager;
117 qi::symbols<char, storm::expressions::Expression> identifiers_;
122 qi::rule<
Iterator, qi::unused_type(std::shared_ptr<storm::logic::Formula const>, std::string), Skipper> noAmbiguousNonAssociativeOperator;
123 qi::rule<
Iterator, std::string(), Skipper> identifier;
124 qi::rule<
Iterator, std::string(), Skipper> label;
125 qi::rule<
Iterator, std::string(), Skipper> quotedString;
131 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(), qi::locals<storm::logic::FormulaContext>, Skipper> operatorFormula;
134 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(), Skipper> labelFormula;
135 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(), Skipper> expressionFormula;
138 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(FormulaKind,
storm::logic::FormulaContext), Skipper> basicPropositionalFormula;
139 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(FormulaKind,
storm::logic::FormulaContext), Skipper> negationPropositionalFormula;
140 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(FormulaKind,
storm::logic::FormulaContext), Skipper> andLevelPropositionalFormula;
141 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(FormulaKind,
storm::logic::FormulaContext), Skipper> orLevelPropositionalFormula;
142 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(FormulaKind,
storm::logic::FormulaContext), Skipper> propositionalFormula;
145 qi::rule<Iterator, std::shared_ptr<storm::logic::TimeBoundReference>, Skipper> timeBoundReference;
148 std::tuple<boost::optional<storm::logic::TimeBound>, boost::optional<storm::logic::TimeBound>, std::shared_ptr<storm::logic::TimeBoundReference>>(),
149 qi::locals<bool, bool>, Skipper>
152 std::vector<std::tuple<boost::optional<storm::logic::TimeBound>, boost::optional<storm::logic::TimeBound>,
153 std::shared_ptr<storm::logic::TimeBoundReference>>>(),
154 qi::locals<bool, bool>, Skipper>
168 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(), Skipper> longRunAverageRewardFormula;
169 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(), Skipper> instantaneousRewardFormula;
170 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(), Skipper> cumulativeRewardFormula;
171 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(), Skipper> totalRewardFormula;
172 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(), Skipper> discountedCumulativeRewardFormula;
173 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(), Skipper> discountedTotalRewardFormula;
178 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(), Skipper> gameFormula;
181 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(), Skipper> multiOperatorFormula;
183 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(), Skipper> quantileFormula;
187 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(), Skipper> topLevelFormula;
190 qi::rule<
Iterator, std::string(), Skipper> formulaName;
193 qi::rule<
Iterator, qi::unused_type(), qi::locals<ConstantDataType>, Skipper> constantDefinition;
196 qi::rule<Iterator, std::vector<storm::jani::Property>(), Skipper> start;
198 void addHoaAPMapping(
storm::logic::Formula const& hoaFormula,
const std::string& ap, std::shared_ptr<storm::logic::Formula const>& expression)
const;
200 storm::logic::PlayerCoalition createPlayerCoalition(std::vector<std::variant<std::string, storm::storage::PlayerIndex>>
const& playerIds)
const;
202 std::shared_ptr<storm::logic::Formula const>
const& subformula)
const;
204 bool areConstantDefinitionsAllowed()
const;
205 void addConstant(std::string
const& name,
ConstantDataType type, boost::optional<storm::expressions::Expression>
const& expression);
206 void addProperty(std::vector<storm::jani::Property>& properties, boost::optional<std::string>
const& name,
207 std::shared_ptr<storm::logic::Formula const>
const& formula);
210 boost::optional<std::string>
const& rewardModelName)
const;
211 std::tuple<boost::optional<storm::logic::TimeBound>, boost::optional<storm::logic::TimeBound>, std::shared_ptr<storm::logic::TimeBoundReference>>
213 std::shared_ptr<storm::logic::TimeBoundReference>
const& timeBoundReference)
const;
214 std::tuple<boost::optional<storm::logic::TimeBound>, boost::optional<storm::logic::TimeBound>, std::shared_ptr<storm::logic::TimeBoundReference>>
216 std::shared_ptr<storm::logic::TimeBoundReference>
const& timeBoundReference)
const;
220 std::shared_ptr<storm::logic::Formula const> createCumulativeRewardFormula(
221 std::vector<std::tuple<boost::optional<storm::logic::TimeBound>, boost::optional<storm::logic::TimeBound>,
222 std::shared_ptr<storm::logic::TimeBoundReference>>>
const& timeBounds)
const;
223 std::shared_ptr<storm::logic::Formula const> createDiscountedCumulativeRewardFormula(
225 std::vector<std::tuple<boost::optional<storm::logic::TimeBound>, boost::optional<storm::logic::TimeBound>,
226 std::shared_ptr<storm::logic::TimeBoundReference>>>
const& timeBounds)
const;
227 std::shared_ptr<storm::logic::Formula const> createTotalRewardFormula()
const;
229 std::shared_ptr<storm::logic::Formula const> createLongRunAverageRewardFormula()
const;
231 std::shared_ptr<storm::logic::Formula const> createBooleanLiteralFormula(
bool literal)
const;
232 std::shared_ptr<storm::logic::Formula const> createAtomicLabelFormula(std::string
const& label)
const;
233 std::shared_ptr<storm::logic::Formula const> createEventuallyFormula(
234 boost::optional<std::vector<std::tuple<boost::optional<storm::logic::TimeBound>, boost::optional<storm::logic::TimeBound>,
235 std::shared_ptr<storm::logic::TimeBoundReference>>>>
const& timeBounds,
237 std::shared_ptr<storm::logic::Formula const> createGloballyFormula(std::shared_ptr<storm::logic::Formula const>
const& subformula)
const;
238 std::shared_ptr<storm::logic::Formula const> createNextFormula(std::shared_ptr<storm::logic::Formula const>
const& subformula)
const;
239 std::shared_ptr<storm::logic::Formula const> createUntilFormula(
240 std::shared_ptr<storm::logic::Formula const>
const& leftSubformula,
241 boost::optional<std::vector<std::tuple<boost::optional<storm::logic::TimeBound>, boost::optional<storm::logic::TimeBound>,
242 std::shared_ptr<storm::logic::TimeBoundReference>>>>
const& timeBounds,
243 std::shared_ptr<storm::logic::Formula const>
const& rightSubformula);
244 std::shared_ptr<storm::logic::Formula const> createHOAPathFormula(
const std::string& automataFile)
const;
245 std::shared_ptr<storm::logic::Formula const> createConditionalFormula(std::shared_ptr<storm::logic::Formula const>
const& leftSubformula,
246 boost::optional<std::shared_ptr<storm::logic::Formula const>>
const& rightSubformula,
249 boost::optional<storm::logic::ComparisonType>
const& comparisonType,
250 boost::optional<storm::expressions::Expression>
const& threshold)
const;
252 boost::optional<std::string>
const& rewardModelName,
254 std::shared_ptr<storm::logic::Formula const>
const& subformula);
256 std::shared_ptr<storm::logic::Formula const>
const& subformula)
const;
257 std::shared_ptr<storm::logic::Formula const> createRewardOperatorFormula(boost::optional<std::string>
const& rewardModelName,
259 std::shared_ptr<storm::logic::Formula const>
const& subformula)
const;
261 std::shared_ptr<storm::logic::Formula const>
const& subformula)
const;
263 std::shared_ptr<storm::logic::Formula const>
const& subformula);
264 std::shared_ptr<storm::logic::Formula const> createBinaryBooleanStateFormula(std::shared_ptr<storm::logic::Formula const>
const& leftSubformula,
265 std::shared_ptr<storm::logic::Formula const>
const& rightSubformula,
267 std::shared_ptr<storm::logic::Formula const> createBinaryBooleanPathFormula(std::shared_ptr<storm::logic::Formula const>
const& leftSubformula,
268 std::shared_ptr<storm::logic::Formula const>
const& rightSubformula,
270 std::shared_ptr<storm::logic::Formula const> createBinaryBooleanStateOrPathFormula(std::shared_ptr<storm::logic::Formula const>
const& leftSubformula,
271 std::shared_ptr<storm::logic::Formula const>
const& rightSubformula,
273 std::shared_ptr<storm::logic::Formula const> createUnaryBooleanStateFormula(
274 std::shared_ptr<storm::logic::Formula const>
const& subformula,
275 boost::optional<storm::logic::UnaryBooleanStateFormula::OperatorType>
const& operatorType);
276 std::shared_ptr<storm::logic::Formula const> createUnaryBooleanPathFormula(
277 std::shared_ptr<storm::logic::Formula const>
const& subformula,
278 boost::optional<storm::logic::UnaryBooleanPathFormula::OperatorType>
const& operatorType);
279 std::shared_ptr<storm::logic::Formula const> createUnaryBooleanStateOrPathFormula(
280 std::shared_ptr<storm::logic::Formula const>
const& subformula, boost::optional<storm::logic::UnaryBooleanOperatorType>
const& operatorType);
281 bool isValidMultiBoundedPathFormulaOperand(std::shared_ptr<storm::logic::Formula const>
const& operand);
282 std::shared_ptr<storm::logic::Formula const> createMultiBoundedPathFormula(std::vector<std::shared_ptr<storm::logic::Formula const>>
const& subformulas);
283 std::shared_ptr<storm::logic::Formula const> createMultiOperatorFormula(std::vector<std::shared_ptr<storm::logic::Formula const>>
const& subformulas);
285 std::string
const& variableName);
286 std::shared_ptr<storm::logic::Formula const> createQuantileFormula(std::vector<storm::expressions::Variable>
const& boundVariables,
287 std::shared_ptr<storm::logic::Formula const>
const& subformula);
289 std::set<storm::expressions::Variable> getUndefinedConstants(std::shared_ptr<storm::logic::Formula const>
const& formula)
const;
291 std::shared_ptr<storm::logic::Formula const>
const& formula,
292 std::shared_ptr<storm::logic::Formula const>
const& states);
293 storm::jani::Property createPropertyWithDefaultFilterTypeAndStates(boost::optional<std::string>
const& propertyName,
294 std::shared_ptr<storm::logic::Formula const>
const& formula);
296 bool isBooleanReturnType(std::shared_ptr<storm::logic::Formula const>
const& formula,
bool raiseErrorMessage =
false);
297 bool raiseAmbiguousNonAssociativeOperatorError(std::shared_ptr<storm::logic::Formula const>
const& formula, std::string
const& op);
300 phoenix::function<SpiritErrorHandler> handler;
302 uint64_t propertyCount;
304 std::set<storm::expressions::Variable> undefinedConstants;
305 std::set<storm::expressions::Variable> quantileFormulaVariables;