12#ifndef MCRL2_DATA_DETAIL_PROVER_INFO_H
13#define MCRL2_DATA_DETAIL_PROVER_INFO_H
15#include "mcrl2/atermpp/algorithm.h"
16#include "mcrl2/data/rewriter.h"
17#include "mcrl2/data/variable.h"
74 if (is_equal_to_application(guard))
76 const application& guard_appl=atermpp::down_cast<application>(guard);
82 auto res = std::find(f_variables.begin(), f_variables.end(), v_term2);
83 auto index = std::distance(f_variables.begin(), res);
84 if (res != f_variables.end())
86 return 1 + (
static_cast<
double>(index) /
static_cast<
double>(f_variables.size()));
102 if (get_guard_structure(guard1,f_variables) < get_guard_structure(guard2,f_variables))
106 if (get_guard_structure(guard1,f_variables) > get_guard_structure(guard2,f_variables))
116 if (
f_full && is_equal_to_application(guard1) && is_equal_to_application(guard2))
118 const application& guard1_appl=atermpp::down_cast<application>(guard1);
119 const application& guard2_appl=atermpp::down_cast<application>(guard2);
140 if (term1_is_closed && !term2_is_closed)
144 if (!term1_is_closed && term2_is_closed)
181 constexpr Info(
bool a_full,
bool a_reverse)
197 compare_guard_structure(guard1, guard2, f_variables),
198 compare_guard_equality(guard1, guard2)
200 compare_address(guard1, guard2)
227 return atermpp::down_cast<application>(a_term).size();
244 return get_operator(atermpp::down_cast<abstraction>(term).body());
246 const application& a = atermpp::down_cast<application>(term);
aterm()
Default constructor.
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.
BDD_Prover(const data_specification &data_spec, const used_data_equation_selector &equations_selector, mcrl2::data::rewriter::strategy a_rewrite_strategy=mcrl2::data::jitty, double a_time_limit=0, bool a_path_eliminator=false, smt_solver_type a_solver_type=solver_type_cvc, bool a_apply_induction=false)
Answer is_tautology()
Indicates whether or not the formula Prover::f_formula is a tautology.
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.
data_expression get_operator(const data_expression &term) const
Returns the main operator of the term term;.
constexpr Info(bool a_full, bool a_reverse)
Constructor that initializes the rewriter.
Compare_Result compare_term_free_variables(const data_expression &term1, const data_expression &term2) const
Compare_Result compare_guard_equality(const data_expression &guard1, const data_expression &guard2) const
Compares two guards by their arguments.
Compare_Result compare_address(const atermpp::aterm &term1, const atermpp::aterm &term2) const
static bool occurs(const data_expression &t1, const data_expression &t2)
Compare_Result lexico(const Compare_Result &a_result1, const Compare_Result &a_result2) const
Compare_Result compare_term_type(const data_expression &term1, const data_expression &term2) const
Compares terms by their type.
std::size_t get_number_of_arguments(const data_expression &a_term) const
Returns the number of arguments of the main operator of a term.
double get_guard_structure(const data_expression &guard, const std::vector< variable > &f_variables) const
Returns an integer corresponding to the structure of the guard passed as argument guard.
Compare_Result compare_term_occurs(const data_expression &term1, const data_expression &term2) const
Compares terms by checking whether one is a part of the other.
const bool f_full
Flag indicating whether or not the arguments of equality functions are taken into account.
Compare_Result compare_guard_structure(const data_expression &guard1, const data_expression &guard2, const std::vector< variable > &f_variables) const
Compares the structure of two guards.
Compare_Result compare_term(const data_expression &term1, const data_expression &term2) const
Compares two terms.
Compare_Result compare_guard(const data_expression &guard1, const data_expression &guard2, const std::vector< variable > &f_variables) const
Compares two guards.
const bool f_reverse
Flag indicating whether or not the result of the comparison between the first two arguments.
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.
std::set< data::variable > find_free_variables(const data::data_expression &x)
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)