| author | wenzelm |
| Wed, 26 Mar 2008 22:40:10 +0100 | |
| changeset 26418 | 02709831944a |
| parent 25589 | 9385f043b910 |
| child 26644 | 2f12191282e2 |
| permissions | -rw-r--r-- |
| 25589 | 1 |
(* Title: HOL/Tools/function_package/induction_scheme.ML |
2 |
ID: $Id$ |
|
3 |
Author: Alexander Krauss, TU Muenchen |
|
4 |
||
5 |
A method to prove induction schemes. |
|
6 |
*) |
|
|
25567
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
7 |
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
8 |
signature INDUCTION_SCHEME = |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
9 |
sig |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
10 |
val mk_ind_tac : Proof.context -> thm list -> tactic |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
11 |
val setup : theory -> theory |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
12 |
end |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
13 |
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
14 |
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
15 |
structure InductionScheme : INDUCTION_SCHEME = |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
16 |
struct |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
17 |
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
18 |
open FundefLib |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
19 |
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
20 |
type rec_call_info = (string * typ) list * term list * term |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
21 |
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
22 |
datatype scheme_case = |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
23 |
SchemeCase of |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
24 |
{
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
25 |
qs: (string * typ) list, |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
26 |
gs: term list, |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
27 |
lhs: term, |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
28 |
rs: rec_call_info list |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
29 |
} |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
30 |
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
31 |
datatype ind_scheme = |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
32 |
IndScheme of |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
33 |
{
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
34 |
T: typ, |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
35 |
cases: scheme_case list |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
36 |
} |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
37 |
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
38 |
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
39 |
fun mk_relT T = HOLogic.mk_setT (HOLogic.mk_prodT (T, T)) |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
40 |
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
41 |
fun dest_hhf ctxt t = |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
42 |
let |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
43 |
val (ctxt', vars, imp) = dest_all_all_ctx ctxt t |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
44 |
in |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
45 |
(ctxt', vars, Logic.strip_imp_prems imp, Logic.strip_imp_concl imp) |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
46 |
end |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
47 |
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
48 |
fun mk_case P ctxt premise = |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
49 |
let |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
50 |
val (ctxt', qs, prems, concl) = dest_hhf ctxt premise |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
51 |
val _ $ (_ $ lhs) = concl |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
52 |
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
53 |
fun mk_rcinfo pr = |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
54 |
let |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
55 |
val (ctxt'', Gvs, Gas, _ $ (_ $ rcarg)) = dest_hhf ctxt' pr |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
56 |
in |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
57 |
(Gvs, Gas, rcarg) |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
58 |
end |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
59 |
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
60 |
val (gs, rcprs) = take_prefix (not o exists_aterm (fn Free v => v = P | _ => false)) prems |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
61 |
in |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
62 |
SchemeCase {qs=qs, gs=gs, lhs=lhs, rs=map mk_rcinfo rcprs}
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
63 |
end |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
64 |
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
65 |
fun mk_scheme' ctxt cases (Pn, PT) = |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
66 |
IndScheme {T=domain_type PT, cases=map (mk_case (Pn,PT) ctxt) cases }
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
67 |
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
68 |
fun mk_completeness ctxt (IndScheme {T, cases}) =
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
69 |
let |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
70 |
val allqnames = fold (fn SchemeCase {qs, ...} => fold (insert (op =) o Free) qs) cases []
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
71 |
val [Pbool, x] = map Free (Variable.variant_frees ctxt allqnames [("P", HOLogic.boolT), ("x", T)])
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
72 |
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
73 |
fun mk_case (SchemeCase {qs, gs, lhs, ...}) =
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
74 |
HOLogic.mk_Trueprop Pbool |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
75 |
|> curry Logic.mk_implies (HOLogic.mk_Trueprop (HOLogic.mk_eq (x, lhs))) |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
76 |
|> fold_rev (curry Logic.mk_implies) gs |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
77 |
|> fold_rev (mk_forall o Free) qs |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
78 |
in |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
79 |
HOLogic.mk_Trueprop Pbool |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
80 |
|> fold_rev (curry Logic.mk_implies o mk_case) cases |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
81 |
|> mk_forall_rename ("x", x)
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
82 |
|> mk_forall_rename ("P", Pbool)
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
83 |
end |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
84 |
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
85 |
fun mk_wf ctxt R (IndScheme {T, ...}) =
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
86 |
HOLogic.Trueprop $ (Const (@{const_name "wf"}, mk_relT T --> HOLogic.boolT) $ R)
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
87 |
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
88 |
fun mk_ineqs R (IndScheme {T, cases}) =
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
89 |
let |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
90 |
fun f (SchemeCase {qs, gs, lhs, rs, ...}) =
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
91 |
let |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
92 |
fun g (Gvs, Gas, rcarg) = |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
93 |
HOLogic.mk_mem (HOLogic.mk_prod (rcarg, lhs), R) |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
94 |
|> HOLogic.mk_Trueprop |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
95 |
|> fold_rev (curry Logic.mk_implies) Gas |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
96 |
|> fold_rev (curry Logic.mk_implies) gs |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
97 |
|> fold_rev (mk_forall o Free) Gvs |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
98 |
|> fold_rev (mk_forall o Free) qs |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
99 |
in |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
100 |
map g rs |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
101 |
end |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
102 |
in |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
103 |
map f cases |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
104 |
end |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
105 |
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
106 |
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
107 |
fun mk_induct_rule thy R complete_thm wf_thm ineqss (IndScheme {T, cases=scases}) =
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
108 |
let |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
109 |
val x = Free ("x", T)
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
110 |
val P = Free ("P", T --> HOLogic.boolT)
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
111 |
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
112 |
val cert = cterm_of thy |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
113 |
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
114 |
(* Inductive Hypothesis: !!z. (z,x):R ==> P z *) |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
115 |
val ihyp = all T $ Abs ("z", T,
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
116 |
implies $ |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
117 |
HOLogic.mk_Trueprop ( |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
118 |
Const ("op :", HOLogic.mk_prodT (T, T) --> mk_relT T --> HOLogic.boolT)
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
119 |
$ (HOLogic.pair_const T T $ Bound 0 $ x) |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
120 |
$ R) |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
121 |
$ HOLogic.mk_Trueprop (P $ Bound 0)) |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
122 |
|> cert |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
123 |
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
124 |
val aihyp = assume ihyp |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
125 |
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
126 |
fun prove_case (SchemeCase {qs, gs, lhs, rs, ...}) ineqs =
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
127 |
let |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
128 |
val case_hyp = assume (cert (HOLogic.Trueprop $ (HOLogic.mk_eq (x, lhs)))) |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
129 |
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
130 |
val cqs = map (cert o Free) qs |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
131 |
val ags = map (assume o cert) gs |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
132 |
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
133 |
val replace_x_ss = HOL_basic_ss addsimps [case_hyp] |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
134 |
val sih = full_simplify replace_x_ss aihyp |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
135 |
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
136 |
fun mk_Prec (Gvs, Gas, rcarg) ineq = |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
137 |
let |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
138 |
val cGas = map (assume o cert) Gas |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
139 |
val cGvs = map (cert o Free) Gvs |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
140 |
val loc_ineq = ineq |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
141 |
|> fold forall_elim (cqs @ cGvs) |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
142 |
|> fold Thm.elim_implies (ags @ cGas) |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
143 |
in |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
144 |
sih |> forall_elim (cert rcarg) |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
145 |
|> Thm.elim_implies loc_ineq |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
146 |
|> fold_rev (implies_intr o cprop_of) cGas |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
147 |
|> fold_rev forall_intr cGvs |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
148 |
end |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
149 |
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
150 |
val P_recs = map2 mk_Prec rs ineqs (* [P rec1, P rec2, ... ] *) |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
151 |
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
152 |
val step = HOLogic.mk_Trueprop (P $ lhs) |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
153 |
|> fold_rev (curry Logic.mk_implies o prop_of) P_recs |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
154 |
|> fold_rev (curry Logic.mk_implies) gs |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
155 |
|> fold_rev (mk_forall o Free) qs |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
156 |
|> cert |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
157 |
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
158 |
val res = assume step |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
159 |
|> fold forall_elim cqs |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
160 |
|> fold Thm.elim_implies ags |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
161 |
|> fold Thm.elim_implies P_recs |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
162 |
|> Conv.fconv_rule |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
163 |
(Conv.arg_conv (Conv.arg_conv (K (Thm.symmetric (case_hyp RS eq_reflection))))) |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
164 |
(* "P x" *) |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
165 |
|> implies_intr (cprop_of case_hyp) |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
166 |
|> fold_rev (implies_intr o cprop_of) ags |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
167 |
|> fold_rev forall_intr cqs |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
168 |
in |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
169 |
(res, step) |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
170 |
end |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
171 |
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
172 |
val (cases, steps) = split_list (map2 prove_case scases ineqss) |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
173 |
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
174 |
val istep = complete_thm |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
175 |
|> forall_elim (cert (P $ x)) |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
176 |
|> forall_elim (cert x) |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
177 |
|> fold (Thm.elim_implies) cases |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
178 |
|> implies_intr ihyp |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
179 |
|> forall_intr (cert x) (* "!!x. (!!y<x. P y) ==> P x" *) |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
180 |
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
181 |
val induct_rule = |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
182 |
@{thm "wf_induct_rule"}
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
183 |
|> (curry op COMP) wf_thm |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
184 |
|> (curry op COMP) istep |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
185 |
|> fold_rev implies_intr steps |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
186 |
|> forall_intr (cert P) |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
187 |
in |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
188 |
induct_rule |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
189 |
end |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
190 |
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
191 |
fun mk_ind_tac ctxt facts = (ALLGOALS (Method.insert_tac facts)) THEN HEADGOAL |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
192 |
(SUBGOAL (fn (t, i) => |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
193 |
let |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
194 |
val (ctxt', _, cases, concl) = dest_hhf ctxt t |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
195 |
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
196 |
fun get_types t = |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
197 |
let |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
198 |
val (P, vs) = strip_comb (HOLogic.dest_Trueprop t) |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
199 |
val Ts = map fastype_of vs |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
200 |
val tupT = foldr1 HOLogic.mk_prodT Ts |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
201 |
in |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
202 |
((P, Ts), tupT) |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
203 |
end |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
204 |
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
205 |
val concls = Logic.dest_conjunction_list (Logic.strip_imp_concl concl) |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
206 |
val (PTss, tupTs) = split_list (map get_types concls) |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
207 |
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
208 |
val n = length tupTs |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
209 |
val ST = BalancedTree.make (uncurry SumTree.mk_sumT) tupTs |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
210 |
val PsumT = ST --> HOLogic.boolT |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
211 |
val Psum = ("Psum", PsumT)
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
212 |
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
213 |
fun mk_rews (i, (P, Ts)) = |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
214 |
let |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
215 |
val vs = map_index (fn (j,T) => Free ("x" ^ string_of_int j, T)) Ts
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
216 |
val t = Free Psum $ SumTree.mk_inj ST n (i + 1) (foldr1 HOLogic.mk_prod vs) |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
217 |
|> fold_rev lambda vs |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
218 |
in |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
219 |
(P, t) |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
220 |
end |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
221 |
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
222 |
val rews = map_index mk_rews PTss |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
223 |
val thy = ProofContext.theory_of ctxt' |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
224 |
val cases' = map (Pattern.rewrite_term thy rews []) cases |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
225 |
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
226 |
val scheme = mk_scheme' ctxt' cases' Psum |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
227 |
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
228 |
val cert = cterm_of thy |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
229 |
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
230 |
val R = Free ("R", mk_relT ST)
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
231 |
val ineqss = mk_ineqs R scheme |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
232 |
|> map (map (assume o cert)) |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
233 |
val complete = mk_completeness ctxt scheme |> cert |> assume |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
234 |
val wf_thm = mk_wf ctxt R scheme |> cert |> assume |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
235 |
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
236 |
val indthm = mk_induct_rule thy R complete wf_thm ineqss scheme |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
237 |
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
238 |
fun mk_P (P, Ts) = |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
239 |
let |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
240 |
val avars = map_index (fn (i,T) => Var (("a", i), T)) Ts
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
241 |
val atup = foldr1 HOLogic.mk_prod avars |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
242 |
in |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
243 |
tupled_lambda atup (list_comb (P, avars)) |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
244 |
end |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
245 |
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
246 |
val case_exp = cert (SumTree.mk_sumcases HOLogic.boolT (map mk_P PTss)) |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
247 |
val acases = map (assume o cert) cases |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
248 |
val indthm' = indthm |> forall_elim case_exp |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
249 |
|> full_simplify SumTree.sumcase_split_ss |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
250 |
|> fold Thm.elim_implies acases |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
251 |
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
252 |
fun project (i,t) = |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
253 |
let |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
254 |
val (P, vs) = strip_comb (HOLogic.dest_Trueprop t) |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
255 |
val inst = cert (SumTree.mk_inj ST n (i + 1) (foldr1 HOLogic.mk_prod vs)) |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
256 |
in |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
257 |
indthm' |> Drule.instantiate' [] [SOME inst] |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
258 |
|> simplify SumTree.sumcase_split_ss |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
259 |
end |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
260 |
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
261 |
val res = Conjunction.intr_balanced (map_index project concls) |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
262 |
|> fold_rev (implies_intr o cprop_of) acases |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
263 |
|> forall_elim_vars 0 |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
264 |
in |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
265 |
(fn st => |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
266 |
Drule.compose_single (res, i, st) |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
267 |
|> fold_rev (implies_intr o cprop_of) (complete :: wf_thm :: flat ineqss) |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
268 |
|> forall_intr (cert R) |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
269 |
|> forall_elim_vars 0 |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
270 |
|> Seq.single |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
271 |
) |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
272 |
end)) |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
273 |
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
274 |
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
275 |
val setup = Method.add_methods |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
276 |
[("induct_scheme", Method.ctxt_args (Method.RAW_METHOD o mk_ind_tac),
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
277 |
"proves an induction principle")] |
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
278 |
|
|
5720345ea689
experimental version of automated induction scheme generator (cf. HOL/ex/Induction_Scheme.thy)
krauss
parents:
diff
changeset
|
279 |
end |