src/HOL/Tools/Function/function.ML
changeset 52384 80c00a851de5
parent 52383 71df93ff010d
child 53603 59ef06cda7b9
equal deleted inserted replaced
52383:71df93ff010d 52384:80c00a851de5
    92     val ((goal_state, cont), lthy') =
    92     val ((goal_state, cont), lthy') =
    93       Function_Mutual.prepare_function_mutual config defname fixes eqs lthy
    93       Function_Mutual.prepare_function_mutual config defname fixes eqs lthy
    94 
    94 
    95     fun afterqed [[proof]] lthy =
    95     fun afterqed [[proof]] lthy =
    96       let
    96       let
    97         val FunctionResult {fs, R, psimps, simple_pinducts,
    97         val FunctionResult {fs, R, dom, psimps, simple_pinducts,
    98           termination, domintros, cases, ...} =
    98           termination, domintros, cases, ...} =
    99           cont (Thm.close_derivation proof)
    99           cont (Thm.close_derivation proof)
   100 
   100 
   101         val fnames = map (fst o fst) fixes
   101         val fnames = map (fst o fst) fixes
   102         fun qualify n = Binding.name n
   102         fun qualify n = Binding.name n
   120           ||> (case domintros of NONE => I | SOME thms => 
   120           ||> (case domintros of NONE => I | SOME thms => 
   121                    Local_Theory.note ((qualify "domintros", []), thms) #> snd)
   121                    Local_Theory.note ((qualify "domintros", []), thms) #> snd)
   122 
   122 
   123         val info = { add_simps=addsmps, case_names=cnames, psimps=psimps',
   123         val info = { add_simps=addsmps, case_names=cnames, psimps=psimps',
   124           pinducts=snd pinducts', simps=NONE, inducts=NONE, termination=termination',
   124           pinducts=snd pinducts', simps=NONE, inducts=NONE, termination=termination',
   125           fs=fs, R=R, defname=defname, is_partial=true, cases=cases'}
   125           fs=fs, R=R, dom=dom, defname=defname, is_partial=true, cases=cases'}
   126 
   126 
   127         val _ = Proof_Display.print_consts do_print lthy (K false) (map fst fixes)
   127         val _ = Proof_Display.print_consts do_print lthy (K false) (map fst fixes)
   128       in
   128       in
   129         (info,
   129         (info,
   130          lthy |> Local_Theory.declaration {syntax = false, pervasive = false}
   130          lthy |> Local_Theory.declaration {syntax = false, pervasive = false}
   178           (case import_last_function lthy of
   178           (case import_last_function lthy of
   179             SOME info => info
   179             SOME info => info
   180           | NONE => error "Not a function"))
   180           | NONE => error "Not a function"))
   181 
   181 
   182     val { termination, fs, R, add_simps, case_names, psimps,
   182     val { termination, fs, R, add_simps, case_names, psimps,
   183       pinducts, defname, cases, ...} = info
   183       pinducts, defname, cases, dom, ...} = info
   184     val domT = domain_type (fastype_of R)
   184     val domT = domain_type (fastype_of R)
   185     val goal = HOLogic.mk_Trueprop (HOLogic.mk_all ("x", domT, mk_acc domT R $ Free ("x", domT)))
   185     val goal = HOLogic.mk_Trueprop (HOLogic.mk_all ("x", domT, mk_acc domT R $ Free ("x", domT)))
   186     fun afterqed [[totality]] lthy =
   186     fun afterqed [[totality]] lthy =
   187       let
   187       let
   188         val totality = Thm.close_derivation totality
   188         val totality = Thm.close_derivation totality
   201            ((qualify "induct",
   201            ((qualify "induct",
   202              [Attrib.internal (K (Rule_Cases.case_names case_names))]),
   202              [Attrib.internal (K (Rule_Cases.case_names case_names))]),
   203             tinduct)
   203             tinduct)
   204         |-> (fn (simps, (_, inducts)) => fn lthy =>
   204         |-> (fn (simps, (_, inducts)) => fn lthy =>
   205           let val info' = { is_partial=false, defname=defname, add_simps=add_simps,
   205           let val info' = { is_partial=false, defname=defname, add_simps=add_simps,
   206             case_names=case_names, fs=fs, R=R, psimps=psimps, pinducts=pinducts,
   206             case_names=case_names, fs=fs, R=R, dom=dom, psimps=psimps, pinducts=pinducts,
   207             simps=SOME simps, inducts=SOME inducts, termination=termination, cases=cases }
   207             simps=SOME simps, inducts=SOME inducts, termination=termination, cases=cases }
   208           in
   208           in
   209             (info',
   209             (info',
   210              lthy 
   210              lthy 
   211              |> Local_Theory.declaration {syntax = false, pervasive = false}
   211              |> Local_Theory.declaration {syntax = false, pervasive = false}