dReal4
predicate_abstractor.h
1 #pragma once
2 
3 #include <memory>
4 #include <unordered_map>
5 #include <vector>
6 
8 
9 namespace dreal {
10 
12  public:
13  /// Converts a first-order logic formula @p f into a Boolean formula
14  /// by predicate abstraction. For example, a formula `(x > 0) ∧ (y <
15  /// 0)` will be converted into `b₁ ∧ b₂` while `b₁` corresponds with
16  /// `x > 0` and `b₂` corresponds with `y < 0`. The class provides
17  /// `operator[b]` which looks up the corresponding formula for a
18  /// Boolean variable `b`.
19  Formula Convert(const Formula& f);
20 
21  /// Converts @p formulas into a conjunction of Boolean formulas. See
22  /// the above method.
23  Formula Convert(const std::vector<Formula>& formulas);
24 
25  const std::unordered_map<Variable, Formula, hash_value<Variable>>&
26  var_to_formula_map() const {
27  return var_to_formula_map_;
28  }
29 
30  const Variable& operator[](const Formula& f) const {
31  return formula_to_var_map_.at(f);
32  }
33 
34  const Formula& operator[](const Variable& var) const {
35  return var_to_formula_map_.at(var);
36  }
37 
38  private:
39  Formula Visit(const Formula& f);
40  Formula VisitFalse(const Formula& f);
41  Formula VisitTrue(const Formula& f);
42  Formula VisitVariable(const Formula& f);
43  Formula VisitAtomic(const Formula& f);
44  Formula VisitEqualTo(const Formula& f);
45  Formula VisitNotEqualTo(const Formula& f);
46  Formula VisitGreaterThan(const Formula& f);
47  Formula VisitGreaterThanOrEqualTo(const Formula& f);
48  Formula VisitLessThan(const Formula& f);
49  Formula VisitLessThanOrEqualTo(const Formula& f);
50  Formula VisitConjunction(const Formula& f);
51  Formula VisitDisjunction(const Formula& f);
52  Formula VisitNegation(const Formula& f);
53  Formula VisitForall(const Formula& f);
54 
55  void Add(const Variable& var, const Formula& f);
56 
57  std::unordered_map<Variable, Formula, hash_value<Variable>>
58  var_to_formula_map_;
59  std::unordered_map<Formula, Variable> formula_to_var_map_;
60 
61  // Makes VisitFormula a friend of this class so that it can use private
62  // operator()s.
63  friend Formula drake::symbolic::VisitFormula<Formula, PredicateAbstractor>(
64  PredicateAbstractor*, const Formula&);
65 };
66 } // namespace dreal
Formula Convert(const Formula &f)
Converts a first-order logic formula f into a Boolean formula by predicate abstraction.
Definition: predicate_abstractor.cc:56
Sum type of symbolic::Expression and symbolic::Formula.
Definition: api.cc:9
Represents a symbolic variable.
Definition: symbolic_variable.h:16
Definition: predicate_abstractor.h:11
This is the header file that we consolidate Drake&#39;s symbolic classes and expose them inside of dreal ...
Represents a symbolic form of a first-order logic formula.
Definition: symbolic_formula.h:101