mirror of
				https://github.com/Z3Prover/z3
				synced 2025-10-30 19:22:28 +00:00 
			
		
		
		
	Merge branch 'unstable' of https://github.com/mschlaipfer/z3 into unstable
This commit is contained in:
		
						commit
						d8dc86f558
					
				
					 10 changed files with 28 additions and 29 deletions
				
			
		|  | @ -86,7 +86,7 @@ int counter::get_max_counter_value() const { | ||||||
|     return res; |     return res; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void var_counter::count_vars(ast_manager & m, const app * pred, int coef) { | void var_counter::count_vars(const app * pred, int coef) { | ||||||
|     unsigned n = pred->get_num_args(); |     unsigned n = pred->get_num_args(); | ||||||
|     for (unsigned i = 0; i < n; i++) { |     for (unsigned i = 0; i < n; i++) { | ||||||
|         m_fv(pred->get_arg(i)); |         m_fv(pred->get_arg(i)); | ||||||
|  |  | ||||||
|  | @ -76,7 +76,7 @@ protected: | ||||||
|     unsigned get_max_var(bool & has_var);     |     unsigned get_max_var(bool & has_var);     | ||||||
| public: | public: | ||||||
|     var_counter() {} |     var_counter() {} | ||||||
|     void count_vars(ast_manager & m, const app * t, int coef = 1); |     void count_vars(const app * t, int coef = 1); | ||||||
|     unsigned get_max_var(expr* e); |     unsigned get_max_var(expr* e); | ||||||
|     unsigned get_next_var(expr* e); |     unsigned get_next_var(expr* e); | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | @ -682,11 +682,11 @@ namespace datalog { | ||||||
|         svector<bool> tail_neg; |         svector<bool> tail_neg; | ||||||
|         app_ref head(r->get_head(), m); |         app_ref head(r->get_head(), m); | ||||||
| 
 | 
 | ||||||
|         vctr.count_vars(m, head); |         vctr.count_vars(head); | ||||||
| 
 | 
 | ||||||
|         for (unsigned i = 0; i < ut_len; i++) { |         for (unsigned i = 0; i < ut_len; i++) { | ||||||
|             app * t = r->get_tail(i); |             app * t = r->get_tail(i); | ||||||
|             vctr.count_vars(m, t); |             vctr.count_vars(t); | ||||||
|             tail.push_back(t); |             tail.push_back(t); | ||||||
|             tail_neg.push_back(r->is_neg_tail(i)); |             tail_neg.push_back(r->is_neg_tail(i)); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  | @ -256,12 +256,12 @@ namespace datalog { | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|      |      | ||||||
|     void rule_counter::count_rule_vars(ast_manager & m, const rule * r, int coef) { |     void rule_counter::count_rule_vars(const rule * r, int coef) { | ||||||
|         reset(); |         reset(); | ||||||
|         count_vars(m, r->get_head(), 1); |         count_vars(r->get_head(), 1); | ||||||
|         unsigned n = r->get_tail_size(); |         unsigned n = r->get_tail_size(); | ||||||
|         for (unsigned i = 0; i < n; i++) { |         for (unsigned i = 0; i < n; i++) { | ||||||
|             count_vars(m, r->get_tail(i), coef); |             count_vars(r->get_tail(i), coef); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -347,7 +347,7 @@ namespace datalog { | ||||||
|     class rule_counter : public var_counter {         |     class rule_counter : public var_counter {         | ||||||
|     public: |     public: | ||||||
|         rule_counter(){} |         rule_counter(){} | ||||||
|         void count_rule_vars(ast_manager & m, const rule * r, int coef = 1); |         void count_rule_vars(const rule * r, int coef = 1); | ||||||
|         unsigned get_max_rule_var(const rule& r); |         unsigned get_max_rule_var(const rule& r); | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -411,17 +411,16 @@ namespace datalog { | ||||||
| 
 | 
 | ||||||
|     void compiler::get_local_indexes_for_projection(rule * r, unsigned_vector & res) { |     void compiler::get_local_indexes_for_projection(rule * r, unsigned_vector & res) { | ||||||
|         SASSERT(r->get_positive_tail_size()==2); |         SASSERT(r->get_positive_tail_size()==2); | ||||||
|         ast_manager & m = m_context.get_manager(); |  | ||||||
|         rule_counter counter; |         rule_counter counter; | ||||||
|         // leave one column copy per var in the head (avoids later duplication)
 |         // leave one column copy per var in the head (avoids later duplication)
 | ||||||
|         counter.count_vars(m, r->get_head(), -1); |         counter.count_vars(r->get_head(), -1); | ||||||
| 
 | 
 | ||||||
|         // take interp & neg preds into account (at least 1 column copy if referenced)
 |         // take interp & neg preds into account (at least 1 column copy if referenced)
 | ||||||
|         unsigned n = r->get_tail_size(); |         unsigned n = r->get_tail_size(); | ||||||
|         if (n > 2) { |         if (n > 2) { | ||||||
|           rule_counter counter_tail; |           rule_counter counter_tail; | ||||||
|           for (unsigned i = 2; i < n; ++i) { |           for (unsigned i = 2; i < n; ++i) { | ||||||
|             counter_tail.count_vars(m, r->get_tail(i)); |             counter_tail.count_vars(r->get_tail(i)); | ||||||
|           } |           } | ||||||
| 
 | 
 | ||||||
|           rule_counter::iterator I = counter_tail.begin(), E = counter_tail.end(); |           rule_counter::iterator I = counter_tail.begin(), E = counter_tail.end(); | ||||||
|  | @ -434,8 +433,8 @@ namespace datalog { | ||||||
| 
 | 
 | ||||||
|         app * t1 = r->get_tail(0); |         app * t1 = r->get_tail(0); | ||||||
|         app * t2 = r->get_tail(1); |         app * t2 = r->get_tail(1); | ||||||
|         counter.count_vars(m, t1); |         counter.count_vars(t1); | ||||||
|         counter.count_vars(m, t2); |         counter.count_vars(t2); | ||||||
| 
 | 
 | ||||||
|         get_local_indexes_for_projection(t1, counter, 0, res); |         get_local_indexes_for_projection(t1, counter, 0, res); | ||||||
|         get_local_indexes_for_projection(t2, counter, t1->get_num_args(), res); |         get_local_indexes_for_projection(t2, counter, t1->get_num_args(), res); | ||||||
|  |  | ||||||
|  | @ -705,7 +705,7 @@ namespace datalog { | ||||||
| 
 | 
 | ||||||
|     rule * mk_explanations::get_e_rule(rule * r) { |     rule * mk_explanations::get_e_rule(rule * r) { | ||||||
|         rule_counter ctr; |         rule_counter ctr; | ||||||
|         ctr.count_rule_vars(m_manager, r); |         ctr.count_rule_vars(r); | ||||||
|         unsigned max_var; |         unsigned max_var; | ||||||
|         unsigned next_var = ctr.get_max_positive(max_var) ? (max_var+1) : 0; |         unsigned next_var = ctr.get_max_positive(max_var) ? (max_var+1) : 0; | ||||||
|         unsigned head_var = next_var++; |         unsigned head_var = next_var++; | ||||||
|  |  | ||||||
|  | @ -381,7 +381,7 @@ namespace datalog { | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         rule_counter ctr; |         rule_counter ctr; | ||||||
|         ctr.count_rule_vars(m_manager, r); |         ctr.count_rule_vars(r); | ||||||
|         unsigned max_var_idx, new_var_idx_base; |         unsigned max_var_idx, new_var_idx_base; | ||||||
|         if (ctr.get_max_positive(max_var_idx)) { |         if (ctr.get_max_positive(max_var_idx)) { | ||||||
|             new_var_idx_base = max_var_idx+1; |             new_var_idx_base = max_var_idx+1; | ||||||
|  |  | ||||||
|  | @ -316,7 +316,7 @@ namespace datalog { | ||||||
| 
 | 
 | ||||||
|         void register_rule(rule * r) { |         void register_rule(rule * r) { | ||||||
|             rule_counter counter; |             rule_counter counter; | ||||||
|             counter.count_rule_vars(m, r, 1); |             counter.count_rule_vars(r, 1); | ||||||
| 
 | 
 | ||||||
|             ptr_vector<app> & rule_content =  |             ptr_vector<app> & rule_content =  | ||||||
|                 m_rules_content.insert_if_not_there2(r, ptr_vector<app>())->get_data().m_value; |                 m_rules_content.insert_if_not_there2(r, ptr_vector<app>())->get_data().m_value; | ||||||
|  | @ -329,19 +329,19 @@ namespace datalog { | ||||||
|             for(unsigned i=0; i+1 < pos_tail_size; i++) { |             for(unsigned i=0; i+1 < pos_tail_size; i++) { | ||||||
|                 app * t1 = r->get_tail(i); |                 app * t1 = r->get_tail(i); | ||||||
|                 var_idx_set t1_vars = rm.collect_vars(t1); |                 var_idx_set t1_vars = rm.collect_vars(t1); | ||||||
|                 counter.count_vars(m, t1, -1);  //temporarily remove t1 variables from counter
 |                 counter.count_vars(t1, -1);  //temporarily remove t1 variables from counter
 | ||||||
|                 for(unsigned j=i+1; j<pos_tail_size; j++) { |                 for(unsigned j=i+1; j<pos_tail_size; j++) { | ||||||
|                     app * t2 = r->get_tail(j); |                     app * t2 = r->get_tail(j); | ||||||
|                     counter.count_vars(m, t2, -1);  //temporarily remove t2 variables from counter
 |                     counter.count_vars(t2, -1);  //temporarily remove t2 variables from counter
 | ||||||
|                     var_idx_set scope_vars = rm.collect_vars(t2); |                     var_idx_set scope_vars = rm.collect_vars(t2); | ||||||
|                     scope_vars |= t1_vars; |                     scope_vars |= t1_vars; | ||||||
|                     var_idx_set non_local_vars; |                     var_idx_set non_local_vars; | ||||||
|                     counter.collect_positive(non_local_vars); |                     counter.collect_positive(non_local_vars); | ||||||
|                     counter.count_vars(m, t2, 1);  //restore t2 variables in counter
 |                     counter.count_vars(t2, 1);  //restore t2 variables in counter
 | ||||||
|                     set_intersection(non_local_vars, scope_vars); |                     set_intersection(non_local_vars, scope_vars); | ||||||
|                     register_pair(t1, t2, r, non_local_vars); |                     register_pair(t1, t2, r, non_local_vars); | ||||||
|                 } |                 } | ||||||
|                 counter.count_vars(m, t1, 1);  //restore t1 variables in counter
 |                 counter.count_vars(t1, 1);  //restore t1 variables in counter
 | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  | @ -460,16 +460,16 @@ namespace datalog { | ||||||
|             app * head = r->get_head(); |             app * head = r->get_head(); | ||||||
| 
 | 
 | ||||||
|             var_counter counter; |             var_counter counter; | ||||||
|             counter.count_vars(m, head, 1); |             counter.count_vars(head, 1); | ||||||
| 
 | 
 | ||||||
|             unsigned tail_size=r->get_tail_size(); |             unsigned tail_size=r->get_tail_size(); | ||||||
|             unsigned pos_tail_size=r->get_positive_tail_size(); |             unsigned pos_tail_size=r->get_positive_tail_size(); | ||||||
| 
 | 
 | ||||||
|             for(unsigned i=pos_tail_size; i<tail_size; i++) { |             for(unsigned i=pos_tail_size; i<tail_size; i++) { | ||||||
|                 counter.count_vars(m, r->get_tail(i), 1); |                 counter.count_vars(r->get_tail(i), 1); | ||||||
|             } |             } | ||||||
|             for(unsigned i=0; i<len; i++) { |             for(unsigned i=0; i<len; i++) { | ||||||
|                 counter.count_vars(m, rule_content[i], 1); |                 counter.count_vars(rule_content[i], 1); | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             //add edges that contain added tails
 |             //add edges that contain added tails
 | ||||||
|  | @ -477,7 +477,7 @@ namespace datalog { | ||||||
|                 app * a_tail = added_tails.back();  //added tail
 |                 app * a_tail = added_tails.back();  //added tail
 | ||||||
| 
 | 
 | ||||||
|                 var_idx_set a_tail_vars = rm.collect_vars(a_tail); |                 var_idx_set a_tail_vars = rm.collect_vars(a_tail); | ||||||
|                 counter.count_vars(m, a_tail, -1);  //temporarily remove a_tail variables from counter
 |                 counter.count_vars(a_tail, -1);  //temporarily remove a_tail variables from counter
 | ||||||
| 
 | 
 | ||||||
|                 for(unsigned i=0; i<len; i++) { |                 for(unsigned i=0; i<len; i++) { | ||||||
|                     app * o_tail = rule_content[i]; //other tail
 |                     app * o_tail = rule_content[i]; //other tail
 | ||||||
|  | @ -486,17 +486,17 @@ namespace datalog { | ||||||
|                         continue; |                         continue; | ||||||
|                     } |                     } | ||||||
| 
 | 
 | ||||||
|                     counter.count_vars(m, o_tail, -1);  //temporarily remove o_tail variables from counter
 |                     counter.count_vars(o_tail, -1);  //temporarily remove o_tail variables from counter
 | ||||||
|                     var_idx_set scope_vars = rm.collect_vars(o_tail); |                     var_idx_set scope_vars = rm.collect_vars(o_tail); | ||||||
|                     scope_vars |= a_tail_vars; |                     scope_vars |= a_tail_vars; | ||||||
|                     var_idx_set non_local_vars; |                     var_idx_set non_local_vars; | ||||||
|                     counter.collect_positive(non_local_vars); |                     counter.collect_positive(non_local_vars); | ||||||
|                     counter.count_vars(m, o_tail, 1);  //restore o_tail variables in counter
 |                     counter.count_vars(o_tail, 1);  //restore o_tail variables in counter
 | ||||||
|                     set_intersection(non_local_vars, scope_vars); |                     set_intersection(non_local_vars, scope_vars); | ||||||
| 
 | 
 | ||||||
|                     register_pair(o_tail, a_tail, r, non_local_vars); |                     register_pair(o_tail, a_tail, r, non_local_vars); | ||||||
|                 } |                 } | ||||||
|                 counter.count_vars(m, a_tail, 1);  //restore t1 variables in counter
 |                 counter.count_vars(a_tail, 1);  //restore t1 variables in counter
 | ||||||
|                 added_tails.pop_back(); |                 added_tails.pop_back(); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  | @ -93,7 +93,7 @@ namespace datalog { | ||||||
|         unsigned n = head_pred->get_arity(); |         unsigned n = head_pred->get_arity(); | ||||||
|          |          | ||||||
|         rm.get_counter().reset(); |         rm.get_counter().reset(); | ||||||
|         rm.get_counter().count_vars(m, head, 1); |         rm.get_counter().count_vars(head, 1); | ||||||
| 
 | 
 | ||||||
|         for (unsigned i=0; i<n; i++) { |         for (unsigned i=0; i<n; i++) { | ||||||
|             expr * arg = head->get_arg(i); |             expr * arg = head->get_arg(i); | ||||||
|  | @ -125,7 +125,7 @@ namespace datalog { | ||||||
|         unsigned head_arity = head_pred->get_arity(); |         unsigned head_arity = head_pred->get_arity(); | ||||||
| 
 | 
 | ||||||
|         rm.get_counter().reset(); |         rm.get_counter().reset(); | ||||||
|         rm.get_counter().count_vars(m, head); |         rm.get_counter().count_vars(head); | ||||||
| 
 | 
 | ||||||
|         unsigned arg_index; |         unsigned arg_index; | ||||||
|         for (arg_index = 0; arg_index < head_arity; arg_index++) { |         for (arg_index = 0; arg_index < head_arity; arg_index++) { | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue