src/Pure/Isar/specification.ML
changeset 45583 93499f36d59a
parent 45390 e29521ef9059
child 45584 41a768a431a6
equal deleted inserted replaced
45582:78f59aaa30ff 45583:93499f36d59a
   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