src/HOL/Tools/function_package/fundef_proof.ML
changeset 21255 617fdb08abe9
parent 21237 b803f9870e97
child 21602 cb13024d0e36
equal deleted inserted replaced
21254:d53f76357f41 21255:617fdb08abe9
    41 val conjunctionD2 = thm "conjunctionD2"
    41 val conjunctionD2 = thm "conjunctionD2"
    42 
    42 
    43 
    43 
    44 fun mk_psimp thy globals R f_iff graph_is_function clause valthm =
    44 fun mk_psimp thy globals R f_iff graph_is_function clause valthm =
    45     let
    45     let
    46   val Globals {domT, z, ...} = globals
    46       val Globals {domT, z, ...} = globals
    47 
    47                                    
    48   val ClauseInfo {qglr = (oqs, _, _, _), cdata = ClauseContext {qs, cqs, gs, lhs, rhs, ags, ...}, ...} = clause
    48       val ClauseInfo {qglr = (oqs, _, _, _), cdata = ClauseContext {qs, cqs, gs, lhs, rhs, ags, ...}, ...} = clause
    49   val lhs_acc = cterm_of thy (Trueprop (mk_acc domT R $ lhs)) (* "acc R lhs" *)
    49       val lhs_acc = cterm_of thy (Trueprop (mk_acc domT R $ lhs)) (* "acc R lhs" *)
    50   val z_smaller = cterm_of thy (Trueprop (R $ z $ lhs)) (* "R z lhs" *)
    50       val z_smaller = cterm_of thy (Trueprop (R $ z $ lhs)) (* "R z lhs" *)
    51     in
    51     in
    52       ((assume z_smaller) RS ((assume lhs_acc) RS acc_downward))
    52       ((assume z_smaller) RS ((assume lhs_acc) RS acc_downward))
    53         |> (fn it => it COMP graph_is_function)
    53         |> (fn it => it COMP graph_is_function)
    54         |> implies_intr z_smaller
    54         |> implies_intr z_smaller
    55         |> forall_intr (cterm_of thy z)
    55         |> forall_intr (cterm_of thy z)
    62 
    62 
    63 
    63 
    64 
    64 
    65 fun mk_partial_induct_rule thy globals R complete_thm clauses =
    65 fun mk_partial_induct_rule thy globals R complete_thm clauses =
    66     let
    66     let
    67   val Globals {domT, x, z, a, P, D, ...} = globals
    67       val Globals {domT, x, z, a, P, D, ...} = globals
    68         val acc_R = mk_acc domT R
    68       val acc_R = mk_acc domT R
    69 
    69                   
    70   val x_D = assume (cterm_of thy (Trueprop (D $ x)))
    70       val x_D = assume (cterm_of thy (Trueprop (D $ x)))
    71   val a_D = cterm_of thy (Trueprop (D $ a))
    71       val a_D = cterm_of thy (Trueprop (D $ a))
    72 
    72                 
    73   val D_subset = cterm_of thy (mk_forall x (implies $ Trueprop (D $ x) $ Trueprop (acc_R $ x)))
    73       val D_subset = cterm_of thy (mk_forall x (implies $ Trueprop (D $ x) $ Trueprop (acc_R $ x)))
    74 
    74                      
    75   val D_dcl = (* "!!x z. [| x: D; (z,x):R |] ==> z:D" *)
    75       val D_dcl = (* "!!x z. [| x: D; (z,x):R |] ==> z:D" *)
    76       mk_forall x
    76                     mk_forall x
    77           (mk_forall z (Logic.mk_implies (Trueprop (D $ x),
    77                     (mk_forall z (Logic.mk_implies (Trueprop (D $ x),
    78                   Logic.mk_implies (Trueprop (R $ z $ x),
    78                                                     Logic.mk_implies (Trueprop (R $ z $ x),
    79                   Trueprop (D $ z)))))
    79                                                                       Trueprop (D $ z)))))
    80           |> cterm_of thy
    80                     |> cterm_of thy
    81 
    81                     
    82 
    82                     
    83   (* Inductive Hypothesis: !!z. (z,x):R ==> P z *)
    83   (* Inductive Hypothesis: !!z. (z,x):R ==> P z *)
    84   val ihyp = all domT $ Abs ("z", domT, 
    84       val ihyp = all domT $ Abs ("z", domT, 
    85            implies $ Trueprop (R $ Bound 0 $ x)
    85                implies $ Trueprop (R $ Bound 0 $ x)
    86              $ Trueprop (P $ Bound 0))
    86              $ Trueprop (P $ Bound 0))
    87            |> cterm_of thy
    87            |> cterm_of thy
    88 
    88 
    89   val aihyp = assume ihyp
    89       val aihyp = assume ihyp
    90 
    90 
    91   fun prove_case clause =
    91   fun prove_case clause =
    92       let
    92       let
    93     val ClauseInfo {cdata = ClauseContext {qs, cqs, ags, gs, lhs, rhs, case_hyp, ...}, RCs, 
    93     val ClauseInfo {cdata = ClauseContext {qs, cqs, ags, gs, lhs, rhs, case_hyp, ...}, RCs, 
    94                     qglr = (oqs, _, _, _), ...} = clause
    94                     qglr = (oqs, _, _, _), ...} = clause
   186       |> Goal.conclude
   186       |> Goal.conclude
   187       |> fold_rev forall_intr_rename (map fst oqs ~~ cqs)
   187       |> fold_rev forall_intr_rename (map fst oqs ~~ cqs)
   188     end
   188     end
   189 
   189 
   190 
   190 
       
   191 fun maybe_mk_domain_intro thy =
       
   192     if !FundefCommon.domintros then mk_domain_intro thy
       
   193     else K (K (K (K refl)))
   191 
   194 
   192 
   195 
   193 fun mk_nest_term_case thy globals R' ihyp clause =
   196 fun mk_nest_term_case thy globals R' ihyp clause =
   194     let
   197     let
   195       val Globals {x, z, ...} = globals
   198       val Globals {x, z, ...} = globals
   294 
   297 
   295 fun mk_partial_rules thy data provedgoal =
   298 fun mk_partial_rules thy data provedgoal =
   296     let
   299     let
   297       val Prep {globals, G, f, R, clauses, values, R_cases, ex1_iff, ...} = data
   300       val Prep {globals, G, f, R, clauses, values, R_cases, ex1_iff, ...} = data
   298                                                                             
   301                                                                             
   299       val _ = Output.debug "Closing Derivation"
   302       val provedgoal = PROFILE "Closing Derivation" Drule.close_derivation provedgoal
   300               
       
   301       val provedgoal = Drule.close_derivation provedgoal
       
   302                        
   303                        
   303       val _ = Output.debug "Getting function theorem"
   304       val graph_is_function = PROFILE "Getting function theorem" (fn x => (x COMP conjunctionD1) |> forall_elim_vars 0) provedgoal
   304               
       
   305       val graph_is_function = (provedgoal COMP conjunctionD1)
       
   306                                 |> forall_elim_vars 0
       
   307                               
   305                               
   308       val _ = Output.debug "Getting cases"
   306       val complete_thm = PROFILE "Getting cases" (curry op COMP provedgoal) conjunctionD2
   309               
   307 
   310       val complete_thm = provedgoal COMP conjunctionD2
   308       val f_iff = PROFILE "Making f_iff" (curry op RS graph_is_function) ex1_iff
   311                          
       
   312       val _ = Output.debug "Making f_iff"
       
   313               
       
   314       val f_iff = (graph_is_function RS ex1_iff) 
       
   315                   
   309                   
   316       val _ = Output.debug "Proving simplification rules"
   310       val psimps = PROFILE "Proving simplification rules" (map2 (mk_psimp thy globals R f_iff graph_is_function)) clauses values
   317       val psimps  = map2 (mk_psimp thy globals R f_iff graph_is_function) clauses values
   311                     
   318                     
   312       val (subset_pinduct, simple_pinduct) = PROFILE "Proving partial induction rule" 
   319       val _ = Output.debug "Proving partial induction rule"
   313                                              (mk_partial_induct_rule thy globals R complete_thm) clauses
   320       val (subset_pinduct, simple_pinduct) = mk_partial_induct_rule thy globals R complete_thm clauses
       
   321                                              
   314                                              
   322       val _ = Output.debug "Proving nested termination rule"
   315       val total_intro = PROFILE "Proving nested termination rule" (mk_nest_term_rule thy globals R R_cases) clauses
   323       val total_intro = mk_nest_term_rule thy globals R R_cases clauses
       
   324                         
   316                         
   325       val _ = Output.debug "Proving domain introduction rules"
   317       val dom_intros = PROFILE "Proving domain introduction rules" (map (maybe_mk_domain_intro thy globals R R_cases)) clauses
   326       val dom_intros = map (mk_domain_intro thy globals R R_cases) clauses
       
   327     in 
   318     in 
   328       FundefResult {f=f, G=G, R=R, completeness=complete_thm, 
   319       FundefResult {f=f, G=G, R=R, completeness=complete_thm, 
   329                     psimps=psimps, subset_pinduct=subset_pinduct, simple_pinduct=simple_pinduct, total_intro=total_intro,
   320                     psimps=psimps, subset_pinduct=subset_pinduct, simple_pinduct=simple_pinduct, total_intro=total_intro,
   330                     dom_intros=dom_intros}
   321                     dom_intros=dom_intros}
   331     end
   322     end