mirror of
				https://github.com/Z3Prover/z3
				synced 2025-11-04 05:19:11 +00:00 
			
		
		
		
	add intersection using symbolic automata facility
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
		
							parent
							
								
									4cf72e23e6
								
							
						
					
					
						commit
						df2d7e7628
					
				
					 8 changed files with 561 additions and 28 deletions
				
			
		| 
						 | 
				
			
			@ -25,6 +25,7 @@ Notes:
 | 
			
		|||
#include"params.h"
 | 
			
		||||
#include"lbool.h"
 | 
			
		||||
#include"automaton.h"
 | 
			
		||||
#include"symbolic_automata.h"
 | 
			
		||||
 | 
			
		||||
class sym_expr {
 | 
			
		||||
    enum ty {
 | 
			
		||||
| 
						 | 
				
			
			@ -33,21 +34,24 @@ class sym_expr {
 | 
			
		|||
        t_range
 | 
			
		||||
    };
 | 
			
		||||
    ty       m_ty;
 | 
			
		||||
    sort*    m_sort;
 | 
			
		||||
    expr_ref m_t;
 | 
			
		||||
    expr_ref m_s;
 | 
			
		||||
    unsigned m_ref;
 | 
			
		||||
    sym_expr(ty ty, expr_ref& t, expr_ref& s) : m_ty(ty), m_t(t), m_s(s), m_ref(0) {}
 | 
			
		||||
    sym_expr(ty ty, expr_ref& t, expr_ref& s, sort* srt) : m_ty(ty), m_sort(srt), m_t(t), m_s(s), m_ref(0) {}
 | 
			
		||||
public:
 | 
			
		||||
    expr_ref accept(expr* e);
 | 
			
		||||
    static sym_expr* mk_char(expr_ref& t) { return alloc(sym_expr, t_char, t, t); }
 | 
			
		||||
    static sym_expr* mk_char(expr_ref& t) { return alloc(sym_expr, t_char, t, t, t.get_manager().get_sort(t)); }
 | 
			
		||||
    static sym_expr* mk_char(ast_manager& m, expr* t) { expr_ref tr(t, m); return mk_char(tr); }
 | 
			
		||||
    static sym_expr* mk_pred(expr_ref& t) { return alloc(sym_expr, t_pred, t, t); }
 | 
			
		||||
    static sym_expr* mk_range(expr_ref& lo, expr_ref& hi) { return alloc(sym_expr, t_range, lo, hi); }
 | 
			
		||||
    static sym_expr* mk_pred(expr_ref& t, sort* s) { return alloc(sym_expr, t_pred, t, t, s); }
 | 
			
		||||
    static sym_expr* mk_range(expr_ref& lo, expr_ref& hi) { return alloc(sym_expr, t_range, lo, hi, lo.get_manager().get_sort(hi)); }
 | 
			
		||||
    void inc_ref() { ++m_ref;  }
 | 
			
		||||
    void dec_ref() { --m_ref; if (m_ref == 0) dealloc(this); }
 | 
			
		||||
    std::ostream& display(std::ostream& out) const;
 | 
			
		||||
    bool is_char() const { return m_ty == t_char; }
 | 
			
		||||
    bool is_pred() const { return !is_char(); }
 | 
			
		||||
    bool is_range() const { return m_ty == t_range; }
 | 
			
		||||
    sort* sort() const { return m_sort; }
 | 
			
		||||
    expr* get_char() const { SASSERT(is_char()); return m_t; }
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			@ -58,17 +62,31 @@ public:
 | 
			
		|||
    void dec_ref(sym_expr* s) { if (s) s->dec_ref(); }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class expr_solver {
 | 
			
		||||
public:
 | 
			
		||||
    virtual ~expr_solver() {}
 | 
			
		||||
    virtual lbool check_sat(expr* e) = 0;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
typedef automaton<sym_expr, sym_expr_manager> eautomaton;
 | 
			
		||||
class re2automaton {
 | 
			
		||||
    typedef boolean_algebra<sym_expr*> boolean_algebra_t;
 | 
			
		||||
    typedef symbolic_automata<sym_expr, sym_expr_manager> symbolic_automata_t;
 | 
			
		||||
    ast_manager& m;
 | 
			
		||||
    sym_expr_manager sm;
 | 
			
		||||
    seq_util     u;     
 | 
			
		||||
    bv_util      bv;
 | 
			
		||||
    scoped_ptr<expr_solver>         m_solver;
 | 
			
		||||
    scoped_ptr<boolean_algebra_t>   m_ba;
 | 
			
		||||
    scoped_ptr<symbolic_automata_t> m_sa;
 | 
			
		||||
 | 
			
		||||
    eautomaton* re2aut(expr* e);
 | 
			
		||||
    eautomaton* seq2aut(expr* e);
 | 
			
		||||
 public:
 | 
			
		||||
public:
 | 
			
		||||
    re2automaton(ast_manager& m);
 | 
			
		||||
    ~re2automaton();
 | 
			
		||||
    eautomaton* operator()(expr* e);
 | 
			
		||||
    void set_solver(expr_solver* solver);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue