equal
deleted
inserted
replaced
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); |