@@ -7,13 +7,13 @@ use z3::{
77} ;
88use z3rro:: {
99 model:: InstrumentedModel ,
10- prover:: { ProveResult , Prover } ,
10+ prover:: { ProveResult , Prover , ProverCommandError } ,
1111 util:: ReasonUnknown ,
1212} ;
1313
1414use crate :: {
1515 ast:: { ExprBuilder , Span } ,
16- resource_limits:: { LimitError , LimitsRef } ,
16+ resource_limits:: LimitsRef ,
1717 slicing:: {
1818 model:: { SliceMode , SliceModel } ,
1919 util:: { PartialMinimizeResult , SubsetExploration } ,
@@ -232,7 +232,7 @@ impl<'ctx> SliceSolver<'ctx> {
232232 . check_proof_assuming ( & active_toggle_values) ;
233233
234234 let mut slice_searcher = SliceModelSearch :: new ( active_toggle_values. clone ( ) ) ;
235- if let ProveResult :: Proof = res {
235+ if let Ok ( ProveResult :: Proof ) = res {
236236 slice_searcher. found_active ( self . prover . get_unsat_core ( ) ) ;
237237 }
238238
@@ -322,14 +322,18 @@ impl<'ctx> SliceSolver<'ctx> {
322322
323323 slice_sat_binary_search ( & mut self . prover , & active_toggle_values, options, limits_ref) ?;
324324 let res = self . prover . check_proof ( ) ;
325- let slice_model = if let ProveResult :: Counterexample ( model) = & res {
326- let slice_model =
327- SliceModel :: from_model ( SliceMode :: Error , & self . slice_stmts , selection, model) ;
328- Some ( slice_model)
329- } else {
330- None
331- } ;
332- Ok ( ( res, slice_model) )
325+
326+ match res {
327+ Err ( err) => Err ( VerifyError :: ProverError ( err) ) ,
328+ Ok ( prove_result) => match & prove_result {
329+ ProveResult :: Counterexample ( model) => {
330+ let slice_model =
331+ SliceModel :: from_model ( SliceMode :: Error , & self . slice_stmts , selection, & model) ;
332+ Ok ( ( prove_result, Some ( slice_model) ) )
333+ } ,
334+ _ => Ok ( ( prove_result, None ) ) ,
335+ }
336+ }
333337 }
334338}
335339
@@ -551,36 +555,39 @@ pub fn slice_next_extremal_set<'ctx>(
551555 prover : & mut Prover < ' ctx > ,
552556 options : & SliceSolveOptions ,
553557 limits_ref : & LimitsRef ,
554- ) -> Result < Option < ExtremalSet < ' ctx > > , LimitError > {
558+ ) -> Result < Option < ExtremalSet < ' ctx > > , VerifyError > {
555559 let all_variables = exploration. variables ( ) . clone ( ) ;
556560
557561 while let Some ( seed) = exploration. next_set ( ) {
558562 limits_ref. check_limits ( ) ?;
559563
560564 match check_proof_seed ( prover, limits_ref, & seed) {
561- ProveResult :: Proof => {
565+ Ok ( ProveResult :: Proof ) => {
562566 let seed = unsat_core_to_seed ( prover, & all_variables) ;
563567
564568 // now start the shrinking, then block up
565- let res = exploration. shrink_block_up ( seed, |seed| {
566- match check_proof_seed ( prover, limits_ref, seed) {
567- ProveResult :: Proof => Some ( unsat_core_to_seed ( prover, & all_variables) ) ,
568- ProveResult :: Counterexample ( _) | ProveResult :: Unknown ( _) => None ,
569- }
570- } ) ;
569+ let res_seed = match check_proof_seed ( prover, limits_ref, & seed) {
570+ Ok ( ProveResult :: Proof ) => Some ( unsat_core_to_seed ( prover, & all_variables) ) ,
571+ Ok ( ProveResult :: Counterexample ( _) ) | Ok ( ProveResult :: Unknown ( _) ) => None ,
572+ Err ( err) => return Err ( VerifyError :: ProverError ( err) ) ,
573+ } ;
574+
575+ let res = exploration. shrink_block_up ( seed, |_| res_seed. clone ( ) ) ;
571576 return Ok ( Some ( ExtremalSet :: MinimalUnsat ( res) ) ) ;
572577 }
573- ProveResult :: Counterexample ( _) => {
578+ Ok ( ProveResult :: Counterexample ( _) ) => {
574579 // grow the counterexample and then block down
575- let res = exploration. grow_block_down ( seed, |seed| {
576- match check_proof_seed ( prover, limits_ref, seed) {
577- ProveResult :: Counterexample ( _) => true ,
578- ProveResult :: Proof | ProveResult :: Unknown ( _) => false ,
579- }
580- } ) ;
580+
581+ let res_seed = match check_proof_seed ( prover, limits_ref, & seed) {
582+ Ok ( ProveResult :: Counterexample ( _) ) => true ,
583+ Ok ( ProveResult :: Proof ) | Ok ( ProveResult :: Unknown ( _) ) => false ,
584+ Err ( err) => return Err ( VerifyError :: ProverError ( err) ) ,
585+ } ;
586+
587+ let res = exploration. grow_block_down ( seed, |_| res_seed) ;
581588 return Ok ( Some ( ExtremalSet :: MaximalSat ( res) ) ) ;
582589 }
583- ProveResult :: Unknown ( _) => {
590+ Ok ( ProveResult :: Unknown ( _) ) => {
584591 if options. continue_on_unknown {
585592 // for seeds that result in unknown, just block them to
586593 // ensure progress.
@@ -589,6 +596,7 @@ pub fn slice_next_extremal_set<'ctx>(
589596 return Ok ( None ) ;
590597 }
591598 }
599+ Err ( err) => return Err ( VerifyError :: ProverError ( err) ) ,
592600 }
593601 }
594602 Ok ( None )
@@ -599,7 +607,7 @@ fn check_proof_seed<'ctx>(
599607 prover : & mut Prover < ' ctx > ,
600608 limits_ref : & LimitsRef ,
601609 seed : & HashSet < Bool < ' ctx > > ,
602- ) -> ProveResult < ' ctx > {
610+ ) -> Result < ProveResult < ' ctx > , ProverCommandError > {
603611 let mut timeout = Duration :: from_millis ( 100 ) ;
604612 if let Some ( time_left) = limits_ref. time_left ( ) {
605613 timeout = timeout. min ( time_left) ;
0 commit comments