41 if length insts = l then () |
41 if length insts = l then () |
42 else error ("Bad number of instantiations for " ^ string_of_int l ^ " rules"); |
42 else error ("Bad number of instantiations for " ^ string_of_int l ^ " rules"); |
43 |
43 |
44 fun subst inst concl = |
44 fun subst inst concl = |
45 let |
45 let |
46 val vars = InductAttrib.vars_of concl; |
46 val vars = Induct.vars_of concl; |
47 val m = length vars and n = length inst; |
47 val m = length vars and n = length inst; |
48 val _ = if m >= n + 2 then () else error "Too few variables in conclusion of rule"; |
48 val _ = if m >= n + 2 then () else error "Too few variables in conclusion of rule"; |
49 val P :: x :: ys = vars; |
49 val P :: x :: ys = vars; |
50 val zs = Library.drop (m - n - 2, ys); |
50 val zs = Library.drop (m - n - 2, ys); |
51 in |
51 in |
85 fun nominal_induct_tac ctxt def_insts avoiding fixings rules facts = |
85 fun nominal_induct_tac ctxt def_insts avoiding fixings rules facts = |
86 let |
86 let |
87 val thy = ProofContext.theory_of ctxt; |
87 val thy = ProofContext.theory_of ctxt; |
88 val cert = Thm.cterm_of thy; |
88 val cert = Thm.cterm_of thy; |
89 |
89 |
90 val ((insts, defs), defs_ctxt) = fold_map InductMethod.add_defs def_insts ctxt |>> split_list; |
90 val ((insts, defs), defs_ctxt) = fold_map Induct.add_defs def_insts ctxt |>> split_list; |
91 val atomized_defs = map (map (Conv.fconv_rule ObjectLogic.atomize)) defs; |
91 val atomized_defs = map (map (Conv.fconv_rule ObjectLogic.atomize)) defs; |
92 |
92 |
93 val finish_rule = |
93 val finish_rule = |
94 split_all_tuples |
94 split_all_tuples |
95 #> rename_params_rule true (map (ProofContext.revert_skolem defs_ctxt o fst) avoiding); |
95 #> rename_params_rule true (map (ProofContext.revert_skolem defs_ctxt o fst) avoiding); |
96 fun rule_cases r = RuleCases.make_nested true (Thm.prop_of r) (InductMethod.rulified_term r); |
96 fun rule_cases r = RuleCases.make_nested true (Thm.prop_of r) (Induct.rulified_term r); |
97 in |
97 in |
98 (fn i => fn st => |
98 (fn i => fn st => |
99 rules |
99 rules |
100 |> inst_mutual_rule ctxt insts avoiding |
100 |> inst_mutual_rule ctxt insts avoiding |
101 |> RuleCases.consume (List.concat defs) facts |
101 |> RuleCases.consume (List.concat defs) facts |
102 |> Seq.maps (fn (((cases, concls), (more_consumes, more_facts)), rule) => |
102 |> Seq.maps (fn (((cases, concls), (more_consumes, more_facts)), rule) => |
103 (PRECISE_CONJUNCTS (length concls) (ALLGOALS (fn j => |
103 (PRECISE_CONJUNCTS (length concls) (ALLGOALS (fn j => |
104 (CONJUNCTS (ALLGOALS |
104 (CONJUNCTS (ALLGOALS |
105 (Method.insert_tac (more_facts @ nth_list atomized_defs (j - 1)) |
105 (Method.insert_tac (more_facts @ nth_list atomized_defs (j - 1)) |
106 THEN' InductMethod.fix_tac defs_ctxt |
106 THEN' Induct.fix_tac defs_ctxt |
107 (nth concls (j - 1) + more_consumes) |
107 (nth concls (j - 1) + more_consumes) |
108 (nth_list fixings (j - 1)))) |
108 (nth_list fixings (j - 1)))) |
109 THEN' InductMethod.inner_atomize_tac) j)) |
109 THEN' Induct.inner_atomize_tac) j)) |
110 THEN' InductMethod.atomize_tac) i st |> Seq.maps (fn st' => |
110 THEN' Induct.atomize_tac) i st |> Seq.maps (fn st' => |
111 InductMethod.guess_instance |
111 Induct.guess_instance |
112 (finish_rule (InductMethod.internalize more_consumes rule)) i st' |
112 (finish_rule (Induct.internalize more_consumes rule)) i st' |
113 |> Seq.maps (fn rule' => |
113 |> Seq.maps (fn rule' => |
114 CASES (rule_cases rule' cases) |
114 CASES (rule_cases rule' cases) |
115 (Tactic.rtac (rename_params_rule false [] rule') i THEN |
115 (Tactic.rtac (rename_params_rule false [] rule') i THEN |
116 PRIMITIVE (singleton (ProofContext.export defs_ctxt ctxt))) st')))) |
116 PRIMITIVE (singleton (ProofContext.export defs_ctxt ctxt))) st')))) |
117 THEN_ALL_NEW_CASES InductMethod.rulify_tac |
117 THEN_ALL_NEW_CASES Induct.rulify_tac |
118 end; |
118 end; |
119 |
119 |
120 |
120 |
121 (* concrete syntax *) |
121 (* concrete syntax *) |
122 |
122 |