307 let |
307 let |
308 val (propp, elems_ctxt) = prep_stmt elems (map snd shows) ctxt; |
308 val (propp, elems_ctxt) = prep_stmt elems (map snd shows) ctxt; |
309 val prems = Assumption.local_prems_of elems_ctxt ctxt; |
309 val prems = Assumption.local_prems_of elems_ctxt ctxt; |
310 val stmt = Attrib.map_specs (map prep_att) (map fst shows ~~ propp); |
310 val stmt = Attrib.map_specs (map prep_att) (map fst shows ~~ propp); |
311 val goal_ctxt = (fold o fold) (Variable.auto_fixes o fst) propp elems_ctxt; |
311 val goal_ctxt = (fold o fold) (Variable.auto_fixes o fst) propp elems_ctxt; |
312 in ((prems, stmt, NONE), goal_ctxt) end |
312 in (([], prems, stmt, NONE), goal_ctxt) end |
313 | Element.Obtains obtains => |
313 | Element.Obtains obtains => |
314 let |
314 let |
315 val case_names = obtains |> map_index (fn (i, (b, _)) => |
315 val case_names = obtains |> map_index (fn (i, (b, _)) => |
316 if Binding.is_empty b then string_of_int (i + 1) else Variable.check_name b); |
316 if Binding.is_empty b then string_of_int (i + 1) else Variable.check_name b); |
317 val constraints = obtains |> map (fn (_, (vars, _)) => |
317 val constraints = obtains |> map (fn (_, (vars, _)) => |
330 val props = map fst asms; |
330 val props = map fst asms; |
331 val (Ts, _) = ctxt' |
331 val (Ts, _) = ctxt' |
332 |> fold Variable.declare_term props |
332 |> fold Variable.declare_term props |
333 |> fold_map Proof_Context.inferred_param xs; |
333 |> fold_map Proof_Context.inferred_param xs; |
334 val asm = Term.list_all_free (xs ~~ Ts, Logic.list_implies (props, thesis)); |
334 val asm = Term.list_all_free (xs ~~ Ts, Logic.list_implies (props, thesis)); |
|
335 val _ = ctxt' |> Proof_Context.add_fixes (map (fn b => (b, NONE, NoSyn)) bs); |
335 in |
336 in |
336 ctxt' |> (snd o Proof_Context.add_fixes (map (fn b => (b, NONE, NoSyn)) bs)); |
337 ctxt' |
337 ctxt' |> Variable.auto_fixes asm |
338 |> Variable.auto_fixes asm |
338 |> Proof_Context.add_assms_i Assumption.assume_export |
339 |> Proof_Context.add_assms_i Assumption.assume_export |
339 [((name, [Context_Rules.intro_query NONE]), [(asm, [])])] |
340 [((name, [Context_Rules.intro_query NONE]), [(asm, [])])] |
340 |>> (fn [(_, [th])] => th) |
341 |>> (fn [(_, [th])] => th) |
341 end; |
342 end; |
342 |
343 |
343 val atts = map (Attrib.internal o K) |
344 val more_atts = map (Attrib.internal o K) |
344 [Rule_Cases.consumes (~ (length obtains)), Rule_Cases.case_names case_names]; |
345 [Rule_Cases.consumes (~ (length obtains)), Rule_Cases.case_names case_names]; |
345 val prems = Assumption.local_prems_of elems_ctxt ctxt; |
346 val prems = Assumption.local_prems_of elems_ctxt ctxt; |
346 val stmt = [((Binding.empty, atts), [(thesis, [])])]; |
347 val stmt = [((Binding.empty, []), [(thesis, [])])]; |
347 |
348 |
348 val (facts, goal_ctxt) = elems_ctxt |
349 val (facts, goal_ctxt) = elems_ctxt |
349 |> (snd o Proof_Context.add_fixes [(Binding.name Auto_Bind.thesisN, NONE, NoSyn)]) |
350 |> (snd o Proof_Context.add_fixes [(Binding.name Auto_Bind.thesisN, NONE, NoSyn)]) |
350 |> fold_map assume_case (obtains ~~ propp) |
351 |> fold_map assume_case (obtains ~~ propp) |
351 |-> (fn ths => |
352 |-> (fn ths => |
352 Proof_Context.note_thmss "" [((Binding.name Obtain.thatN, []), [(ths, [])])] #> |
353 Proof_Context.note_thmss "" [((Binding.name Obtain.thatN, []), [(ths, [])])] #> |
353 #2 #> pair ths); |
354 #2 #> pair ths); |
354 in ((prems, stmt, SOME facts), goal_ctxt) end); |
355 in ((more_atts, prems, stmt, SOME facts), goal_ctxt) end); |
355 |
356 |
356 structure Theorem_Hook = Generic_Data |
357 structure Theorem_Hook = Generic_Data |
357 ( |
358 ( |
358 type T = ((bool -> Proof.state -> Proof.state) * stamp) list; |
359 type T = ((bool -> Proof.state -> Proof.state) * stamp) list; |
359 val empty = []; |
360 val empty = []; |
366 let |
367 let |
367 val _ = Local_Theory.affirm lthy; |
368 val _ = Local_Theory.affirm lthy; |
368 val thy = Proof_Context.theory_of lthy; |
369 val thy = Proof_Context.theory_of lthy; |
369 |
370 |
370 val attrib = prep_att thy; |
371 val attrib = prep_att thy; |
371 val atts = map attrib raw_atts; |
|
372 val elems = raw_elems |> map (Element.map_ctxt_attrib attrib); |
372 val elems = raw_elems |> map (Element.map_ctxt_attrib attrib); |
373 val ((prems, stmt, facts), goal_ctxt) = |
373 val ((more_atts, prems, stmt, facts), goal_ctxt) = |
374 prep_statement attrib prep_stmt elems raw_concl lthy; |
374 prep_statement attrib prep_stmt elems raw_concl lthy; |
|
375 val atts = more_atts @ map attrib raw_atts; |
375 |
376 |
376 fun after_qed' results goal_ctxt' = |
377 fun after_qed' results goal_ctxt' = |
377 let val results' = |
378 let val results' = |
378 burrow (map Goal.norm_result o Proof_Context.export goal_ctxt' lthy) results |
379 burrow (map Goal.norm_result o Proof_Context.export goal_ctxt' lthy) results |
379 in |
380 in |