dReal4
symbolic_formula_visitor.h
1 #pragma once
2 
3 #include <utility>
4 
5 #include "dreal/symbolic/symbolic_formula.h"
6 
7 namespace dreal {
8 namespace drake {
9 namespace symbolic {
10 
11 /// Calls visitor object @p v with a symbolic formula @p f, and arguments @p
12 /// args. Visitor object is expected to implement the following methods which
13 /// take @p f and @p args: `VisitFalse`, `VisitTrue`, `VisitVariable`,
14 /// `VisitEqualTo`, VisitNotEqualTo, VisitGreaterThan,
15 /// `VisitGreaterThanOrEqualTo`, `VisitLessThan`, `VisitLessThanOrEqualTo`,
16 /// `VisitConjunction`, `VisitDisjunction`, `VisitNegation`, `VisitForall`.
17 ///
18 /// Check the implementation of @c NegationNormalFormConverter class in
19 /// symbolic/test/symbolic_formula_visitor_test.cc file to find an example.
20 template <typename Result, typename Visitor, typename... Args>
21 Result VisitFormula(Visitor* v, const Formula& f, Args&&... args) {
22  switch (f.get_kind()) {
23  case FormulaKind::False:
24  return v->VisitFalse(f, std::forward<Args>(args)...);
25  case FormulaKind::True:
26  return v->VisitTrue(f, std::forward<Args>(args)...);
27  case FormulaKind::Var:
28  return v->VisitVariable(f, std::forward<Args>(args)...);
29  case FormulaKind::Eq:
30  return v->VisitEqualTo(f, std::forward<Args>(args)...);
31  case FormulaKind::Neq:
32  return v->VisitNotEqualTo(f, std::forward<Args>(args)...);
33  case FormulaKind::Gt:
34  return v->VisitGreaterThan(f, std::forward<Args>(args)...);
35  case FormulaKind::Geq:
36  return v->VisitGreaterThanOrEqualTo(f, std::forward<Args>(args)...);
37  case FormulaKind::Lt:
38  return v->VisitLessThan(f, std::forward<Args>(args)...);
39  case FormulaKind::Leq:
40  return v->VisitLessThanOrEqualTo(f, std::forward<Args>(args)...);
41  case FormulaKind::And:
42  return v->VisitConjunction(f, std::forward<Args>(args)...);
43  case FormulaKind::Or:
44  return v->VisitDisjunction(f, std::forward<Args>(args)...);
45  case FormulaKind::Not:
46  return v->VisitNegation(f, std::forward<Args>(args)...);
47  case FormulaKind::Forall:
48  return v->VisitForall(f, std::forward<Args>(args)...);
49  }
50  // Should not be reachable. But we need the following to avoid "control
51  // reaches end of non-void function" gcc-warning.
52  throw std::runtime_error("Should not be reachable.");
53 }
54 
55 } // namespace symbolic
56 } // namespace drake
57 } // namespace dreal
Sum type of symbolic::Expression and symbolic::Formula.
Definition: api.cc:9