12#ifndef MCRL2_DATA_DETAIL_PROVER_MANIPULATOR_H
13#define MCRL2_DATA_DETAIL_PROVER_MANIPULATOR_H
15#include "mcrl2/data/detail/prover/info.h"
41 std::unordered_map < data_expression, data_expression >& f_set_true)
const
55 const abstraction& t=atermpp::down_cast<abstraction>(a_formula);
56 return abstraction(t.binding_operator(), t.variables(), set_true_auxiliary(t.body(), a_guard, f_set_true));
59 if (a_formula == a_guard)
64 if (is_equal_to_application(a_guard))
66 const application& a = atermpp::down_cast<application>(a_guard);
80 std::unordered_map < data_expression, data_expression >::const_iterator i=f_set_true.find(a_formula);
81 if (i!=f_set_true.end())
86 const application& t=atermpp::down_cast<application>(a_formula);
90 [&a_guard, &f_set_true,
this](
const data_expression& d){
return set_true_auxiliary(d, a_guard,f_set_true);});
92 f_set_true[a_formula]=v_result;
101 std::unordered_map < data_expression, data_expression >& f_set_false)
const
115 const abstraction& t=atermpp::down_cast<abstraction>(a_formula);
116 return abstraction(t.binding_operator(), t.variables(), set_false_auxiliary(t.body(), a_guard, f_set_false));
119 if (a_formula == a_guard)
129 std::unordered_map < data_expression, data_expression >::const_iterator i=f_set_false.find(a_formula);
130 if (i!=f_set_false.end())
135 const application t(a_formula);
139 [&a_guard, &f_set_false,
this](
const data_expression& d){
return set_false_auxiliary(d, a_guard,f_set_false);});
140 f_set_false[a_formula]=v_result;
158 return a_high == a_low ? a_high :
if_(a_expr
, a_high
, a_low
);
172 const abstraction a(atermpp::down_cast<abstraction>(a_term));
176 std::unordered_map < data_expression, data_expression> :: const_iterator it=f_orient.find(a_term);
177 if (it!=f_orient.end())
182 const application& a = atermpp::down_cast<application>(a_term);
185 if (is_equal_to_application(v_result))
191 v_result = application(v_result.head(), v_term2, v_term1);
194 f_orient[a_term]=v_result;
205 std::unordered_map < data_expression, data_expression > f_set_true;
206 return set_true_auxiliary(a_formula, a_guard, f_set_true);
215 std::unordered_map < data_expression, data_expression > f_set_false;
216 return set_false_auxiliary(a_formula, a_guard,f_set_false);
A unordered_map class in which aterms can be stored.
An abstraction expression.
const variable_list & variables() const
abstraction(const binder_type &binding_operator, const variable_list &variables, const data_expression &body)
Constructor.
const data_expression & body() const
const binder_type & binding_operator() const
const data_expression & lhs() const
const variable_list & variables() const
data_expression & operator=(const data_expression &) noexcept=default
data_expression & operator=(data_expression &&) noexcept=default
sort_expression sort() const
Returns the sort of the data expression.
The class BDD_Info provides information about the structure of binary decision diagrams.
static const mcrl2::data::data_expression & get_true_branch(const mcrl2::data::data_expression &a_bdd)
Method that returns the true-branch of a BDD.
static bool is_if_then_else(const data_expression &a_bdd)
Method that indicates wether or not the root of a BDD is a guard node.
static bool is_false(const data_expression &a_bdd)
Method that indicates whether or not a BDD equals false.
static const mcrl2::data::data_expression & get_guard(const mcrl2::data::data_expression &a_bdd)
Method that returns the guard of a BDD.
static const mcrl2::data::data_expression & argument(const mcrl2::data::data_expression &x, std::size_t n)
static const mcrl2::data::data_expression & get_false_branch(const mcrl2::data::data_expression &a_bdd)
Method that returns the false-branch of a BDD.
static bool is_true(const data_expression &a_bdd)
Method that indicates whether or not a BDD equals true.
Base class for eliminating inconsistent paths from BDDs.
data_expression simplify(const data_expression &a_bdd) override
Returns a BDD without inconsistent paths, equivalent to a_bdd. precondition: The argument passed as p...
data_expression aux_simplify(const data_expression &a_bdd, const data_expression_list &a_path)
Simplifies the BDD a_bdd using path a_path. Paths whose guards in conjunction with the guards in.
BDD_Info f_bdd_info
Class that provides information about the structure of BDDs.
SMT_Solver * f_smt_solver
Pointer to an SMT solver used to determine whether or not a path is inconsistent.
bool variables_overlap(const data_expression &a_expression_1, const data_expression &a_expression_2)
Returns true if the expression a_expression_1 has variables in common with expression a_expression_2.
BDD_Path_Eliminator(smt_solver_type a_solver_type)
Constructor that initializes the field BDD_Path_Eliminator::f_smt_solver.
data_expression_list create_condition(data_expression_list a_path, const data_expression &a_guard, bool a_minimal)
Returns a list representing the conjunction of all guards in a_path and the guard a_guard.
bool get_branch(const data_expression &a_bdd, const bool a_polarity, data_expression &result)
Returns branch of the BDD a_bdd, depending on the polarity a_polarity.
Induction f_induction
Class that creates all statements needed to prove a given property using induction.
strategy rewriter_strategy() const
Returns the strategy of the rewriter used inside this proving rewriter.
std::vector< variable > f_variables
The variables in the expression in order.
std::shared_ptr< BDD_Simplifier > f_bdd_simplifier
Class that simplifies a BDD.
static constexpr bool f_reverse
Flag indicating whether or not the result of the comparison between the first two arguments.
void set_substitution(substitution_type &sigma)
Set the substitution to be used to construct the BDD.
void set_formula(const data_expression &formula)
Sets Prover::f_formula to formula. precondition: the argument passed as parameter formula is an expre...
std::string indent(size_t n)
bool smallest(const data_expression &formula, data_expression &result)
Returns the smallest guard in the formula formula.
data_expression f_bdd
A binary decision diagram in the internal representation of mCRL2.
const Info f_info
A class that provides information about expressions.
data_expression bdd_down(const data_expression &formula, const size_t a_indent=0)
Creates the EQ-BDD corresponding to the formula formula.
static constexpr bool f_full
Flag indicating whether or not the arguments of equality functions are taken into account.
void eliminate_paths()
Removes all inconsistent paths from the BDD BDD_Prover::f_bdd.
BDD_Prover(const rewriter &r, double time_limit=0, bool apply_induction=false)
data_expression get_counter_example()
Returns all the guards on a path in the BDD that leads to a leaf labelled "false",...
substitution_type bdd_sigma
A binary decision diagram in the internal representation of the rewriter.
Answer f_tautology
A flag that indicates whether or not the formala Prover::f_formula is a tautology.
Answer is_contradiction()
Indicates whether or not the formula Prover::f_formula is a contradiction.
data_expression f_formula
An expression of sort Bool.
std::chrono::milliseconds f_deadline
A timestamp representing the moment when the maximal amount of milliseconds has been spent on process...
bool f_processed
A flag that indicates whether or not the formala Prover::f_formula has been processed.
void update_answers()
Updates the values of Prover::f_tautology and Prover::f_contradiction.
std::shared_ptr< detail::Rewriter > get_rewriter()
Returns the rewriter used by this prover (i.e. it returns Prover::f_rewriter).
const double f_time_limit
An integer representing the maximal amount of seconds to be spent on processing a formula.
Manipulator f_manipulator
A class that can be used to manipulate expressions.
bool f_apply_induction
A flag indicating whether or not induction on lists is applied.
void build_bdd()
Constructs the EQ-BDD corresponding to the formula Prover::f_formula.
std::unordered_map< data_expression, data_expression > f_smallest
A hashtable that maps formulas to the smallest guard occuring in those formulas.
Answer f_contradiction
A flag that indicates whether or not the formala Prover::f_formula is a contradiction.
std::unordered_map< data_expression, data_expression > f_formula_to_bdd
A hashtable that maps formulas to BDDs.
data_expression get_bdd()
Returns the BDD BDD_Prover::f_bdd.
data_expression get_witness()
Returns all the guards on a path in the BDD that leads to a leaf labelled "true", if such a leaf exis...
void set_substitution_internal(substitution_type &sigma)
Set the substitution in internal format to be used to construct the BDD.
Answer is_tautology()
Indicates whether or not the formula Prover::f_formula is a tautology.
BDD_Prover(const data_specification &data_spec, const used_data_equation_selector &equations_selector, mcrl2::data::rewriter::strategy a_rewrite_strategy=mcrl2::data::rewrite_strategy::jitty, double a_time_limit=0, bool a_path_eliminator=false, smt_solver_type a_solver_type=smt_solver_type::solver_type_cvc, bool a_apply_induction=false)
A base class for simplifying binary decision diagrams.
void set_time_limit(time_t a_time_limit)
Sets the attribute BDD_Simplifier::f_deadline.
virtual data_expression simplify(const data_expression &a_bdd)
Returns a simplified BDD, equivalent to the bdd a_bdd. precondition: The argument passed as parameter...
virtual ~BDD_Simplifier()=default
Destructor without any additional functionality.
time_t f_deadline
An integer representing the moment in time when the maximal amount of seconds has been spent on simpl...
The class Induction generates statements corresponding to.
Base class for classes that provide information about the structure of.
constexpr Info(bool a_full, bool a_reverse)
Constructor that initializes the rewriter.
Compare_Result compare_term(const data_expression &term1, const data_expression &term2) const
Compares two terms.
Base class for classes that provide functionality to modify or create terms.
data_expression orient(const data_expression &a_term)
Orients the term a_term such that all equations of the form t1 == t2 are.
Manipulator(const Info &a_info)
Constructor initializing the rewriter and the field f_info.
data_expression set_true(const data_expression &a_formula, const data_expression &a_guard) const
Initializes the table Manipulator::f_set_true and calls.
std::unordered_map< data_expression, data_expression > f_orient
A table used by the method Manipulator::orient. The method Manipulator::orient stores resulting terms...
data_expression set_false(const data_expression &a_formula, const data_expression &a_guard) const
Initializes the table Manipulator::f_set_false and calls the method.
const Info & f_info
A class that provides information on the structure of expressions in one of the.
static data_expression make_reduced_if_then_else(const data_expression &a_expr, const data_expression &a_high, const data_expression &a_low)
Returns an expression in the internal format of the rewriter with the jitty strategy.
data_expression set_false_auxiliary(const data_expression &a_formula, const data_expression &a_guard, std::unordered_map< data_expression, data_expression > &f_set_false) const
Replaces all occurences of a_guard in a_formula by false.
data_expression set_true_auxiliary(const data_expression &a_formula, const data_expression &a_guard, std::unordered_map< data_expression, data_expression > &f_set_true) const
Replaces all occurences of a_guard in a_formula by true. Additionally, if the variable.
RewriterProver(const data_specification &data_spec, mcrl2::data::rewriter::strategy strat, const used_data_equation_selector &equations_selector)
RewriterProver(const RewriterProver &other)=delete
data_expression rewrite(const data_expression &t, substitution_type &sigma) override
Rewrite an mCRL2 data term.
rewrite_strategy getStrategy() override
Get rewriter strategy that is used.
void rewrite(data_expression &result, const data_expression &t, substitution_type &sigma) override
Rewrite an mCRL2 data term.
~RewriterProver() override=default
RewriterProver(const RewriterProver &rewr, BDD_Prover prover_obj_)
void thread_initialise() override
std::shared_ptr< Rewriter > clone() override
Clone a rewriter.
Rewriter interface class.
void rewrite_where(data_expression &result, const where_clause &term, substitution_type &sigma)
virtual void thread_initialise()
Rewriter(const data_specification &data_spec, const used_data_equation_selector &eq_selector)
Constructor. Do not use directly; use createRewriter() function instead.
A strategy is a list of rules and the number of variables that occur in it.
An enumerator algorithm that generates solutions of a condition.
The default element for the todo list of the enumerator.
Rewriter that operates on data expressions.
void thread_initialise()
Initialises this rewriter with thread dependent information.
rewriter clone()
Create a clone of the rewriter in which the underlying rewriter is copied, and not passed as a shared...
rewriter(const rewriter &r)=default
Constructor.
Component for selecting a subset of equations that are actually used in an encompassing specification...
variable(const variable &) noexcept=default
Move semantics.
\brief A where expression
const assignment_list & assignments() const
const data_expression & body() const
#define mCRL2log(LEVEL)
mCRL2log(LEVEL) provides the stream used to log.
void CheckRewriteRule(const data_equation &data_eqn)
Check that an mCRL2 data equation is a valid rewrite rule. If not, an runtime_error is thrown indicat...
static void checkPattern(const data_expression &p)
static void check_vars(application::const_iterator begin, const application::const_iterator &end, const std::set< variable > &vars, std::set< variable > &used_vars)
void set_enumerator_iteration_limit(std::size_t size)
bool isValidRewriteRule(const data_equation &data_eqn)
Check whether or not an mCRL2 data equation is a valid rewrite rule.
static bool occur_check(const variable &v, const atermpp::aterm &e)
static void checkPattern(application::const_iterator begin, const application::const_iterator &end)
Answer
A prover that uses EQ-BDDs.
static void check_vars(const data_expression &expr, const std::set< variable > &vars, std::set< variable > &used_vars)
A collection of utilities for lazy expression construction.
data_expression and_(data_expression const &p, data_expression const &q)
Returns an expression equivalent to p or q.
Namespace for system defined sort bool_.
bool is_false_function_symbol(const atermpp::aterm &e)
Recogniser for function false.
const basic_sort & bool_()
Constructor for sort expression Bool.
application not_(const data_expression &arg0)
Application of function symbol !.
const function_symbol & false_()
Constructor for function symbol false.
bool is_true_function_symbol(const atermpp::aterm &e)
Recogniser for function true.
const function_symbol & true_()
Constructor for function symbol true.
bool is_application(const data_expression &t)
Returns true if the term t is an application.
bool is_where_clause(const atermpp::aterm &x)
Returns true if the term t is a where clause.
bool is_abstraction(const atermpp::aterm &x)
Returns true if the term t is an abstraction.
application if_(const data_expression &arg0, const data_expression &arg1, const data_expression &arg2)
Application of function symbol if.
bool is_forall(const atermpp::aterm &x)
Returns true if the term t is a universal quantification.
bool is_function_symbol(const atermpp::aterm &x)
Returns true if the term t is a function symbol.
bool is_exists(const atermpp::aterm &x)
Returns true if the term t is an existential quantification.
bool is_machine_number(const atermpp::aterm &x)
Returns true if the term t is a machine_number.
bool is_lambda(const atermpp::aterm &x)
Returns true if the term t is a lambda abstraction.
bool is_variable(const atermpp::aterm &x)
Returns true if the term t is a variable.
static std::size_t max_enumerator_iterations
bool operator()(const atermpp::aterm &t) const
rewriter_wrapper(Rewriter *r)