12#ifndef MCRL2_PBES_REWRITERS_QUANTIFIERS_INSIDE_REWRITER_H
13#define MCRL2_PBES_REWRITERS_QUANTIFIERS_INSIDE_REWRITER_H
21namespace pbes_system {
29template <
typename BinaryOperation>
30std::tuple<pbes_expression, pbes_expression>
compute_Phi_Psi(
const std::vector<pbes_expression>& X,
const std::set<data::variable>& V, BinaryOperation op,
pbes_expression empty_sequence_result)
35 std::vector<std::set<data::variable>> vars;
40 auto j = std::min_element(vars.begin(), vars.end(),
41 [&](
const std::set<data::variable>& x,
const std::set<data::variable>& y)
43 return x.size() < y.size();
46 const std::set<data::variable>& Z = *j;
48 std::vector<pbes_expression> phi;
49 std::vector<pbes_expression> psi;
50 for (std::size_t i = 0; i < X.size(); i++)
52 if (std::includes(Z.begin(), Z.end(), vars[i].begin(), vars[i].end()))
95 const std::set<data::variable>&
V;
107 template <
typename T>
145 std::vector<pbes_expression> X;
192 const std::set<data::variable>&
V;
204 template <
typename T>
242 std::vector<pbes_expression> X;
bool empty() const
Returns true if the list's size is 0.
\brief The and operator for pbes expressions
const pbes_expression & left() const
const pbes_expression & right() const
\brief The existential quantification operator for pbes expressions
const data::variable_list & variables() const
const pbes_expression & body() const
\brief The universal quantification operator for pbes expressions
const pbes_expression & body() const
const data::variable_list & variables() const
\brief The implication operator for pbes expressions
const pbes_expression & left() const
const pbes_expression & right() const
\brief The not operator for pbes expressions
const pbes_expression & operand() const
\brief The or operator for pbes expressions
const pbes_expression & left() const
const pbes_expression & right() const
\brief A propositional variable instantiation
A rewriter that pushes quantifiers inside in a PBES expression.
pbes_expression operator()(const pbes_expression &x) const
Rewrites a pbes expression.
pbes_expression term_type
The term type.
data::variable variable_type
The variable type.
data_expression quantifiers_inside_forall(const std::set< variable > &variables, const data_expression &x)
data_expression quantifiers_inside_exists(const std::set< variable > &variables, const data_expression &x)
variable_list make_variable_list(const std::set< variable > &x)
std::set< variable > make_variable_set(const variable_list &x)
pbes_expression quantifiers_inside_forall(const std::set< data::variable > &variables, const pbes_expression &x)
pbes_expression quantifiers_inside_exists(const std::set< data::variable > &variables, const pbes_expression &x)
std::tuple< pbes_expression, pbes_expression > compute_Phi_Psi(const std::vector< pbes_expression > &X, const std::set< data::variable > &V, BinaryOperation op, pbes_expression empty_sequence_result)
pbes_expression quantifiers_inside(const pbes_expression &x)
std::set< data::variable > find_free_variables(const pbes_expression &x, const data::variable_list &bound_variables=data::variable_list(), bool search_propositional_variables=true)
void make_and_(atermpp::aterm &t, const ARGUMENTS &... args)
vertex_set set_union(const vertex_set &V, const vertex_set &W)
bool is_false(const pbes_expression &t)
Test for the value false.
void optimized_or(pbes_expression &result, const pbes_expression &p, const pbes_expression &q)
Make a disjunction.
void optimized_and(pbes_expression &result, const pbes_expression &p, const pbes_expression &q)
Make a conjunction.
vertex_set set_intersection(const VertexSet &V, const vertex_set &W)
bool is_true(const pbes_expression &t)
Test for the value true.
T join(FwdIt first, FwdIt last, BinaryOperation op, T empty_sequence_result)
Given a sequence [t1, t2, ..., tn] of elements of type T, returns op(t1, op(t2, .....
std::set< T > set_union(const std::set< T > &x, const std::set< T > &y)
Returns the union of two sets.
void split(const T &t, OutputIterator i, MatchFunction match, AccessorFunction1 lhs, AccessorFunction2 rhs)
Splits a binary tree T into a sequence, and writes the result to the output range given by an output ...
std::set< T > set_intersection(const std::set< T > &x, const std::set< T > &y)
Returns the intersection of two sets.
std::set< T > set_difference(const std::set< T > &x, const std::set< T > &y)
Returns the difference of two sets.
A class that takes a linear process specification and checks all tau-summands of that LPS for conflue...
add your file description here.
add your file description here.
Contains type information for terms.
void apply(T &result, const pbes_system::propositional_variable_instantiation &x)
void apply(T &result, const pbes_system::propositional_variable_instantiation &x)
pbes_expression_builder< quantifiers_inside_builder > super
void apply(T &result, const forall &x)
void apply(T &result, const exists &x)
pbes_expression apply_default(const T &x)
quantifiers_inside_exists_builder(const std::set< data::variable > &V_)
void apply(T &result, const not_ &x)
void apply(T &result, const exists &x)
const std::set< data::variable > & V
static pbes_expression make_exists_(const data::variable_list &vars, const pbes_expression &body)
void apply(T &result, const or_ &x)
void apply(T &result, const propositional_variable_instantiation &x)
void apply(T &result, const imp &x)
void apply(T &result, const data::data_expression &x)
void apply(T &result, const forall &x)
void apply(T &result, const and_ &x)
pbes_expression_builder< quantifiers_inside_exists_builder > super
void apply(T &result, const exists &x)
const std::set< data::variable > & V
void apply(T &result, const imp &x)
static pbes_expression make_forall_(const data::variable_list &vars, const pbes_expression &body)
void apply(T &result, const or_ &x)
void apply(T &result, const data::data_expression &x)
void apply(T &result, const and_ &x)
quantifiers_inside_forall_builder(const std::set< data::variable > &V_)
void apply(T &result, const propositional_variable_instantiation &x)
pbes_expression apply_default(const T &x)
void apply(T &result, const not_ &x)
data_expression_builder< quantifiers_inside_forall_builder > super
void apply(T &result, const forall &x)