mirror of
				https://github.com/Z3Prover/z3
				synced 2025-11-04 05:19:11 +00:00 
			
		
		
		
	Fix uninterpreted sort definition. There was a mismatch in the behavior of the API and SMT front-ends. The SMT front-ends were using user_sorts to be able to support parametric uninterpreted sorts. After this fix, the API also creates user_sorts.
Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
This commit is contained in:
		
							parent
							
								
									3b8d72beeb
								
							
						
					
					
						commit
						3a15db5244
					
				
					 8 changed files with 23 additions and 14 deletions
				
			
		| 
						 | 
					@ -78,7 +78,7 @@ extern "C" {
 | 
				
			||||||
        Z3_TRY;
 | 
					        Z3_TRY;
 | 
				
			||||||
        LOG_Z3_mk_uninterpreted_sort(c, name);
 | 
					        LOG_Z3_mk_uninterpreted_sort(c, name);
 | 
				
			||||||
        RESET_ERROR_CODE();
 | 
					        RESET_ERROR_CODE();
 | 
				
			||||||
        sort* ty = mk_c(c)->m().mk_sort(to_symbol(name));
 | 
					        sort* ty = mk_c(c)->m().mk_uninterpreted_sort(to_symbol(name));
 | 
				
			||||||
        mk_c(c)->save_ast_trail(ty);
 | 
					        mk_c(c)->save_ast_trail(ty);
 | 
				
			||||||
        RETURN_Z3(of_sort(ty));
 | 
					        RETURN_Z3(of_sort(ty));
 | 
				
			||||||
        Z3_CATCH_RETURN(0);
 | 
					        Z3_CATCH_RETURN(0);
 | 
				
			||||||
| 
						 | 
					@ -620,7 +620,7 @@ extern "C" {
 | 
				
			||||||
        CHECK_VALID_AST(t, Z3_UNKNOWN_SORT);
 | 
					        CHECK_VALID_AST(t, Z3_UNKNOWN_SORT);
 | 
				
			||||||
        family_id fid = to_sort(t)->get_family_id();
 | 
					        family_id fid = to_sort(t)->get_family_id();
 | 
				
			||||||
        decl_kind k   = to_sort(t)->get_decl_kind();
 | 
					        decl_kind k   = to_sort(t)->get_decl_kind();
 | 
				
			||||||
        if (fid == null_family_id) {
 | 
					        if (mk_c(c)->m().is_uninterp(to_sort(t))) {
 | 
				
			||||||
            return Z3_UNINTERPRETED_SORT;
 | 
					            return Z3_UNINTERPRETED_SORT;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        else if (fid == mk_c(c)->m().get_basic_family_id() && k == BOOL_SORT) {
 | 
					        else if (fid == mk_c(c)->m().get_basic_family_id() && k == BOOL_SORT) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1816,6 +1816,12 @@ sort * ast_manager::mk_sort(symbol const & name, sort_info * info) {
 | 
				
			||||||
    return register_node(new_node);
 | 
					    return register_node(new_node);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					sort * ast_manager::mk_uninterpreted_sort(symbol const & name, unsigned num_parameters, parameter const * parameters) {
 | 
				
			||||||
 | 
					    user_sort_plugin * plugin = get_user_sort_plugin();
 | 
				
			||||||
 | 
					    decl_kind kind = plugin->register_name(name);
 | 
				
			||||||
 | 
					    return plugin->mk_sort(kind, num_parameters, parameters);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func_decl * ast_manager::mk_func_decl(symbol const & name, unsigned arity, sort * const * domain, sort * range, 
 | 
					func_decl * ast_manager::mk_func_decl(symbol const & name, unsigned arity, sort * const * domain, sort * range, 
 | 
				
			||||||
                                      bool assoc, bool comm, bool inj) {
 | 
					                                      bool assoc, bool comm, bool inj) {
 | 
				
			||||||
    func_decl_info info(null_family_id, null_decl_kind);
 | 
					    func_decl_info info(null_family_id, null_decl_kind);
 | 
				
			||||||
| 
						 | 
					@ -2058,7 +2064,7 @@ sort * ast_manager::mk_fresh_sort(char const * prefix) {
 | 
				
			||||||
    string_buffer<32> buffer;
 | 
					    string_buffer<32> buffer;
 | 
				
			||||||
    buffer << prefix << "!" << m_fresh_id;
 | 
					    buffer << prefix << "!" << m_fresh_id;
 | 
				
			||||||
    m_fresh_id++;
 | 
					    m_fresh_id++;
 | 
				
			||||||
    return mk_sort(symbol(buffer.c_str()));
 | 
					    return mk_uninterpreted_sort(symbol(buffer.c_str()));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
symbol ast_manager::mk_fresh_var_name(char const * prefix) {
 | 
					symbol ast_manager::mk_fresh_var_name(char const * prefix) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1622,11 +1622,13 @@ private:
 | 
				
			||||||
    sort * mk_sort(symbol const & name, sort_info * info);
 | 
					    sort * mk_sort(symbol const & name, sort_info * info);
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    sort * mk_sort(symbol const & name) { return mk_sort(name, 0); }
 | 
					    sort * mk_uninterpreted_sort(symbol const & name, unsigned num_parameters, parameter const * parameters);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    sort * mk_uninterpreted_sort(symbol const & name) { return mk_uninterpreted_sort(name, 0, 0); }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    sort * mk_sort(symbol const & name, sort_info const & info) {
 | 
					    sort * mk_sort(symbol const & name, sort_info const & info) {
 | 
				
			||||||
        if (info.get_family_id() == null_family_id) {
 | 
					        if (info.get_family_id() == null_family_id) {
 | 
				
			||||||
            return mk_sort(name, 0);
 | 
					            return mk_uninterpreted_sort(name);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        else {
 | 
					        else {
 | 
				
			||||||
            return mk_sort(name, &const_cast<sort_info &>(info));
 | 
					            return mk_sort(name, &const_cast<sort_info &>(info));
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -111,7 +111,10 @@ void ast_translation::mk_sort(sort * s, frame & fr) {
 | 
				
			||||||
    sort_info * si     = s->get_info();
 | 
					    sort_info * si     = s->get_info();
 | 
				
			||||||
    sort * new_s;
 | 
					    sort * new_s;
 | 
				
			||||||
    if (si == 0) {
 | 
					    if (si == 0) {
 | 
				
			||||||
        new_s = m_to_manager.mk_sort(s->get_name());
 | 
					        // TODO: investigate: this branch is probably unreachable.
 | 
				
			||||||
 | 
					        // It became unreachable after we started using mk_uninterpreted_sort for creating uninterpreted sorts,
 | 
				
			||||||
 | 
					        // and mk_uninterpreted_sort actually creates a user_sort.
 | 
				
			||||||
 | 
					        new_s = m_to_manager.mk_uninterpreted_sort(s->get_name());
 | 
				
			||||||
        SASSERT(m_result_stack.size() == fr.m_rpos);
 | 
					        SASSERT(m_result_stack.size() == fr.m_rpos);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else {
 | 
					    else {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -117,8 +117,8 @@ void seq_decl_plugin::init() {
 | 
				
			||||||
    if(m_init) return;
 | 
					    if(m_init) return;
 | 
				
			||||||
    ast_manager& m = *m_manager;
 | 
					    ast_manager& m = *m_manager;
 | 
				
			||||||
    m_init = true;
 | 
					    m_init = true;
 | 
				
			||||||
    sort* A = m.mk_sort(symbol((unsigned)0));
 | 
					    sort* A = m.mk_uninterpreted_sort(symbol((unsigned)0));
 | 
				
			||||||
    sort* B = m.mk_sort(symbol((unsigned)1));
 | 
					    sort* B = m.mk_uninterpreted_sort(symbol((unsigned)1));
 | 
				
			||||||
    parameter paramA(A);
 | 
					    parameter paramA(A);
 | 
				
			||||||
    sort* seqA = m.mk_sort(m_family_id, SEQ_SORT, 1, ¶mA);
 | 
					    sort* seqA = m.mk_sort(m_family_id, SEQ_SORT, 1, ¶mA);
 | 
				
			||||||
    sort* reA  = m.mk_sort(m_family_id, RE_SORT, 1, ¶mA);
 | 
					    sort* reA  = m.mk_sort(m_family_id, RE_SORT, 1, ¶mA);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -303,12 +303,10 @@ sort * psort_user_decl::instantiate(pdecl_manager & m, unsigned n, sort * const
 | 
				
			||||||
    if (r)
 | 
					    if (r)
 | 
				
			||||||
        return r;
 | 
					        return r;
 | 
				
			||||||
    if (m_def == 0) {
 | 
					    if (m_def == 0) {
 | 
				
			||||||
        user_sort_plugin * plugin = m.m().get_user_sort_plugin();
 | 
					 | 
				
			||||||
        buffer<parameter> ps;
 | 
					        buffer<parameter> ps;
 | 
				
			||||||
        for (unsigned i = 0; i < n; i++)
 | 
					        for (unsigned i = 0; i < n; i++)
 | 
				
			||||||
            ps.push_back(parameter(s[i]));
 | 
					            ps.push_back(parameter(s[i]));
 | 
				
			||||||
        decl_kind kind = plugin->register_name(m_name);
 | 
					        r  = m.m().mk_uninterpreted_sort(m_name, ps.size(), ps.c_ptr());
 | 
				
			||||||
        r  = plugin->mk_sort(kind, ps.size(), ps.c_ptr());
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else {
 | 
					    else {
 | 
				
			||||||
        r = m_def->instantiate(m, s);
 | 
					        r = m_def->instantiate(m, s);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -193,7 +193,7 @@ func_decl * theory::declare_func(symbol const & id, sort_ref_buffer & domain, so
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sort * theory::declare_sort(symbol const & id) {
 | 
					sort * theory::declare_sort(symbol const & id) {
 | 
				
			||||||
    sort * decl = m_ast_manager.mk_sort(id);
 | 
					    sort * decl = m_ast_manager.mk_uninterpreted_sort(id);
 | 
				
			||||||
    m_symtable.insert(id, decl);
 | 
					    m_symtable.insert(id, decl);
 | 
				
			||||||
    m_asts.push_back(decl);
 | 
					    m_asts.push_back(decl);
 | 
				
			||||||
    return decl;
 | 
					    return decl;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -880,8 +880,8 @@ private:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                if (name == symbol("QF_AX")) {
 | 
					                if (name == symbol("QF_AX")) {
 | 
				
			||||||
                    // Hack for supporting new QF_AX theory...
 | 
					                    // Hack for supporting new QF_AX theory...
 | 
				
			||||||
                    sort * index   = m_manager.mk_sort(symbol("Index"));
 | 
					                    sort * index   = m_manager.mk_uninterpreted_sort(symbol("Index"));
 | 
				
			||||||
                    sort * element = m_manager.mk_sort(symbol("Element"));
 | 
					                    sort * element = m_manager.mk_uninterpreted_sort(symbol("Element"));
 | 
				
			||||||
                    parameter params[2] = { parameter(index), parameter(element) };
 | 
					                    parameter params[2] = { parameter(index), parameter(element) };
 | 
				
			||||||
                    sort * array   = m_manager.mk_sort(m_array_fid, ARRAY_SORT, 2, params);
 | 
					                    sort * array   = m_manager.mk_sort(m_array_fid, ARRAY_SORT, 2, params);
 | 
				
			||||||
                    smtlib::symtable* table = m_benchmark.get_symtable();
 | 
					                    smtlib::symtable* table = m_benchmark.get_symtable();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue