113TEST(FormulaParserTest, UntilOperatorTest) {
117 std::string input =
"P<0.9 [\"a\" U \"b\"]";
118 std::shared_ptr<storm::logic::Formula const> formula(
nullptr);
120 auto const &nested1 = formula->asProbabilityOperatorFormula().getSubformula();
121 EXPECT_TRUE(nested1.isUntilFormula());
122 EXPECT_FALSE(nested1.isBoundedUntilFormula());
124 input =
"P<0.9 [\"a\" U<=3 \"b\"]";
126 auto const &nested2 = formula->asProbabilityOperatorFormula().getSubformula();
127 EXPECT_TRUE(nested2.isBoundedUntilFormula());
128 EXPECT_TRUE(nested2.asBoundedUntilFormula().getTimeBoundReference().isTimeBound());
129 EXPECT_EQ(3, nested2.asBoundedUntilFormula().getUpperBound().evaluateAsInt());
131 input =
"P<0.9 [\"a\" U{\"rewardname\"}<=3 \"b\"]";
133 auto const &nested3 = formula->asProbabilityOperatorFormula().getSubformula();
134 EXPECT_TRUE(nested3.isBoundedUntilFormula());
135 EXPECT_TRUE(nested3.asBoundedUntilFormula().getTimeBoundReference().isRewardBound());
136 EXPECT_TRUE(nested3.asBoundedUntilFormula().getTimeBoundReference().hasRewardModelName());
137 EXPECT_EQ(
"rewardname", nested3.asBoundedUntilFormula().getTimeBoundReference().getRewardName());
138 EXPECT_EQ(3, nested3.asBoundedUntilFormula().getUpperBound().evaluateAsInt());
140 input =
"P<0.9 [\"a\" Urew{\"rewardname\"}<=3 \"b\"]";
142 auto const &nested4 = formula->asProbabilityOperatorFormula().getSubformula();
143 EXPECT_TRUE(nested4.isBoundedUntilFormula());
144 EXPECT_TRUE(nested4.asBoundedUntilFormula().getTimeBoundReference().isRewardBound());
145 EXPECT_TRUE(nested4.asBoundedUntilFormula().getTimeBoundReference().hasRewardModelName());
146 EXPECT_EQ(
"rewardname", nested4.asBoundedUntilFormula().getTimeBoundReference().getRewardName());
147 EXPECT_EQ(3, nested4.asBoundedUntilFormula().getUpperBound().evaluateAsInt());
149 input =
"P<0.9 [\"a\" Urew<=3 \"b\"]";
151 auto const &nested5 = formula->asProbabilityOperatorFormula().getSubformula();
152 EXPECT_TRUE(nested5.isBoundedUntilFormula());
153 EXPECT_TRUE(nested5.asBoundedUntilFormula().getTimeBoundReference().isRewardBound());
154 EXPECT_FALSE(nested5.asBoundedUntilFormula().getTimeBoundReference().hasRewardModelName());
155 EXPECT_EQ(3, nested5.asBoundedUntilFormula().getUpperBound().evaluateAsInt());
158TEST(FormulaParserTest, RewardOperatorTest) {
161 std::string input =
"Rmin<0.9 [F \"a\"]";
162 std::shared_ptr<storm::logic::Formula const> formula(
nullptr);
165 EXPECT_TRUE(formula->isRewardOperatorFormula());
166 EXPECT_TRUE(formula->asRewardOperatorFormula().hasBound());
167 EXPECT_TRUE(formula->asRewardOperatorFormula().hasOptimalityType());
169 input =
"R=? [I=10]";
172 EXPECT_TRUE(formula->isRewardOperatorFormula());
173 EXPECT_FALSE(formula->asRewardOperatorFormula().hasBound());
174 EXPECT_FALSE(formula->asRewardOperatorFormula().hasOptimalityType());
175 EXPECT_TRUE(formula->asRewardOperatorFormula().getSubformula().isInstantaneousRewardFormula());
202TEST(FormulaParserTest, DiscountedFormulaTest) {
205 std::string input =
"Rmax=? [Cdiscount=0.9]";
206 std::shared_ptr<storm::logic::Formula const> formula(
nullptr);
210 EXPECT_TRUE(formula->isRewardOperatorFormula());
211 ASSERT_TRUE(formula->asRewardOperatorFormula().getSubformula().isDiscountedTotalRewardFormula());
212 ASSERT_FALSE(formula->asRewardOperatorFormula().getSubformula().isTotalRewardFormula());
213 static const std::string discountFactorString1 =
"9/10";
214 EXPECT_EQ(storm::utility::convertNumber<storm::RationalNumber>(discountFactorString1),
215 formula->asRewardOperatorFormula().getSubformula().asDiscountedTotalRewardFormula().getDiscountFactor<storm::RationalNumber>());
216 EXPECT_FLOAT_EQ(0.9, formula->asRewardOperatorFormula().getSubformula().asDiscountedTotalRewardFormula().getDiscountFactor<
double>());
218 input =
"Rmin=? [C<=5discount=(0.95)]";
222 EXPECT_TRUE(formula->isRewardOperatorFormula());
223 ASSERT_TRUE(formula->asRewardOperatorFormula().getSubformula().isDiscountedCumulativeRewardFormula());
224 static const std::string discountFactorString2 =
"19/20";
225 EXPECT_EQ(storm::utility::convertNumber<storm::RationalNumber>(discountFactorString2),
226 formula->asRewardOperatorFormula().getSubformula().asDiscountedCumulativeRewardFormula().getDiscountFactor().evaluateAsRational());
227 EXPECT_FLOAT_EQ(0.95, formula->asRewardOperatorFormula().getSubformula().asDiscountedCumulativeRewardFormula().getDiscountFactor().evaluateAsDouble());
228 EXPECT_TRUE(formula->asRewardOperatorFormula().getSubformula().asDiscountedCumulativeRewardFormula().getTimeBoundReference().isTimeBound());
229 EXPECT_EQ(5, formula->asRewardOperatorFormula().getSubformula().asDiscountedCumulativeRewardFormula().getBound().evaluateAsInt());
231 input =
"Rmax=? [Crew<8discount=(0.5)]";
235 EXPECT_TRUE(formula->isRewardOperatorFormula());
236 ASSERT_TRUE(formula->asRewardOperatorFormula().getSubformula().isDiscountedCumulativeRewardFormula());
237 static const std::string discountFactorString3 =
"1/2";
238 EXPECT_EQ(storm::utility::convertNumber<storm::RationalNumber>(discountFactorString3),
239 formula->asRewardOperatorFormula().getSubformula().asDiscountedCumulativeRewardFormula().getDiscountFactor().evaluateAsRational());
240 EXPECT_FLOAT_EQ(0.5, formula->asRewardOperatorFormula().getSubformula().asDiscountedCumulativeRewardFormula().getDiscountFactor().evaluateAsDouble());
241 EXPECT_FALSE(formula->asRewardOperatorFormula().getSubformula().asDiscountedCumulativeRewardFormula().getTimeBoundReference().isTimeBound());
242 EXPECT_TRUE(formula->asRewardOperatorFormula().getSubformula().asDiscountedCumulativeRewardFormula().getTimeBoundReference().isRewardBound());
243 EXPECT_EQ(8, formula->asRewardOperatorFormula().getSubformula().asDiscountedCumulativeRewardFormula().getBound().evaluateAsInt());
259TEST(FormulaParserTest, WrongFormatTest) {
261 manager->declareBooleanVariable(
"x");
262 manager->declareIntegerVariable(
"y");
265 std::string input =
"P>0.5 [ a ]";
266 std::shared_ptr<storm::logic::Formula const> formula(
nullptr);
269 input =
"P=0.5 [F \"a\"]";
272 input =
"P>0.5 [F !(x = 0)]";
275 input =
"P>0.5 [F !y]";
278 input =
"P>0.5 [F y!=0)]";
281 input =
"P<0.9 [G F]";
284 input =
"P<0.9 [\"a\" U \"b\" U \"c\"]";
287 input =
"P<0.9 [X \"a\" U G \"b\" U X \"c\"]";
318TEST(FormulaParserTest, LogicalPrecedenceTest) {
321 std::shared_ptr<storm::logic::Formula const> formula(
nullptr);
323 std::string input =
"P=? [ !\"a\" & \"b\" U ! \"c\" | \"b\" ]";
325 EXPECT_TRUE(formula->isProbabilityOperatorFormula());
327 auto const &nested1 = formula->asProbabilityOperatorFormula().getSubformula();
328 EXPECT_TRUE(nested1.isUntilFormula());
329 ASSERT_TRUE(nested1.asUntilFormula().getLeftSubformula().isBinaryBooleanStateFormula());
330 ASSERT_TRUE(nested1.asUntilFormula().getLeftSubformula().asBinaryBooleanStateFormula().getLeftSubformula().isUnaryBooleanStateFormula());
331 ASSERT_TRUE(nested1.asUntilFormula().getRightSubformula().isBinaryBooleanStateFormula());
332 ASSERT_TRUE(nested1.asUntilFormula().getRightSubformula().asBinaryBooleanStateFormula().getLeftSubformula().isUnaryBooleanStateFormula());
334 input =
"P<0.9 [ F G !\"a\" | \"b\" ] ";
336 auto const &nested2 = formula->asProbabilityOperatorFormula().getSubformula();
337 EXPECT_TRUE(nested2.asEventuallyFormula().getSubformula().isGloballyFormula());
338 auto const &nested2Subformula = nested2.asEventuallyFormula().getSubformula().asGloballyFormula();
339 EXPECT_TRUE(nested2Subformula.getSubformula().isBinaryBooleanStateFormula());
340 ASSERT_TRUE(nested2Subformula.getSubformula().asBinaryBooleanStateFormula().getLeftSubformula().isUnaryBooleanStateFormula());
342 input =
"P<0.9 [ X G \"a\" | !\"b\" | \"c\"] ";
344 auto const &nested3 = formula->asProbabilityOperatorFormula().getSubformula();
345 EXPECT_TRUE(nested3.asNextFormula().getSubformula().isGloballyFormula());
346 EXPECT_TRUE(nested3.asNextFormula().getSubformula().asGloballyFormula().getSubformula().isBinaryBooleanStateFormula());
347 auto const &nested3Subformula = nested3.asNextFormula().getSubformula().asGloballyFormula().getSubformula().asBinaryBooleanStateFormula();
348 ASSERT_TRUE(nested3Subformula.getLeftSubformula().isBinaryBooleanStateFormula());
349 ASSERT_TRUE(nested3Subformula.asBinaryBooleanStateFormula().getRightSubformula().isAtomicLabelFormula());
351 input =
"P<0.9 [ X F \"a\" | ! \"b\" & \"c\"] ";
353 auto const &nested4 = formula->asProbabilityOperatorFormula().getSubformula();
354 EXPECT_TRUE(nested4.asNextFormula().getSubformula().isEventuallyFormula());
355 EXPECT_TRUE(nested4.asNextFormula().getSubformula().asEventuallyFormula().getSubformula().isBinaryBooleanStateFormula());
356 auto const &nested4Subformula = nested4.asNextFormula().getSubformula().asEventuallyFormula().getSubformula().asBinaryBooleanStateFormula();
357 ASSERT_TRUE(nested4Subformula.getLeftSubformula().isAtomicLabelFormula());
358 ASSERT_TRUE(nested4Subformula.getRightSubformula().isBinaryBooleanStateFormula());
360 input =
"P<0.9 [X \"a\" | F \"b\"]";
362 auto const &nested5 = formula->asProbabilityOperatorFormula().getSubformula();
363 EXPECT_TRUE(nested5.isNextFormula());
364 EXPECT_TRUE(nested5.asNextFormula().getSubformula().isBinaryBooleanPathFormula());
365 EXPECT_TRUE(nested5.asNextFormula().getSubformula().asBinaryPathFormula().getLeftSubformula().isAtomicLabelFormula());
366 EXPECT_TRUE(nested5.asNextFormula().getSubformula().asBinaryPathFormula().getRightSubformula().isEventuallyFormula());
368 input =
"P<0.9 [F \"a\" | G \"b\" | X \"c\" ]";
370 auto const &nested6 = formula->asProbabilityOperatorFormula().getSubformula();
371 EXPECT_TRUE(nested6.isEventuallyFormula());
372 EXPECT_TRUE(nested6.asEventuallyFormula().getSubformula().isBinaryBooleanPathFormula());
373 EXPECT_TRUE(nested6.asEventuallyFormula().getSubformula().asBinaryPathFormula().getLeftSubformula().isAtomicLabelFormula());
374 EXPECT_TRUE(nested6.asEventuallyFormula().getSubformula().asBinaryPathFormula().getRightSubformula().isGloballyFormula());
375 auto const &nested6Subformula = nested6.asEventuallyFormula().getSubformula().asBinaryPathFormula().getRightSubformula().asGloballyFormula();
376 EXPECT_TRUE(nested6Subformula.getSubformula().isBinaryBooleanPathFormula());
377 EXPECT_TRUE(nested6Subformula.getSubformula().asBinaryPathFormula().getLeftSubformula().isAtomicLabelFormula());
378 EXPECT_TRUE(nested6Subformula.getSubformula().asBinaryPathFormula().getRightSubformula().isNextFormula());
379 EXPECT_TRUE(nested6Subformula.getSubformula().asBinaryPathFormula().getRightSubformula().asNextFormula().getSubformula().isAtomicLabelFormula());
382TEST(FormulaParserTest, TemporalPrecedenceTest) {
385 std::shared_ptr<storm::logic::Formula const> formula(
nullptr);
387 std::string input =
"P=? [ F \"a\" U G \"b\" ]";
389 auto const &nested1 = formula->asProbabilityOperatorFormula().getSubformula();
390 EXPECT_TRUE(nested1.isUntilFormula());
391 ASSERT_TRUE(nested1.asUntilFormula().getLeftSubformula().isEventuallyFormula());
392 ASSERT_TRUE(nested1.asUntilFormula().getRightSubformula().isGloballyFormula());
394 input =
"P=? [ X ( F \"a\" U G \"b\") U G \"c\"]";
396 auto const &nested2 = formula->asProbabilityOperatorFormula().getSubformula();
397 EXPECT_TRUE(nested2.isUntilFormula());
398 EXPECT_TRUE(nested2.asUntilFormula().getLeftSubformula().isNextFormula());
399 EXPECT_TRUE(nested2.asUntilFormula().getLeftSubformula().asNextFormula().getSubformula().isUntilFormula());
400 EXPECT_TRUE(nested2.asUntilFormula().getRightSubformula().isGloballyFormula());
402 input =
"P=? [ X F \"a\" U (G \"b\" U G \"c\")]";
404 auto const &nested3 = formula->asProbabilityOperatorFormula().getSubformula();
405 EXPECT_TRUE(nested3.isUntilFormula());
406 EXPECT_TRUE(nested3.asUntilFormula().getLeftSubformula().isNextFormula());
407 EXPECT_TRUE(nested3.asUntilFormula().getLeftSubformula().asNextFormula().getSubformula().isEventuallyFormula());
408 EXPECT_TRUE(nested3.asUntilFormula().getRightSubformula().isUntilFormula());
409 EXPECT_TRUE(nested3.asUntilFormula().getRightSubformula().asUntilFormula().getLeftSubformula().isGloballyFormula());
410 EXPECT_TRUE(nested3.asUntilFormula().getRightSubformula().asUntilFormula().getRightSubformula().isGloballyFormula());
413TEST(FormulaParserTest, TemporalNegationTest) {
415 std::shared_ptr<storm::logic::Formula const> formula(
nullptr);
417 std::string input =
"P<0.9 [ ! X \"a\" | \"b\"]";
419 auto const &nested1 = formula->asProbabilityOperatorFormula().getSubformula();
420 EXPECT_TRUE(nested1.isUnaryBooleanPathFormula());
421 EXPECT_TRUE(nested1.asUnaryPathFormula().getSubformula().isNextFormula());
422 EXPECT_TRUE(nested1.asUnaryPathFormula().getSubformula().asNextFormula().getSubformula().isBinaryBooleanStateFormula());
424 input =
"P<0.9 [! F ! G \"b\"]";
426 auto const &nested2 = formula->asProbabilityOperatorFormula().getSubformula();
427 EXPECT_TRUE(nested2.isUnaryBooleanPathFormula());
428 EXPECT_TRUE(nested2.asUnaryPathFormula().getSubformula().isEventuallyFormula());
429 EXPECT_TRUE(nested2.asUnaryPathFormula().getSubformula().asEventuallyFormula().getSubformula().isUnaryBooleanPathFormula());
430 EXPECT_TRUE(nested2.asUnaryPathFormula().getSubformula().asEventuallyFormula().getSubformula().asUnaryPathFormula().getSubformula().isGloballyFormula());
432 input =
"P<0.9 [! (\"a\" U \"b\")]";
434 auto const &nested3 = formula->asProbabilityOperatorFormula().getSubformula();
435 EXPECT_TRUE(nested3.isUnaryBooleanPathFormula());
436 EXPECT_TRUE(nested3.asUnaryPathFormula().getSubformula().isUntilFormula());
439TEST(FormulaParserTest, ComplexPathFormulaTest) {
441 std::shared_ptr<storm::logic::Formula const> formula(
nullptr);
443 std::string input =
"P<0.9 [(X !\"a\") & (F ( X \"b\" U G \"c\" & \"d\"))]";
445 auto const &nested1 = formula->asProbabilityOperatorFormula().getSubformula();
446 EXPECT_TRUE(nested1.asBinaryPathFormula().getRightSubformula().asEventuallyFormula().getSubformula().isUntilFormula());
447 auto const nested1Subformula = nested1.asBinaryPathFormula().getRightSubformula().asEventuallyFormula().getSubformula().asUntilFormula();
448 EXPECT_TRUE(nested1Subformula.getLeftSubformula().isNextFormula());
449 EXPECT_TRUE(nested1Subformula.getRightSubformula().asGloballyFormula().getSubformula().isBinaryBooleanStateFormula());
451 input =
"P<0.9 [(F \"a\") & (G \"b\") | (! \"a\" U (F X ! \"b\"))]";
453 auto const &nested2 = formula->asProbabilityOperatorFormula().getSubformula();
454 ASSERT_TRUE(nested2.asBinaryPathFormula().getLeftSubformula().isBinaryPathFormula());
455 ASSERT_TRUE(nested2.asBinaryPathFormula().getRightSubformula().isUntilFormula());
457 input =
"P=? [(X \"a\") U ( \"b\"& \"c\")]";
460 auto const &nested3 = formula->asProbabilityOperatorFormula().getSubformula();
461 EXPECT_TRUE(nested3.asBinaryPathFormula().isUntilFormula());
462 EXPECT_TRUE(nested3.asBinaryPathFormula().getLeftSubformula().isNextFormula());
465TEST(FormulaParserTest, HOAPathFormulaTest) {
467 manager->declareIntegerVariable(
"x");
468 manager->declareIntegerVariable(
"y");
470 std::shared_ptr<storm::logic::Formula const> formula(
nullptr);
472 std::string input =
"P=?[HOA: {\"" STORM_TEST_RESOURCES_DIR
"/hoa/automaton_Fandp0Xp1.hoa\", \"p0\" -> !\"a\", \"p1\" -> \"b\" | \"c\" }]";
474 auto const &nested1 = formula->asProbabilityOperatorFormula().getSubformula();
475 EXPECT_TRUE(nested1.isHOAPathFormula());
476 EXPECT_TRUE(nested1.isPathFormula());
478 ASSERT_NO_THROW(std::string af = nested1.asHOAPathFormula().getAutomatonFile());
480 ASSERT_NO_THROW(da1 = nested1.asHOAPathFormula().readAutomaton());
481 EXPECT_EQ(3ul, da1->getNumberOfStates());
482 EXPECT_EQ(4ul, da1->getNumberOfEdgesPerState());
484 std::map<std::string, std::shared_ptr<storm::logic::Formula const>> apFormulaMap1 = nested1.asHOAPathFormula().getAPMapping();
485 EXPECT_TRUE(apFormulaMap1[
"p0"]->isUnaryBooleanStateFormula());
486 EXPECT_TRUE(apFormulaMap1[
"p1"]->isBinaryBooleanStateFormula());
488 input =
"P=?[HOA: {\"" STORM_TEST_RESOURCES_DIR
"/hoa/automaton_UXp0p1.hoa\", \"p0\" -> (x < 7) & !(y = 2), \"p1\" -> (x > 0) }]";
490 auto const &nested2 = formula->asProbabilityOperatorFormula().getSubformula();
491 EXPECT_TRUE(nested2.isHOAPathFormula());
492 EXPECT_TRUE(nested2.isPathFormula());
494 ASSERT_NO_THROW(std::string af = nested2.asHOAPathFormula().getAutomatonFile());
496 ASSERT_NO_THROW(da2 = nested2.asHOAPathFormula().readAutomaton());
497 EXPECT_EQ(4ul, da2->getNumberOfStates());
498 EXPECT_EQ(4ul, da2->getNumberOfEdgesPerState());
500 std::map<std::string, std::shared_ptr<storm::logic::Formula const>> apFormulaMap2 = nested2.asHOAPathFormula().getAPMapping();
501 EXPECT_TRUE(apFormulaMap2[
"p0"]->isAtomicExpressionFormula());
502 EXPECT_TRUE(apFormulaMap2[
"p1"]->isAtomicExpressionFormula());
505 input =
"P=?[HOA: {\"" STORM_TEST_RESOURCES_DIR
"/hoa/automaton_UXp0p1.hoa\", \"p0\" -> (x > 0), \"p1\" -> (x < 7) & (X y = 2) }]";
509 input =
"P=?[HOA: {\"" STORM_TEST_RESOURCES_DIR
"/hoa/automaton_UXp0p1.hoa\", \"p0\" -> (x > 0)}]";
511 auto const &nested3 = formula->asProbabilityOperatorFormula().getSubformula();
513 STORM_SILENT_EXPECT_THROW(da3 = nested3.asHOAPathFormula().readAutomaton(), storm::exceptions::ExpressionEvaluationException);