mirror of
				https://github.com/Z3Prover/z3
				synced 2025-10-31 03:32:28 +00:00 
			
		
		
		
	delay internalize (#4714)
* adding array solver Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * use default in model construction Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * debug delay internalization Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * bv Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * arrays Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * get rid of implied values and bounds Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * redo egraph * remove out Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * remove files Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
		
							parent
							
								
									25724401cf
								
							
						
					
					
						commit
						367e5fdd52
					
				
					 60 changed files with 1343 additions and 924 deletions
				
			
		|  | @ -15,7 +15,6 @@ Author: | |||
| 
 | ||||
| --*/ | ||||
| 
 | ||||
| #include "ast/ast_ll_pp.h" | ||||
| #include "model/array_factory.h" | ||||
| #include "sat/smt/array_solver.h" | ||||
| #include "sat/smt/euf_solver.h" | ||||
|  | @ -29,6 +28,10 @@ namespace array { | |||
|             return; | ||||
|         } | ||||
|         for (euf::enode* p : euf::enode_parents(n)) { | ||||
|             if (a.is_default(p->get_expr())) { | ||||
|                 dep.add(n, p); | ||||
|                 continue; | ||||
|             } | ||||
|             if (!a.is_select(p->get_expr())) | ||||
|                 continue; | ||||
|             dep.add(n, p); | ||||
|  | @ -37,9 +40,7 @@ namespace array { | |||
|         } | ||||
|         for (euf::enode* k : euf::enode_class(n))  | ||||
|             if (a.is_const(k->get_expr())) | ||||
|                 dep.add(n, k);     | ||||
|             else if (a.is_default(k->get_expr())) | ||||
|                 dep.add(n, k); | ||||
|                 dep.add(n, k->get_arg(0));     | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|  | @ -52,23 +53,58 @@ namespace array { | |||
|         func_interp * fi = alloc(func_interp, m, arity); | ||||
|         mdl.register_decl(f, fi); | ||||
| 
 | ||||
|         for (euf::enode* p : euf::enode_parents(n)) { | ||||
|             if (!a.is_select(p->get_expr()) || p->get_arg(0)->get_root() != n->get_root()) | ||||
|                 continue; | ||||
|             args.reset(); | ||||
|             for (unsigned i = 1; i < p->num_args(); ++i)  | ||||
|                 args.push_back(values.get(p->get_arg(i)->get_root_id())); | ||||
|             expr* value = values.get(p->get_root_id()); | ||||
|             fi->insert_entry(args.c_ptr(), value); | ||||
|         } | ||||
|         if (!fi->get_else())  | ||||
|             for (euf::enode* k : euf::enode_class(n))              | ||||
|                 if (a.is_const(k->get_expr()))  | ||||
|                     fi->set_else(k->get_arg(0)->get_root()->get_expr()); | ||||
|         if (!fi->get_else()) | ||||
|             for (euf::enode* k : euf::enode_parents(n))              | ||||
|                 if (a.is_default(k->get_expr()))  | ||||
|                     fi->set_else(k->get_root()->get_expr()); | ||||
|             for (euf::enode* k : euf::enode_class(n)) | ||||
|                 if (a.is_const(k->get_expr())) | ||||
|                     fi->set_else(values.get(k->get_arg(0)->get_root_id())); | ||||
| 
 | ||||
|         if (!fi->get_else()) | ||||
|             for (euf::enode* p : euf::enode_parents(n)) | ||||
|                 if (a.is_default(p->get_expr())) | ||||
|                     fi->set_else(values.get(p->get_root_id())); | ||||
|      | ||||
|         if (!fi->get_else()) { | ||||
|             expr* else_value = nullptr; | ||||
|             unsigned max_occ_num = 0; | ||||
|             obj_map<expr, unsigned> num_occ; | ||||
|             for (euf::enode* p : euf::enode_parents(n)) { | ||||
|                 if (a.is_select(p->get_expr()) && p->get_arg(0)->get_root() == n->get_root()) { | ||||
|                     expr* v = values.get(p->get_root_id()); | ||||
|                     if (!v) | ||||
|                         continue; | ||||
|                     unsigned no = 0; | ||||
|                     num_occ.find(v, no); | ||||
|                     ++no; | ||||
|                     num_occ.insert(v, no); | ||||
|                     if (no > max_occ_num) { | ||||
|                         else_value = v; | ||||
|                         max_occ_num = no; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             if (else_value) | ||||
|                 fi->set_else(else_value); | ||||
|         } | ||||
| 
 | ||||
|         for (euf::enode* p : euf::enode_parents(n)) { | ||||
|             if (a.is_select(p->get_expr()) && p->get_arg(0)->get_root() == n->get_root()) { | ||||
| //                std::cout << "parent " << mk_bounded_pp(p->get_expr(), m) << "\n";
 | ||||
|                 expr* value = values.get(p->get_root_id()); | ||||
|                 if (!value || value == fi->get_else()) | ||||
|                     continue; | ||||
|                 args.reset(); | ||||
|                 bool relevant = true; | ||||
|                 for (unsigned i = 1; relevant && i < p->num_args(); ++i) | ||||
|                     relevant = ctx.is_relevant(p->get_arg(i)->get_root()); | ||||
|                 if (!relevant) | ||||
|                     continue; | ||||
|                 for (unsigned i = 1; i < p->num_args(); ++i)  | ||||
|                     args.push_back(values.get(p->get_arg(i)->get_root_id()));     | ||||
| //                for (expr* arg : args)
 | ||||
| //                    std::cout << "arg " << mk_bounded_pp(arg, m) << "\n";
 | ||||
|                 fi->insert_entry(args.c_ptr(), value); | ||||
|             } | ||||
|         } | ||||
|          | ||||
|         parameter p(f); | ||||
|         values.set(n->get_root_id(), m.mk_app(get_id(), OP_AS_ARRAY, 1, &p)); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue