mirror of
				https://github.com/Z3Prover/z3
				synced 2025-10-31 11:42:28 +00:00 
			
		
		
		
	update proof formats for new core
- update proof format for quantifier instantiation to track original literals
- update proof replay tools with ability to extract proof object
The formats and features are subject to heavy revisions.
Example
```
(set-option :sat.euf true)
(set-option :sat.smt.proof eufproof.smt2)
(declare-fun f (Int) Int)
(declare-const x Int)
(assert (or (= (f (f (f x))) x) (= (f (f x)) x)))
(assert (not (= (f (f (f (f (f (f x)))))) x)))
(check-sat)
```
eufproof.smt2 is:
```
(declare-fun x () Int)
(declare-fun f (Int) Int)
(define-const $24 Int (f x))
(define-const $25 Int (f $24))
(define-const $26 Int (f $25))
(define-const $27 Bool (= $26 x))
(define-const $28 Bool (= $25 x))
(assume $27 $28)
(define-const $30 Int (f $26))
(define-const $31 Int (f $30))
(define-const $32 Int (f $31))
(define-const $33 Bool (= $32 x))
(assume (not $33))
(declare-fun rup () Proof)
(infer (not $33) rup)
(declare-fun euf (Bool Bool Proof Proof Proof Proof) Proof)
(declare-fun cc (Bool) Proof)
(define-const $42 Bool (= $32 $30))
(define-const $43 Proof (cc $42))
(define-const $40 Bool (= $31 $24))
(define-const $41 Proof (cc $40))
(define-const $38 Bool (= $30 $25))
(define-const $39 Proof (cc $38))
(define-const $36 Bool (= $24 $26))
(define-const $37 Proof (cc $36))
(define-const $34 Bool (not $33))
(define-const $44 Proof (euf $34 $28 $37 $39 $41 $43))
(infer (not $28) $33 $44)
(infer (not $28) rup)
(infer $27 rup)
(declare-fun euf (Bool Bool Proof Proof Proof) Proof)
(define-const $49 Bool (= $32 $26))
(define-const $50 Proof (cc $49))
(define-const $47 Bool (= $31 $25))
(define-const $48 Proof (cc $47))
(define-const $45 Bool (= $24 $30))
(define-const $46 Proof (cc $45))
(define-const $51 Proof (euf $34 $27 $46 $48 $50))
(infer $33 $51)
(infer rup)
```
Example of inspecting proof from Python:
```
from z3 import *
def parse(file):
    s = Solver()
    set_option("solver.proof.save", True)
    set_option("solver.proof.check", False)
    s.from_file(file)
    for step in s.proof().children():
        print(step)
parse("../eufproof.smt2")
```
Proof checking (self-validation) is on by default.
Proof saving is off by default.
You can use the proof logs and the proof terms to retrieve quantifier instantiations from the new core.
The self-checker contains a few built-in tuned checkers but falls back to self-checking inferred clauses using SMT.
			
			
This commit is contained in:
		
							parent
							
								
									9782d4a730
								
							
						
					
					
						commit
						107981f099
					
				
					 40 changed files with 295 additions and 153 deletions
				
			
		|  | @ -27,6 +27,7 @@ Revision History: | |||
| #include "solver/solver_na2as.h" | ||||
| #include "muz/fp/dl_cmds.h" | ||||
| #include "opt/opt_cmds.h" | ||||
| #include "cmd_context/extra_cmds/proof_cmds.h" | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|  | @ -42,6 +43,7 @@ extern "C" { | |||
|             ast_manager& m = c.m(); | ||||
|             ctx = alloc(cmd_context, false, &(m)); | ||||
|             install_dl_cmds(*ctx.get()); | ||||
|             install_proof_cmds(*ctx.get()); | ||||
|             install_opt_cmds(*ctx.get()); | ||||
|             install_smt2_extra_cmds(*ctx.get());             | ||||
|             ctx->register_plist(); | ||||
|  | @ -175,6 +177,7 @@ extern "C" { | |||
|         ast_manager& m = mk_c(c)->m(); | ||||
|         scoped_ptr<cmd_context> ctx = alloc(cmd_context, false, &(m)); | ||||
|         install_dl_cmds(*ctx.get()); | ||||
|         install_proof_cmds(*ctx.get()); | ||||
|         install_opt_cmds(*ctx.get()); | ||||
|         install_smt2_extra_cmds(*ctx.get()); | ||||
|         ctx->register_plist(); | ||||
|  | @ -233,6 +236,7 @@ extern "C" { | |||
|             auto* ctx = alloc(cmd_context, false, &(mk_c(c)->m())); | ||||
|             mk_c(c)->cmd() = ctx; | ||||
|             install_dl_cmds(*ctx); | ||||
|             install_proof_cmds(*ctx); | ||||
|             install_opt_cmds(*ctx); | ||||
|             install_smt2_extra_cmds(*ctx); | ||||
|             ctx->register_plist(); | ||||
|  |  | |||
|  | @ -43,6 +43,7 @@ Revision History: | |||
| #include "sat/sat_solver.h" | ||||
| #include "sat/tactic/goal2sat.h" | ||||
| #include "sat/tactic/sat2goal.h" | ||||
| #include "cmd_context/extra_cmds/proof_cmds.h" | ||||
| 
 | ||||
| 
 | ||||
| extern "C" { | ||||
|  | @ -257,8 +258,10 @@ extern "C" { | |||
| 
 | ||||
|     void solver_from_stream(Z3_context c, Z3_solver s, std::istream& is) { | ||||
|         auto& solver = *to_solver(s); | ||||
|         if (!solver.m_cmd_context)  | ||||
|         if (!solver.m_cmd_context) { | ||||
|             solver.m_cmd_context = alloc(cmd_context, false, &(mk_c(c)->m())); | ||||
|             install_proof_cmds(*solver.m_cmd_context);             | ||||
|         } | ||||
|         auto& ctx = solver.m_cmd_context; | ||||
|         ctx->set_ignore_check(true); | ||||
|         std::stringstream errstrm; | ||||
|  | @ -270,6 +273,7 @@ extern "C" { | |||
|             return; | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
|         bool initialized = to_solver(s)->m_solver.get() != nullptr; | ||||
|         if (!initialized) | ||||
|             init_solver(c, s); | ||||
|  | @ -277,6 +281,10 @@ extern "C" { | |||
|             to_solver(s)->assert_expr(e); | ||||
|         ctx->reset_tracked_assertions(); | ||||
|         to_solver_ref(s)->set_model_converter(ctx->get_model_converter()); | ||||
|         auto* ctx_s = ctx->get_solver(); | ||||
|         if (ctx_s && ctx_s->get_proof()) | ||||
|             to_solver_ref(s)->set_proof(ctx_s->get_proof()); | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     static void solver_from_dimacs_stream(Z3_context c, Z3_solver s, std::istream& is) { | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue