src/HOL/Tools/Function/function.ML
changeset 52383 71df93ff010d
parent 51717 9e7d1c139569
child 52384 80c00a851de5
equal deleted inserted replaced
52381:63eec9cea2c7 52383:71df93ff010d
   103           |> Binding.qualify true defname
   103           |> Binding.qualify true defname
   104         val conceal_partial = if partials then I else Binding.conceal
   104         val conceal_partial = if partials then I else Binding.conceal
   105 
   105 
   106         val addsmps = add_simps fnames post sort_cont
   106         val addsmps = add_simps fnames post sort_cont
   107 
   107 
   108         val (((psimps', [pinducts']), (_, [termination'])), lthy) =
   108         val ((((psimps', [pinducts']), [termination']), [cases']), lthy) =
   109           lthy
   109           lthy
   110           |> addsmps (conceal_partial o Binding.qualify false "partial")
   110           |> addsmps (conceal_partial o Binding.qualify false "partial")
   111                "psimps" conceal_partial psimp_attribs psimps
   111                "psimps" conceal_partial psimp_attribs psimps
   112           ||>> Local_Theory.notes [((conceal_partial (qualify "pinduct"), []),
   112           ||>> Local_Theory.notes [((conceal_partial (qualify "pinduct"), []),
   113                 simple_pinducts |> map (fn th => ([th],
   113                 simple_pinducts |> map (fn th => ([th],
   114                  [Attrib.internal (K (Rule_Cases.case_names cnames)),
   114                  [Attrib.internal (K (Rule_Cases.case_names cnames)),
   115                   Attrib.internal (K (Rule_Cases.consumes (1 - Thm.nprems_of th))),
   115                   Attrib.internal (K (Rule_Cases.consumes (1 - Thm.nprems_of th))),
   116                   Attrib.internal (K (Induct.induct_pred ""))])))]
   116                   Attrib.internal (K (Induct.induct_pred ""))])))]
   117           ||>> Local_Theory.note ((Binding.conceal (qualify "termination"), []), [termination])
   117           ||>> (apfst snd o Local_Theory.note ((Binding.conceal (qualify "termination"), []), [termination]))
   118           ||> (snd o Local_Theory.note ((qualify "cases",
   118           ||>> (apfst snd o Local_Theory.note ((qualify "cases",
   119                  [Attrib.internal (K (Rule_Cases.case_names cnames))]), [cases]))
   119                  [Attrib.internal (K (Rule_Cases.case_names cnames))]), [cases]))
   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 }
   125           fs=fs, R=R, 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, ...} = info
   183       pinducts, defname, cases, ...} = 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
   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, psimps=psimps, pinducts=pinducts,
   207             simps=SOME simps, inducts=SOME inducts, termination=termination }
   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}
   212                (add_function_data o transform_function_data info')
   212                (add_function_data o transform_function_data info')