mirror of
				https://github.com/Z3Prover/z3
				synced 2025-11-04 13:29:11 +00:00 
			
		
		
		
	deal with cancellation in qe for #6500
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
		
							parent
							
								
									ecf25a4fe2
								
							
						
					
					
						commit
						603597a22e
					
				
					 1 changed files with 17 additions and 15 deletions
				
			
		| 
						 | 
					@ -1437,13 +1437,12 @@ namespace qe {
 | 
				
			||||||
                res = m_solver.check();
 | 
					                res = m_solver.check();
 | 
				
			||||||
                if (res == l_true && has_uninterpreted(m, m_fml))
 | 
					                if (res == l_true && has_uninterpreted(m, m_fml))
 | 
				
			||||||
                    res = l_undef;
 | 
					                    res = l_undef;
 | 
				
			||||||
                if (res == l_true) {
 | 
					                if (res == l_true)
 | 
				
			||||||
 | 
					                    res = final_check();
 | 
				
			||||||
 | 
					                if (res == l_true)
 | 
				
			||||||
                    is_sat = true;
 | 
					                    is_sat = true;
 | 
				
			||||||
                    final_check();
 | 
					                else 
 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
                else {
 | 
					 | 
				
			||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (res == l_undef) {
 | 
					            if (res == l_undef) {
 | 
				
			||||||
                free_vars.append(num_vars, vars);
 | 
					                free_vars.append(num_vars, vars);
 | 
				
			||||||
| 
						 | 
					@ -1501,30 +1500,33 @@ namespace qe {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private:
 | 
					    private:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        void final_check() {
 | 
					        lbool final_check() {
 | 
				
			||||||
            model_ref model;            
 | 
					            model_ref model;            
 | 
				
			||||||
            m_solver.get_model(model);
 | 
					            m_solver.get_model(model);
 | 
				
			||||||
 | 
					            if (!model)
 | 
				
			||||||
 | 
					                return l_undef;
 | 
				
			||||||
            scoped_ptr<model_evaluator> model_eval = alloc(model_evaluator, *model);
 | 
					            scoped_ptr<model_evaluator> model_eval = alloc(model_evaluator, *model);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            while (true) {
 | 
					            while (m.inc()) {
 | 
				
			||||||
                TRACE("qe", model_v2_pp(tout, *model););
 | 
					                TRACE("qe", model_v2_pp(tout, *model););
 | 
				
			||||||
                while (can_propagate_assignment(*model_eval)) {
 | 
					                while (can_propagate_assignment(*model_eval)) 
 | 
				
			||||||
                    propagate_assignment(*model_eval);
 | 
					                    propagate_assignment(*model_eval);
 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
                VERIFY(CHOOSE_VAR == update_current(*model_eval, true));
 | 
					                VERIFY(CHOOSE_VAR == update_current(*model_eval, true));
 | 
				
			||||||
                SASSERT(m_current->fml());
 | 
					                SASSERT(m_current->fml());
 | 
				
			||||||
                if (l_true != m_solver.check()) {
 | 
					                if (l_true != m_solver.check()) {
 | 
				
			||||||
                    return;
 | 
					                    return l_true;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                m_solver.get_model(model);
 | 
					                m_solver.get_model(model);
 | 
				
			||||||
                model_eval = alloc(model_evaluator, *model);
 | 
					                model_eval = alloc(model_evaluator, *model);
 | 
				
			||||||
                search_tree* st = m_current;
 | 
					                search_tree* st = m_current;
 | 
				
			||||||
                update_current(*model_eval, false);
 | 
					                update_current(*model_eval, false);
 | 
				
			||||||
                if (st == m_current) {
 | 
					                if (st == m_current) 
 | 
				
			||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					            if (!m.inc())
 | 
				
			||||||
 | 
					                return l_undef;
 | 
				
			||||||
            pop(*model_eval);
 | 
					            pop(*model_eval);
 | 
				
			||||||
 | 
					            return l_true;            
 | 
				
			||||||
        } 
 | 
					        } 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ast_manager& get_manager() override { return m; }
 | 
					        ast_manager& get_manager() override { return m; }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue