mirror of
				https://github.com/Z3Prover/z3
				synced 2025-11-04 13:29:11 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			88 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			88 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/*++
 | 
						|
Copyright (c) 2012 Microsoft Corporation
 | 
						|
 | 
						|
Module Name:
 | 
						|
 | 
						|
    qfnra_nlsat_tactic.h
 | 
						|
 | 
						|
Abstract:
 | 
						|
 | 
						|
    Tactic based on nlsat for solving QF_NRA problems
 | 
						|
 | 
						|
Author:
 | 
						|
 | 
						|
    Leonardo (leonardo) 2012-01-23
 | 
						|
 | 
						|
Notes:
 | 
						|
 | 
						|
--*/
 | 
						|
#include "tactic/tactical.h"
 | 
						|
 | 
						|
#include "tactic/core/tseitin_cnf_tactic.h"
 | 
						|
#include "tactic/arith/degree_shift_tactic.h"
 | 
						|
#include "tactic/arith/purify_arith_tactic.h"
 | 
						|
#include "nlsat/tactic/nlsat_tactic.h"
 | 
						|
#include "tactic/arith/factor_tactic.h"
 | 
						|
#include "tactic/core/simplify_tactic.h"
 | 
						|
#include "tactic/core/elim_uncnstr_tactic.h"
 | 
						|
#include "tactic/core/propagate_values_tactic.h"
 | 
						|
#include "tactic/core/solve_eqs_tactic.h"
 | 
						|
#include "tactic/core/elim_term_ite_tactic.h"
 | 
						|
 | 
						|
tactic * mk_qfnra_nlsat_tactic(ast_manager & m, params_ref const & p) {
 | 
						|
    params_ref main_p = p;
 | 
						|
    main_p.set_bool("elim_and", true);
 | 
						|
    main_p.set_bool("blast_distinct", true);
 | 
						|
    params_ref purify_p = p;
 | 
						|
    purify_p.set_bool("complete", false); // temporary hack, solver does not support uninterpreted functions for encoding (div0 x) applications. So, we replace it application of this kind with an uninterpreted function symbol.
 | 
						|
 | 
						|
    tactic * factor;
 | 
						|
    if (p.get_bool("factor", true))
 | 
						|
        factor = mk_factor_tactic(m, p);
 | 
						|
    else
 | 
						|
        factor = mk_skip_tactic();
 | 
						|
 | 
						|
    tactic * report = mk_report_verbose_tactic("(qfnra-nlsat-tactic)", 10);
 | 
						|
 | 
						|
    tactic * simplify_base1 = mk_simplify_tactic(m, p);
 | 
						|
    tactic * simplify_main1 = using_params(simplify_base1, main_p);
 | 
						|
    tactic * purify_base1 = mk_purify_arith_tactic(m, p);
 | 
						|
    tactic * purify_main1 = using_params(purify_base1, purify_p);
 | 
						|
    tactic * propagate_values = mk_propagate_values_tactic(m, p);
 | 
						|
    tactic * solve_eqs1 = mk_solve_eqs_tactic(m, p);
 | 
						|
    tactic * elim_unc = mk_elim_uncnstr_tactic(m, p);
 | 
						|
    tactic * elim_term_ite = mk_elim_term_ite_tactic(m, p);
 | 
						|
    tactic * purify_base2 = mk_purify_arith_tactic(m, p);
 | 
						|
    tactic * purify_main2 = using_params(purify_base2, purify_p);
 | 
						|
 | 
						|
    tactic * preprocessing = and_then(
 | 
						|
        simplify_main1,
 | 
						|
        purify_main1,
 | 
						|
        propagate_values,
 | 
						|
        solve_eqs1,
 | 
						|
        elim_unc,
 | 
						|
        elim_term_ite,
 | 
						|
        purify_main2);
 | 
						|
 | 
						|
    tactic * solve_eqs2 = mk_solve_eqs_tactic(m, p);
 | 
						|
    tactic * purify_base3 = mk_purify_arith_tactic(m, p);
 | 
						|
    tactic * purify_main3 = using_params(purify_base3, purify_p);
 | 
						|
    tactic * simplify_base2 = mk_simplify_tactic(m, p);
 | 
						|
    tactic * simplify_main2 = using_params(simplify_base2, main_p);
 | 
						|
    tactic * tseitin = mk_tseitin_cnf_core_tactic(m, p);
 | 
						|
    tactic * simplify_base3 = mk_simplify_tactic(m, p);
 | 
						|
    tactic * simplify_main3 = using_params(simplify_base3, main_p);
 | 
						|
    tactic * nlsat = mk_nlsat_tactic(m, p);
 | 
						|
 | 
						|
    tactic * post = and_then(
 | 
						|
        /* mk_degree_shift_tactic(m, p), */ // may affect full dimensionality detection
 | 
						|
        factor,
 | 
						|
        solve_eqs2,
 | 
						|
        purify_main3,
 | 
						|
        simplify_main2,
 | 
						|
        tseitin,
 | 
						|
        simplify_main3,
 | 
						|
        nlsat);
 | 
						|
 | 
						|
    return and_then(report, preprocessing, post);
 | 
						|
}
 |