111TEST(FormulaParserTest, UntilOperatorTest) {
115 std::string input =
"P<0.9 [\"a\" U \"b\"]";
116 std::shared_ptr<storm::logic::Formula const> formula(
nullptr);
118 auto const &nested1 = formula->asProbabilityOperatorFormula().getSubformula();
119 EXPECT_TRUE(nested1.isUntilFormula());
120 EXPECT_FALSE(nested1.isBoundedUntilFormula());
122 input =
"P<0.9 [\"a\" U<=3 \"b\"]";
124 auto const &nested2 = formula->asProbabilityOperatorFormula().getSubformula();
125 EXPECT_TRUE(nested2.isBoundedUntilFormula());
126 EXPECT_TRUE(nested2.asBoundedUntilFormula().getTimeBoundReference().isTimeBound());
127 EXPECT_EQ(3, nested2.asBoundedUntilFormula().getUpperBound().evaluateAsInt());
129 input =
"P<0.9 [\"a\" U{\"rewardname\"}<=3 \"b\"]";
131 auto const &nested3 = formula->asProbabilityOperatorFormula().getSubformula();
132 EXPECT_TRUE(nested3.isBoundedUntilFormula());
133 EXPECT_TRUE(nested3.asBoundedUntilFormula().getTimeBoundReference().isRewardBound());
134 EXPECT_TRUE(nested3.asBoundedUntilFormula().getTimeBoundReference().hasRewardModelName());
135 EXPECT_EQ(
"rewardname", nested3.asBoundedUntilFormula().getTimeBoundReference().getRewardName());
136 EXPECT_EQ(3, nested3.asBoundedUntilFormula().getUpperBound().evaluateAsInt());
138 input =
"P<0.9 [\"a\" Urew{\"rewardname\"}<=3 \"b\"]";
140 auto const &nested4 = formula->asProbabilityOperatorFormula().getSubformula();
141 EXPECT_TRUE(nested4.isBoundedUntilFormula());
142 EXPECT_TRUE(nested4.asBoundedUntilFormula().getTimeBoundReference().isRewardBound());
143 EXPECT_TRUE(nested4.asBoundedUntilFormula().getTimeBoundReference().hasRewardModelName());
144 EXPECT_EQ(
"rewardname", nested4.asBoundedUntilFormula().getTimeBoundReference().getRewardName());
145 EXPECT_EQ(3, nested4.asBoundedUntilFormula().getUpperBound().evaluateAsInt());
147 input =
"P<0.9 [\"a\" Urew<=3 \"b\"]";
149 auto const &nested5 = formula->asProbabilityOperatorFormula().getSubformula();
150 EXPECT_TRUE(nested5.isBoundedUntilFormula());
151 EXPECT_TRUE(nested5.asBoundedUntilFormula().getTimeBoundReference().isRewardBound());
152 EXPECT_FALSE(nested5.asBoundedUntilFormula().getTimeBoundReference().hasRewardModelName());
153 EXPECT_EQ(3, nested5.asBoundedUntilFormula().getUpperBound().evaluateAsInt());
156TEST(FormulaParserTest, RewardOperatorTest) {
159 std::string input =
"Rmin<0.9 [F \"a\"]";
160 std::shared_ptr<storm::logic::Formula const> formula(
nullptr);
163 EXPECT_TRUE(formula->isRewardOperatorFormula());
164 EXPECT_TRUE(formula->asRewardOperatorFormula().hasBound());
165 EXPECT_TRUE(formula->asRewardOperatorFormula().hasOptimalityType());
167 input =
"R=? [I=10]";
170 EXPECT_TRUE(formula->isRewardOperatorFormula());
171 EXPECT_FALSE(formula->asRewardOperatorFormula().hasBound());
172 EXPECT_FALSE(formula->asRewardOperatorFormula().hasOptimalityType());
173 EXPECT_TRUE(formula->asRewardOperatorFormula().getSubformula().isInstantaneousRewardFormula());
213TEST(FormulaParserTest, WrongFormatTest) {
215 manager->declareBooleanVariable(
"x");
216 manager->declareIntegerVariable(
"y");
219 std::string input =
"P>0.5 [ a ]";
220 std::shared_ptr<storm::logic::Formula const> formula(
nullptr);
223 input =
"P=0.5 [F \"a\"]";
226 input =
"P>0.5 [F !(x = 0)]";
229 input =
"P>0.5 [F !y]";
232 input =
"P>0.5 [F y!=0)]";
235 input =
"P<0.9 [G F]";
238 input =
"P<0.9 [\"a\" U \"b\" U \"c\"]";
241 input =
"P<0.9 [X \"a\" U G \"b\" U X \"c\"]";
272TEST(FormulaParserTest, LogicalPrecedenceTest) {
275 std::shared_ptr<storm::logic::Formula const> formula(
nullptr);
277 std::string input =
"P=? [ !\"a\" & \"b\" U ! \"c\" | \"b\" ]";
279 EXPECT_TRUE(formula->isProbabilityOperatorFormula());
281 auto const &nested1 = formula->asProbabilityOperatorFormula().getSubformula();
282 EXPECT_TRUE(nested1.isUntilFormula());
283 ASSERT_TRUE(nested1.asUntilFormula().getLeftSubformula().isBinaryBooleanStateFormula());
284 ASSERT_TRUE(nested1.asUntilFormula().getLeftSubformula().asBinaryBooleanStateFormula().getLeftSubformula().isUnaryBooleanStateFormula());
285 ASSERT_TRUE(nested1.asUntilFormula().getRightSubformula().isBinaryBooleanStateFormula());
286 ASSERT_TRUE(nested1.asUntilFormula().getRightSubformula().asBinaryBooleanStateFormula().getLeftSubformula().isUnaryBooleanStateFormula());
288 input =
"P<0.9 [ F G !\"a\" | \"b\" ] ";
290 auto const &nested2 = formula->asProbabilityOperatorFormula().getSubformula();
291 EXPECT_TRUE(nested2.asEventuallyFormula().getSubformula().isGloballyFormula());
292 auto const &nested2Subformula = nested2.asEventuallyFormula().getSubformula().asGloballyFormula();
293 EXPECT_TRUE(nested2Subformula.getSubformula().isBinaryBooleanStateFormula());
294 ASSERT_TRUE(nested2Subformula.getSubformula().asBinaryBooleanStateFormula().getLeftSubformula().isUnaryBooleanStateFormula());
296 input =
"P<0.9 [ X G \"a\" | !\"b\" | \"c\"] ";
298 auto const &nested3 = formula->asProbabilityOperatorFormula().getSubformula();
299 EXPECT_TRUE(nested3.asNextFormula().getSubformula().isGloballyFormula());
300 EXPECT_TRUE(nested3.asNextFormula().getSubformula().asGloballyFormula().getSubformula().isBinaryBooleanStateFormula());
301 auto const &nested3Subformula = nested3.asNextFormula().getSubformula().asGloballyFormula().getSubformula().asBinaryBooleanStateFormula();
302 ASSERT_TRUE(nested3Subformula.getLeftSubformula().isBinaryBooleanStateFormula());
303 ASSERT_TRUE(nested3Subformula.asBinaryBooleanStateFormula().getRightSubformula().isAtomicLabelFormula());
305 input =
"P<0.9 [ X F \"a\" | ! \"b\" & \"c\"] ";
307 auto const &nested4 = formula->asProbabilityOperatorFormula().getSubformula();
308 EXPECT_TRUE(nested4.asNextFormula().getSubformula().isEventuallyFormula());
309 EXPECT_TRUE(nested4.asNextFormula().getSubformula().asEventuallyFormula().getSubformula().isBinaryBooleanStateFormula());
310 auto const &nested4Subformula = nested4.asNextFormula().getSubformula().asEventuallyFormula().getSubformula().asBinaryBooleanStateFormula();
311 ASSERT_TRUE(nested4Subformula.getLeftSubformula().isAtomicLabelFormula());
312 ASSERT_TRUE(nested4Subformula.getRightSubformula().isBinaryBooleanStateFormula());
314 input =
"P<0.9 [X \"a\" | F \"b\"]";
316 auto const &nested5 = formula->asProbabilityOperatorFormula().getSubformula();
317 EXPECT_TRUE(nested5.isNextFormula());
318 EXPECT_TRUE(nested5.asNextFormula().getSubformula().isBinaryBooleanPathFormula());
319 EXPECT_TRUE(nested5.asNextFormula().getSubformula().asBinaryPathFormula().getLeftSubformula().isAtomicLabelFormula());
320 EXPECT_TRUE(nested5.asNextFormula().getSubformula().asBinaryPathFormula().getRightSubformula().isEventuallyFormula());
322 input =
"P<0.9 [F \"a\" | G \"b\" | X \"c\" ]";
324 auto const &nested6 = formula->asProbabilityOperatorFormula().getSubformula();
325 EXPECT_TRUE(nested6.isEventuallyFormula());
326 EXPECT_TRUE(nested6.asEventuallyFormula().getSubformula().isBinaryBooleanPathFormula());
327 EXPECT_TRUE(nested6.asEventuallyFormula().getSubformula().asBinaryPathFormula().getLeftSubformula().isAtomicLabelFormula());
328 EXPECT_TRUE(nested6.asEventuallyFormula().getSubformula().asBinaryPathFormula().getRightSubformula().isGloballyFormula());
329 auto const &nested6Subformula = nested6.asEventuallyFormula().getSubformula().asBinaryPathFormula().getRightSubformula().asGloballyFormula();
330 EXPECT_TRUE(nested6Subformula.getSubformula().isBinaryBooleanPathFormula());
331 EXPECT_TRUE(nested6Subformula.getSubformula().asBinaryPathFormula().getLeftSubformula().isAtomicLabelFormula());
332 EXPECT_TRUE(nested6Subformula.getSubformula().asBinaryPathFormula().getRightSubformula().isNextFormula());
333 EXPECT_TRUE(nested6Subformula.getSubformula().asBinaryPathFormula().getRightSubformula().asNextFormula().getSubformula().isAtomicLabelFormula());
336TEST(FormulaParserTest, TemporalPrecedenceTest) {
339 std::shared_ptr<storm::logic::Formula const> formula(
nullptr);
341 std::string input =
"P=? [ F \"a\" U G \"b\" ]";
343 auto const &nested1 = formula->asProbabilityOperatorFormula().getSubformula();
344 EXPECT_TRUE(nested1.isUntilFormula());
345 ASSERT_TRUE(nested1.asUntilFormula().getLeftSubformula().isEventuallyFormula());
346 ASSERT_TRUE(nested1.asUntilFormula().getRightSubformula().isGloballyFormula());
348 input =
"P=? [ X ( F \"a\" U G \"b\") U G \"c\"]";
350 auto const &nested2 = formula->asProbabilityOperatorFormula().getSubformula();
351 EXPECT_TRUE(nested2.isUntilFormula());
352 EXPECT_TRUE(nested2.asUntilFormula().getLeftSubformula().isNextFormula());
353 EXPECT_TRUE(nested2.asUntilFormula().getLeftSubformula().asNextFormula().getSubformula().isUntilFormula());
354 EXPECT_TRUE(nested2.asUntilFormula().getRightSubformula().isGloballyFormula());
356 input =
"P=? [ X F \"a\" U (G \"b\" U G \"c\")]";
358 auto const &nested3 = formula->asProbabilityOperatorFormula().getSubformula();
359 EXPECT_TRUE(nested3.isUntilFormula());
360 EXPECT_TRUE(nested3.asUntilFormula().getLeftSubformula().isNextFormula());
361 EXPECT_TRUE(nested3.asUntilFormula().getLeftSubformula().asNextFormula().getSubformula().isEventuallyFormula());
362 EXPECT_TRUE(nested3.asUntilFormula().getRightSubformula().isUntilFormula());
363 EXPECT_TRUE(nested3.asUntilFormula().getRightSubformula().asUntilFormula().getLeftSubformula().isGloballyFormula());
364 EXPECT_TRUE(nested3.asUntilFormula().getRightSubformula().asUntilFormula().getRightSubformula().isGloballyFormula());
367TEST(FormulaParserTest, TemporalNegationTest) {
369 std::shared_ptr<storm::logic::Formula const> formula(
nullptr);
371 std::string input =
"P<0.9 [ ! X \"a\" | \"b\"]";
373 auto const &nested1 = formula->asProbabilityOperatorFormula().getSubformula();
374 EXPECT_TRUE(nested1.isUnaryBooleanPathFormula());
375 EXPECT_TRUE(nested1.asUnaryPathFormula().getSubformula().isNextFormula());
376 EXPECT_TRUE(nested1.asUnaryPathFormula().getSubformula().asNextFormula().getSubformula().isBinaryBooleanStateFormula());
378 input =
"P<0.9 [! F ! G \"b\"]";
380 auto const &nested2 = formula->asProbabilityOperatorFormula().getSubformula();
381 EXPECT_TRUE(nested2.isUnaryBooleanPathFormula());
382 EXPECT_TRUE(nested2.asUnaryPathFormula().getSubformula().isEventuallyFormula());
383 EXPECT_TRUE(nested2.asUnaryPathFormula().getSubformula().asEventuallyFormula().getSubformula().isUnaryBooleanPathFormula());
384 EXPECT_TRUE(nested2.asUnaryPathFormula().getSubformula().asEventuallyFormula().getSubformula().asUnaryPathFormula().getSubformula().isGloballyFormula());
386 input =
"P<0.9 [! (\"a\" U \"b\")]";
388 auto const &nested3 = formula->asProbabilityOperatorFormula().getSubformula();
389 EXPECT_TRUE(nested3.isUnaryBooleanPathFormula());
390 EXPECT_TRUE(nested3.asUnaryPathFormula().getSubformula().isUntilFormula());
393TEST(FormulaParserTest, ComplexPathFormulaTest) {
395 std::shared_ptr<storm::logic::Formula const> formula(
nullptr);
397 std::string input =
"P<0.9 [(X !\"a\") & (F ( X \"b\" U G \"c\" & \"d\"))]";
399 auto const &nested1 = formula->asProbabilityOperatorFormula().getSubformula();
400 EXPECT_TRUE(nested1.asBinaryPathFormula().getRightSubformula().asEventuallyFormula().getSubformula().isUntilFormula());
401 auto const nested1Subformula = nested1.asBinaryPathFormula().getRightSubformula().asEventuallyFormula().getSubformula().asUntilFormula();
402 EXPECT_TRUE(nested1Subformula.getLeftSubformula().isNextFormula());
403 EXPECT_TRUE(nested1Subformula.getRightSubformula().asGloballyFormula().getSubformula().isBinaryBooleanStateFormula());
405 input =
"P<0.9 [(F \"a\") & (G \"b\") | (! \"a\" U (F X ! \"b\"))]";
407 auto const &nested2 = formula->asProbabilityOperatorFormula().getSubformula();
408 ASSERT_TRUE(nested2.asBinaryPathFormula().getLeftSubformula().isBinaryPathFormula());
409 ASSERT_TRUE(nested2.asBinaryPathFormula().getRightSubformula().isUntilFormula());
411 input =
"P=? [(X \"a\") U ( \"b\"& \"c\")]";
414 auto const &nested3 = formula->asProbabilityOperatorFormula().getSubformula();
415 EXPECT_TRUE(nested3.asBinaryPathFormula().isUntilFormula());
416 EXPECT_TRUE(nested3.asBinaryPathFormula().getLeftSubformula().isNextFormula());
419TEST(FormulaParserTest, HOAPathFormulaTest) {
421 manager->declareIntegerVariable(
"x");
422 manager->declareIntegerVariable(
"y");
424 std::shared_ptr<storm::logic::Formula const> formula(
nullptr);
426 std::string input =
"P=?[HOA: {\"" STORM_TEST_RESOURCES_DIR
"/hoa/automaton_Fandp0Xp1.hoa\", \"p0\" -> !\"a\", \"p1\" -> \"b\" | \"c\" }]";
428 auto const &nested1 = formula->asProbabilityOperatorFormula().getSubformula();
429 EXPECT_TRUE(nested1.isHOAPathFormula());
430 EXPECT_TRUE(nested1.isPathFormula());
432 ASSERT_NO_THROW(std::string af = nested1.asHOAPathFormula().getAutomatonFile());
434 ASSERT_NO_THROW(da1 = nested1.asHOAPathFormula().readAutomaton());
435 EXPECT_EQ(3ul, da1->getNumberOfStates());
436 EXPECT_EQ(4ul, da1->getNumberOfEdgesPerState());
438 std::map<std::string, std::shared_ptr<storm::logic::Formula const>> apFormulaMap1 = nested1.asHOAPathFormula().getAPMapping();
439 EXPECT_TRUE(apFormulaMap1[
"p0"]->isUnaryBooleanStateFormula());
440 EXPECT_TRUE(apFormulaMap1[
"p1"]->isBinaryBooleanStateFormula());
442 input =
"P=?[HOA: {\"" STORM_TEST_RESOURCES_DIR
"/hoa/automaton_UXp0p1.hoa\", \"p0\" -> (x < 7) & !(y = 2), \"p1\" -> (x > 0) }]";
444 auto const &nested2 = formula->asProbabilityOperatorFormula().getSubformula();
445 EXPECT_TRUE(nested2.isHOAPathFormula());
446 EXPECT_TRUE(nested2.isPathFormula());
448 ASSERT_NO_THROW(std::string af = nested2.asHOAPathFormula().getAutomatonFile());
450 ASSERT_NO_THROW(da2 = nested2.asHOAPathFormula().readAutomaton());
451 EXPECT_EQ(4ul, da2->getNumberOfStates());
452 EXPECT_EQ(4ul, da2->getNumberOfEdgesPerState());
454 std::map<std::string, std::shared_ptr<storm::logic::Formula const>> apFormulaMap2 = nested2.asHOAPathFormula().getAPMapping();
455 EXPECT_TRUE(apFormulaMap2[
"p0"]->isAtomicExpressionFormula());
456 EXPECT_TRUE(apFormulaMap2[
"p1"]->isAtomicExpressionFormula());
459 input =
"P=?[HOA: {\"" STORM_TEST_RESOURCES_DIR
"/hoa/automaton_UXp0p1.hoa\", \"p0\" -> (x > 0), \"p1\" -> (x < 7) & (X y = 2) }]";
463 input =
"P=?[HOA: {\"" STORM_TEST_RESOURCES_DIR
"/hoa/automaton_UXp0p1.hoa\", \"p0\" -> (x > 0)}]";
465 auto const &nested3 = formula->asProbabilityOperatorFormula().getSubformula();
467 STORM_SILENT_EXPECT_THROW(da3 = nested3.asHOAPathFormula().readAutomaton(), storm::exceptions::ExpressionEvaluationException);