All Downloads are FREE. Search and download functionalities are using the official Maven repository.

z3-z3-4.13.0.src.smt.theory_array_full.h Maven / Gradle / Ivy

The newest version!
/*++
Copyright (c) 2006 Microsoft Corporation

Module Name:

    theory_array_full.h

Abstract:

    

Author:

    Nikolaj Bjorner 2008-22-10

Revision History:

--*/
#pragma once

#include "smt/theory_array.h"
#include "ast/ast_trail.h"

namespace smt {

    class theory_array_full : public theory_array {
        struct var_data_full {
            ptr_vector  m_maps;
            ptr_vector  m_consts;
            ptr_vector  m_as_arrays;
            ptr_vector  m_lambdas;
            ptr_vector  m_parent_maps;
        };

        ptr_vector m_var_data_full;

        ast2ast_trailmap m_sort2epsilon;
        ast2ast_trailmap m_sort2diag;
        obj_pair_map m_eqs;
        
        static unsigned const m_default_map_fingerprint = UINT_MAX - 112;
        static unsigned const m_default_store_fingerprint = UINT_MAX - 113;
        static unsigned const m_default_const_fingerprint = UINT_MAX - 115;
        static unsigned const m_default_as_array_fingerprint = UINT_MAX - 116;
        static unsigned const m_default_lambda_fingerprint = UINT_MAX - 117;

    protected:

        //virtual final_check_status final_check_eh();
        void reset_eh() override;

        void set_prop_upward(theory_var v) override;
        void set_prop_upward(enode* n) override;
        void set_prop_upward(theory_var v, var_data* d) override;
        unsigned get_lambda_equiv_size(theory_var v, var_data* d) override;


        bool internalize_term(app * term) override;
        bool internalize_atom(app * atom, bool gate_ctx) override;
        void pop_scope_eh(unsigned num_scopes) override;
        theory_var mk_var(enode * n) override;
        void relevant_eh(app * n) override;

        bool should_research(expr_ref_vector & unsat_core) override;
        void add_theory_assumptions(expr_ref_vector & assumptions) override;

        void add_const(theory_var v, enode* c);
        void add_map(theory_var v, enode* s);
        void add_parent_map(theory_var v, enode* s);
        void add_as_array(theory_var v, enode* arr);
        void add_lambda(theory_var v, enode* lam);

        void add_parent_select(theory_var v, enode * s) override;
        void add_parent_default(theory_var v);        

        final_check_status assert_delayed_axioms() override;

        bool instantiate_default_const_axiom(enode* cnst);
        bool instantiate_default_store_axiom(enode* store);
        bool instantiate_default_map_axiom(enode* map);
        bool instantiate_default_as_array_axiom(enode* arr);
        bool instantiate_default_lambda_def_axiom(enode* arr);
        bool instantiate_parent_stores_default(theory_var v);

        bool has_large_domain(app* array_term);
        bool has_unitary_domain(app* array_term);
        std::pair mk_epsilon(sort* s);
        enode_vector m_as_array;
        enode_vector m_lambdas;
        bool has_non_beta_as_array();

        bool instantiate_select_const_axiom(enode* select, enode* cnst);
        bool instantiate_select_as_array_axiom(enode* select, enode* arr);
        bool instantiate_select_map_axiom(enode* select, enode* map);

        bool instantiate_axiom_map_for(theory_var v);


        bool try_assign_eq(expr* n1, expr* n2);
        void assign_eqs();

        
    public:
        theory_array_full(context& ctx);
        ~theory_array_full() override;

        theory * mk_fresh(context * new_ctx) override;

        void merge_eh(theory_var v1, theory_var v2, theory_var, theory_var) override;
        void display_var(std::ostream & out, theory_var v) const override;
        void collect_statistics(::statistics & st) const override;
    };

};






© 2015 - 2024 Weber Informatics LLC | Privacy Policy