45 val type_rules = NetRules.init eq_rule (Thm.concl_of o #2); |
45 val type_rules = NetRules.init eq_rule (Thm.concl_of o #2); |
46 val set_rules = NetRules.init eq_rule (Thm.major_prem_of o #2); |
46 val set_rules = NetRules.init eq_rule (Thm.major_prem_of o #2); |
47 |
47 |
48 fun lookup_rule (rs:rules) name = Library.assoc (NetRules.rules rs, name); |
48 fun lookup_rule (rs:rules) name = Library.assoc (NetRules.rules rs, name); |
49 |
49 |
50 fun print_rules kind rs = |
50 fun print_rules kind sg rs = |
51 let val thms = map snd (NetRules.rules rs) |
51 let val thms = map snd (NetRules.rules rs) |
52 in Pretty.writeln (Pretty.big_list kind (map Display.pretty_thm thms)) end; |
52 in Pretty.writeln (Pretty.big_list kind (map (Display.pretty_thm_sg sg) thms)) end; |
53 |
53 |
54 |
54 |
55 (* theory data kind 'HOL/induct_method' *) |
55 (* theory data kind 'HOL/induct_method' *) |
56 |
56 |
57 structure GlobalInductArgs = |
57 structure GlobalInductArgs = |
65 fun merge (((casesT1, casesS1), (inductT1, inductS1)), |
65 fun merge (((casesT1, casesS1), (inductT1, inductS1)), |
66 ((casesT2, casesS2), (inductT2, inductS2))) = |
66 ((casesT2, casesS2), (inductT2, inductS2))) = |
67 ((NetRules.merge (casesT1, casesT2), NetRules.merge (casesS1, casesS2)), |
67 ((NetRules.merge (casesT1, casesT2), NetRules.merge (casesS1, casesS2)), |
68 (NetRules.merge (inductT1, inductT2), NetRules.merge (inductS1, inductS2))); |
68 (NetRules.merge (inductT1, inductT2), NetRules.merge (inductS1, inductS2))); |
69 |
69 |
70 fun print _ ((casesT, casesS), (inductT, inductS)) = |
70 fun print sg ((casesT, casesS), (inductT, inductS)) = |
71 (print_rules "type cases:" casesT; |
71 (print_rules "type cases:" sg casesT; |
72 print_rules "set cases:" casesS; |
72 print_rules "set cases:" sg casesS; |
73 print_rules "type induct:" inductT; |
73 print_rules "type induct:" sg inductT; |
74 print_rules "set induct:" inductS); |
74 print_rules "set induct:" sg inductS); |
75 |
75 |
76 fun dest ((casesT, casesS), (inductT, inductS)) = |
76 fun dest ((casesT, casesS), (inductT, inductS)) = |
77 {type_cases = NetRules.rules casesT, |
77 {type_cases = NetRules.rules casesT, |
78 set_cases = NetRules.rules casesS, |
78 set_cases = NetRules.rules casesS, |
79 type_induct = NetRules.rules inductT, |
79 type_induct = NetRules.rules inductT, |
91 struct |
91 struct |
92 val name = "HOL/induct_method"; |
92 val name = "HOL/induct_method"; |
93 type T = GlobalInductArgs.T; |
93 type T = GlobalInductArgs.T; |
94 |
94 |
95 fun init thy = GlobalInduct.get thy; |
95 fun init thy = GlobalInduct.get thy; |
96 fun print x = GlobalInductArgs.print x; |
96 val print = GlobalInductArgs.print o ProofContext.sign_of; |
97 end; |
97 end; |
98 |
98 |
99 structure LocalInduct = ProofDataFun(LocalInductArgs); |
99 structure LocalInduct = ProofDataFun(LocalInductArgs); |
100 val print_local_rules = LocalInduct.print; |
100 val print_local_rules = LocalInduct.print; |
101 val dest_local_rules = GlobalInductArgs.dest o LocalInduct.get; |
101 val dest_local_rules = GlobalInductArgs.dest o LocalInduct.get; |