carl  25.02
Computer ARithmetic Library
Substitution.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "../Formula.h"
4 #include "Visit.h"
5 
6 namespace carl {
7 
8 namespace helper {
9  template<typename Pol>
10  struct Substitutor {
11  const std::map<Formula<Pol>,Formula<Pol>>& replacements;
12  explicit Substitutor(const std::map<Formula<Pol>,Formula<Pol>>& repl): replacements(repl) {}
14  auto it = replacements.find(formula);
15  if (it == replacements.end()) return formula;
16  return it->second;
17  }
18  };
19 
20  template<typename Pol>
22  const std::map<Variable,typename Formula<Pol>::PolynomialType>& replacements;
23  explicit PolynomialSubstitutor(const std::map<Variable,typename Formula<Pol>::PolynomialType>& repl): replacements(repl) {}
25  if (formula.type() == FormulaType::CONSTRAINT) {
26  return Formula<Pol>(carl::substitute(formula.constraint().lhs(), replacements), formula.constraint().relation());
27  } else if (formula.type() == FormulaType::VARCOMPARE) {
28  assert(false);
29  return formula;
30  // we would need to substitute var() as well...
31  //if (std::holds_alternative<VariableComparison<Pol>::RAN>(formula.variable_comparison().value())) {
32  //} else {
33  // return Formula<Pol>(VariableComparison<Pol>(formula.variable_comparison().var(),carl::substitute(carl::defining_polynomial(formula.variable_comparison()), replacements), formula.variable_comparison().relation(), formula.variable_comparison().negated()));
34  //}
35  } else {
36  return formula;
37  }
38  }
39  };
40 
41  template<typename Pol>
43  const std::map<BVVariable,BVTerm>& replacements;
44  explicit BitvectorSubstitutor(const std::map<BVVariable,BVTerm>& repl): replacements(repl) {}
46  if (formula.type() != FormulaType::BITVECTOR) return formula;
47  BVTerm lhs = formula.bv_constraint().lhs().substitute(replacements);
48  BVTerm rhs = formula.bv_constraint().rhs().substitute(replacements);
49  return Formula<Pol>(BVConstraint::create(formula.bv_constraint().relation(), lhs, rhs));
50  }
51  };
52 
53  template<typename Pol>
55  const std::map<UVariable,UFInstance>& replacements;
56  explicit UninterpretedSubstitutor(const std::map<UVariable,UFInstance>& repl): replacements(repl) {}
58  if (formula.type() != FormulaType::UEQ) return formula;
59 
60  }
61  };
62 }
63 
64 template<typename Pol, typename Source, typename Target>
65 Formula<Pol> substitute(const Formula<Pol>& formula, const Source& source, const Target& target) {
66  std::map<Source,Target> tmp;
67  tmp.emplace(source, target);
68  return substitute(formula, tmp);
69 }
70 template<typename Pol>
71 Formula<Pol> substitute(const Formula<Pol>& formula, const std::map<Formula<Pol>,Formula<Pol>>& replacements) {
72  helper::Substitutor<Pol> subs(replacements);
73  return visit_result(formula, std::function<Formula<Pol>(Formula<Pol>)>(subs));
74 }
75 template<typename Pol>
76 Formula<Pol> substitute(const Formula<Pol>& formula, const std::map<Variable,typename Formula<Pol>::PolynomialType>& replacements) {
77  helper::PolynomialSubstitutor<Pol> subs(replacements);
78  return visit_result(formula, std::function<Formula<Pol>(Formula<Pol>)>(subs));
79 }
80 template<typename Pol>
81 Formula<Pol> substitute(const Formula<Pol>& formula, const std::map<BVVariable,BVTerm>& replacements) {
82  helper::BitvectorSubstitutor<Pol> subs(replacements);
83  return visit_result(formula, std::function<Formula<Pol>(Formula<Pol>)>(subs));
84 }
85 template<typename Pol>
86 Formula<Pol> substitute(const Formula<Pol>& formula, const std::map<UVariable,UFInstance>& replacements) {
87  helper::UninterpretedSubstitutor<Pol> subs(replacements);
88  return visit_result(formula, std::function<Formula<Pol>(Formula<Pol>)>(subs));
89 }
90 
91 }
carl is the main namespace for the library.
@ CONSTRAINT
@ BITVECTOR
@ VARCOMPARE
Coeff substitute(const Monomial &m, const std::map< Variable, Coeff > &substitutions)
Applies the given substitutions to a monomial.
Definition: Substitution.h:19
Formula< Pol > visit_result(const Formula< Pol > &formula, Visitor func)
Recursively calls func on every subformula and return a new formula.
Definition: Visit.h:53
A Variable represents an algebraic variable that can be used throughout carl.
Definition: Variable.h:85
const BVTerm & rhs() const
Definition: BVConstraint.h:62
const BVTerm & lhs() const
Definition: BVConstraint.h:55
BVCompareRelation relation() const
Definition: BVConstraint.h:69
static BVConstraint create(bool _consistent=true)
BVTerm substitute(const std::map< BVVariable, BVTerm > &) const
Definition: BVTerm.cpp:99
Represent an SMT formula, which can be an atom for some background theory or a boolean combination of...
Definition: Formula.h:47
Pol PolynomialType
A typedef for the template argument.
Definition: Formula.h:59
const Constraint< Pol > & constraint() const
Definition: Formula.h:432
const BVConstraint & bv_constraint() const
Definition: Formula.h:448
FormulaType type() const
Definition: Formula.h:262
const std::map< Formula< Pol >, Formula< Pol > > & replacements
Definition: Substitution.h:11
Formula< Pol > operator()(const Formula< Pol > &formula)
Definition: Substitution.h:13
Substitutor(const std::map< Formula< Pol >, Formula< Pol >> &repl)
Definition: Substitution.h:12
Formula< Pol > operator()(const Formula< Pol > &formula)
Definition: Substitution.h:24
PolynomialSubstitutor(const std::map< Variable, typename Formula< Pol >::PolynomialType > &repl)
Definition: Substitution.h:23
const std::map< Variable, typename Formula< Pol >::PolynomialType > & replacements
Definition: Substitution.h:22
Formula< Pol > operator()(const Formula< Pol > &formula)
Definition: Substitution.h:45
BitvectorSubstitutor(const std::map< BVVariable, BVTerm > &repl)
Definition: Substitution.h:44
const std::map< BVVariable, BVTerm > & replacements
Definition: Substitution.h:43
const std::map< UVariable, UFInstance > & replacements
Definition: Substitution.h:55
UninterpretedSubstitutor(const std::map< UVariable, UFInstance > &repl)
Definition: Substitution.h:56
Formula< Pol > operator()(const Formula< Pol > &formula)
Definition: Substitution.h:57