src/Pure/Isar/proof.ML
changeset 36322 81cba3921ba5
parent 35624 c4e29a0bb8c1
child 36323 655e2d74de3a
equal deleted inserted replaced
36321:58d4dc6000fc 36322:81cba3921ba5
   788 
   788 
   789 (* generic goals *)
   789 (* generic goals *)
   790 
   790 
   791 local
   791 local
   792 
   792 
   793 fun implicit_vars dest add props =
   793 val is_var =
   794   let
   794   can (dest_TVar o Logic.dest_type o Logic.dest_term) orf
   795     val (explicit_vars, props') = take_prefix (can dest) props |>> map dest;
   795   can (dest_Var o Logic.dest_term);
   796     val vars = rev (subtract (op =) explicit_vars (fold add props []));
   796 
   797     val _ =
   797 fun implicit_vars props =
   798       if null vars then ()
   798   let
   799       else warning ("Goal statement contains unbound schematic variable(s): " ^
   799     val (var_props, props') = take_prefix is_var props;
   800         commas_quote (map (Term.string_of_vname o fst) vars));
   800     val explicit_vars = fold Term.add_vars var_props [];
   801   in (rev vars, props') end;
   801     val vars = filter_out (member (op =) explicit_vars) (fold Term.add_vars props []);
       
   802   in map (Logic.mk_term o Var) vars end;
   802 
   803 
   803 fun refine_terms n =
   804 fun refine_terms n =
   804   refine (Method.Basic (K (RAW_METHOD
   805   refine (Method.Basic (K (RAW_METHOD
   805     (K (HEADGOAL (PRECISE_CONJUNCTS n
   806     (K (HEADGOAL (PRECISE_CONJUNCTS n
   806       (HEADGOAL (CONJUNCTS (ALLGOALS (rtac Drule.termI))))))))))
   807       (HEADGOAL (CONJUNCTS (ALLGOALS (rtac Drule.termI))))))))))
   821       |> enter_forward
   822       |> enter_forward
   822       |> open_block
   823       |> open_block
   823       |> map_context_result (fn ctxt => swap (prepp (ctxt, raw_propp)));
   824       |> map_context_result (fn ctxt => swap (prepp (ctxt, raw_propp)));
   824     val props = flat propss;
   825     val props = flat propss;
   825 
   826 
   826     val (_, props') =
   827     val vars = implicit_vars props;
   827       implicit_vars (dest_TVar o Logic.dest_type o Logic.dest_term) Term.add_tvars props;
   828     val propss' = vars :: propss;
   828     val (vars, _) = implicit_vars (dest_Var o Logic.dest_term) Term.add_vars props';
       
   829 
       
   830     val propss' = map (Logic.mk_term o Var) vars :: propss;
       
   831     val goal_propss = filter_out null propss';
   829     val goal_propss = filter_out null propss';
   832     val goal =
   830     val goal =
   833       cert (Logic.mk_conjunction_balanced (map Logic.mk_conjunction_balanced goal_propss))
   831       cert (Logic.mk_conjunction_balanced (map Logic.mk_conjunction_balanced goal_propss))
   834       |> Thm.weaken_sorts (Variable.sorts_of (context_of goal_state));
   832       |> Thm.weaken_sorts (Variable.sorts_of (context_of goal_state));
   835     val statement = ((kind, pos), propss', Thm.term_of goal);
   833     val statement = ((kind, pos), propss', Thm.term_of goal);