src/HOL/Tools/lin_arith.ML
changeset 59498 50b60f501b05
parent 59352 63c02d051661
child 59582 0fbed69ff081
equal deleted inserted replaced
59497:0c5cd369a643 59498:50b60f501b05
   730           (* (except when bound by outermost meta-quantifiers)               *)
   730           (* (except when bound by outermost meta-quantifiers)               *)
   731           no_tac
   731           no_tac
   732       end)
   732       end)
   733   in
   733   in
   734     EVERY' [
   734     EVERY' [
   735       REPEAT_DETERM o eresolve_tac [rev_mp],
   735       REPEAT_DETERM o eresolve_tac ctxt [rev_mp],
   736       cond_split_tac,
   736       cond_split_tac,
   737       resolve_tac @{thms ccontr},
   737       resolve_tac ctxt @{thms ccontr},
   738       prem_nnf_tac ctxt,
   738       prem_nnf_tac ctxt,
   739       TRY o REPEAT_ALL_NEW (DETERM o (eresolve_tac [conjE, exE] ORELSE' eresolve_tac [disjE]))
   739       TRY o REPEAT_ALL_NEW
       
   740         (DETERM o (eresolve_tac ctxt [conjE, exE] ORELSE' eresolve_tac ctxt [disjE]))
   740     ]
   741     ]
   741   end;
   742   end;
   742 
   743 
   743 end;  (* local *)
   744 end;  (* local *)
   744 
   745 
   751   let
   752   let
   752     val split_thms = filter (is_split_thm ctxt) (#splits (get_arith_data ctxt))
   753     val split_thms = filter (is_split_thm ctxt) (#splits (get_arith_data ctxt))
   753     fun is_relevant t = is_some (decomp ctxt t)
   754     fun is_relevant t = is_some (decomp ctxt t)
   754   in
   755   in
   755     DETERM (
   756     DETERM (
   756       TRY (filter_prems_tac is_relevant i)
   757       TRY (filter_prems_tac ctxt is_relevant i)
   757         THEN (
   758         THEN (
   758           (TRY o REPEAT_ALL_NEW (split_once_tac ctxt split_thms))
   759           (TRY o REPEAT_ALL_NEW (split_once_tac ctxt split_thms))
   759             THEN_ALL_NEW
   760             THEN_ALL_NEW
   760               (CONVERSION Drule.beta_eta_conversion
   761               (CONVERSION Drule.beta_eta_conversion
   761                 THEN'
   762                 THEN'
   762               (TRY o (eresolve_tac [notE] THEN' eq_assume_tac)))
   763               (TRY o (eresolve_tac ctxt [notE] THEN' eq_assume_tac)))
   763         ) i
   764         ) i
   764     )
   765     )
   765   end;
   766   end;
   766 
   767 
   767 end;  (* LA_Data *)
   768 end;  (* LA_Data *)
   832 in
   833 in
   833 
   834 
   834 fun refute_tac ctxt test prep_tac ref_tac =
   835 fun refute_tac ctxt test prep_tac ref_tac =
   835   let val refute_prems_tac =
   836   let val refute_prems_tac =
   836         REPEAT_DETERM
   837         REPEAT_DETERM
   837               (eresolve_tac [@{thm conjE}, @{thm exE}] 1 ORELSE
   838               (eresolve_tac ctxt [@{thm conjE}, @{thm exE}] 1 ORELSE
   838                filter_prems_tac test 1 ORELSE
   839                filter_prems_tac ctxt test 1 ORELSE
   839                eresolve_tac @{thms disjE} 1) THEN
   840                eresolve_tac ctxt @{thms disjE} 1) THEN
   840         (DETERM (eresolve_tac @{thms notE} 1 THEN eq_assume_tac 1) ORELSE
   841         (DETERM (eresolve_tac ctxt @{thms notE} 1 THEN eq_assume_tac 1) ORELSE
   841          ref_tac 1);
   842          ref_tac 1);
   842   in EVERY'[TRY o filter_prems_tac test,
   843   in EVERY'[TRY o filter_prems_tac ctxt test,
   843             REPEAT_DETERM o eresolve_tac @{thms rev_mp}, prep_tac,
   844             REPEAT_DETERM o eresolve_tac ctxt @{thms rev_mp}, prep_tac,
   844               resolve_tac @{thms ccontr}, prem_nnf_tac ctxt,
   845               resolve_tac ctxt @{thms ccontr}, prem_nnf_tac ctxt,
   845             SELECT_GOAL (DEPTH_SOLVE refute_prems_tac)]
   846             SELECT_GOAL (DEPTH_SOLVE refute_prems_tac)]
   846   end;
   847   end;
   847 
   848 
   848 end;
   849 end;
   849 
   850 
   873 in
   874 in
   874 
   875 
   875 fun gen_tac ex ctxt =
   876 fun gen_tac ex ctxt =
   876   FIRST' [simple_tac ctxt,
   877   FIRST' [simple_tac ctxt,
   877     Object_Logic.full_atomize_tac ctxt THEN'
   878     Object_Logic.full_atomize_tac ctxt THEN'
   878     (REPEAT_DETERM o resolve_tac [impI]) THEN' raw_tac ctxt ex];
   879     (REPEAT_DETERM o resolve_tac ctxt [impI]) THEN' raw_tac ctxt ex];
   879 
   880 
   880 val tac = gen_tac true;
   881 val tac = gen_tac true;
   881 
   882 
   882 end;
   883 end;
   883 
   884