Storm 1.14.0.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
TraverseFormulaVisitorTest.cpp
Go to the documentation of this file.
1#include "storm-config.h"
2#include "test/storm_gtest.h"
3
4#include <string>
5#include <vector>
6
11
12TEST(TraverseFormulaVisitorTest, VisitsAllSubformulas) {
13 storm::parser::FormulaParser formulaParser;
14 auto const formula = formulaParser.parseSingleFormulaFromString("P=? [\"a\" U (\"b\" & !\"c\")]");
15 std::vector<std::string> visited;
16 storm::logic::TraverseFormulaVisitor const visitor([&visited](storm::logic::Formula const& f) {
17 visited.push_back(f.toString());
18 return true;
19 });
20 visitor.traverse(*formula);
21 // The operator, the until formula, "a", the conjunction, "b", the negation and "c" (in this order).
22 ASSERT_EQ(7ull, visited.size());
23 EXPECT_EQ(formula->toString(), visited.front());
24 EXPECT_EQ("\"c\"", visited.back());
25}
26
27TEST(TraverseFormulaVisitorTest, MultiDimensionalBoundedUntil) {
28 storm::parser::FormulaParser formulaParser;
29 // The two dimensions of this bounded until share their subformulas, so each of them is visited only once.
30 auto const formula = formulaParser.parseSingleFormulaFromString("P=? [F{\"rewA\"}<=3,{\"rewB\"}<=5 \"a\"]");
31 uint64_t visitedLabelFormulas = 0;
32 formula->traverse([&visitedLabelFormulas](storm::logic::Formula const& f) {
33 if (f.isAtomicLabelFormula()) {
34 ++visitedLabelFormulas;
35 }
36 return true;
37 });
38 EXPECT_EQ(1ull, visitedLabelFormulas);
39}
40
41TEST(TraverseFormulaVisitorTest, MaximalPropositionalSubformulas) {
42 storm::parser::FormulaParser formulaParser;
43 auto const formula = formulaParser.parseSingleFormulaFromString("P=? [(\"a\" | !\"b\") U (P>0.5 [F \"c\" & \"d\"] & \"e\")]");
44 auto const propositionalFragment = storm::logic::propositional();
45 std::vector<std::string> propositionalSubformulas;
46 // Formula::traverse creates the visitor for us.
47 formula->traverse([&propositionalFragment, &propositionalSubformulas](storm::logic::Formula const& f) {
48 if (f.isInFragment(propositionalFragment)) {
49 propositionalSubformulas.push_back(f.toString());
50 return false; // Do not visit the subformulas of a propositional formula.
51 }
52 return true;
53 });
54
55 std::vector<std::string> expected;
56 for (std::string const subformula : {"\"a\" | !\"b\"", "\"c\" & \"d\"", "\"e\""}) {
57 expected.push_back(formulaParser.parseSingleFormulaFromString(subformula)->toString());
58 }
59 EXPECT_EQ(expected, propositionalSubformulas);
60}
TEST(TraverseFormulaVisitorTest, VisitsAllSubformulas)
std::string toString() const
Definition Formula.cpp:617
bool isInFragment(FragmentSpecification const &fragment) const
Definition Formula.cpp:218
virtual bool isAtomicLabelFormula() const
Definition Formula.cpp:82
Visits a formula and its subformulas in pre-order, i.e., each formula is visited before its subformul...
void traverse(Formula const &f) const
Visits the given formula and, as far as the callback demands it, its subformulas in pre-order.
std::shared_ptr< storm::logic::Formula const > parseSingleFormulaFromString(std::string const &formulaString) const
Parses the formula given by the provided string.
FragmentSpecification propositional()