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') |