7 |
7 |
8 See Ch. Paulin-Mohring, Inductive Definitions in the System Coq. |
8 See Ch. Paulin-Mohring, Inductive Definitions in the System Coq. |
9 Research Report 92-49, LIP, ENS Lyon. Dec 1992. |
9 Research Report 92-49, LIP, ENS Lyon. Dec 1992. |
10 *) |
10 *) |
11 |
11 |
12 structure Acc = Inductive_Fun |
12 open Acc; |
13 (val thy = WF.thy |> add_consts [("acc","i=>i",NoSyn)] |
|
14 val thy_name = "Acc" |
|
15 val rec_doms = [("acc", "field(r)")] |
|
16 val sintrs = ["[| r-``{a}: Pow(acc(r)); a: field(r) |] ==> a: acc(r)"] |
|
17 val monos = [Pow_mono] |
|
18 val con_defs = [] |
|
19 val type_intrs = [] |
|
20 val type_elims = []); |
|
21 |
13 |
22 (*The introduction rule must require a:field(r) |
14 (*The introduction rule must require a:field(r) |
23 Otherwise acc(r) would be a proper class! *) |
15 Otherwise acc(r) would be a proper class! *) |
24 |
16 |
|
17 (*The intended introduction rule*) |
|
18 val prems = goal Acc.thy |
|
19 "[| !!b. <b,a>:r ==> b: acc(r); a: field(r) |] ==> a: acc(r)"; |
|
20 by (fast_tac (ZF_cs addIs (prems@acc.intrs)) 1); |
|
21 val accI = result(); |
|
22 |
25 goal Acc.thy "!!a b r. [| b: acc(r); <a,b>: r |] ==> a: acc(r)"; |
23 goal Acc.thy "!!a b r. [| b: acc(r); <a,b>: r |] ==> a: acc(r)"; |
26 by (etac Acc.elim 1); |
24 by (etac acc.elim 1); |
27 by (fast_tac ZF_cs 1); |
25 by (fast_tac ZF_cs 1); |
28 val acc_downward = result(); |
26 val acc_downward = result(); |
29 |
27 |
30 val [major,indhyp] = goal Acc.thy |
28 val [major,indhyp] = goal Acc.thy |
31 "[| a : acc(r); \ |
29 "[| a : acc(r); \ |
32 \ !!x. [| x: acc(r); ALL y. <y,x>:r --> P(y) |] ==> P(x) \ |
30 \ !!x. [| x: acc(r); ALL y. <y,x>:r --> P(y) |] ==> P(x) \ |
33 \ |] ==> P(a)"; |
31 \ |] ==> P(a)"; |
34 by (rtac (major RS Acc.induct) 1); |
32 by (rtac (major RS acc.induct) 1); |
35 by (rtac indhyp 1); |
33 by (rtac indhyp 1); |
36 by (fast_tac ZF_cs 2); |
34 by (fast_tac ZF_cs 2); |
37 by (resolve_tac Acc.intrs 1); |
35 by (resolve_tac acc.intrs 1); |
38 by (assume_tac 2); |
36 by (assume_tac 2); |
39 by (fast_tac ZF_cs 1); |
37 be (Collect_subset RS Pow_mono RS subsetD) 1; |
40 val acc_induct = result(); |
38 val acc_induct = result(); |
41 |
39 |
42 goal Acc.thy "wf[acc(r)](r)"; |
40 goal Acc.thy "wf[acc(r)](r)"; |
43 by (rtac wf_onI2 1); |
41 by (rtac wf_onI2 1); |
44 by (etac acc_induct 1); |
42 by (etac acc_induct 1); |
50 |
48 |
51 val [major] = goal Acc.thy "wf(r) ==> field(r) <= acc(r)"; |
49 val [major] = goal Acc.thy "wf(r) ==> field(r) <= acc(r)"; |
52 by (rtac subsetI 1); |
50 by (rtac subsetI 1); |
53 by (etac (major RS wf_induct2) 1); |
51 by (etac (major RS wf_induct2) 1); |
54 by (rtac subset_refl 1); |
52 by (rtac subset_refl 1); |
55 by (resolve_tac Acc.intrs 1); |
53 by (resolve_tac [accI] 1); |
56 by (assume_tac 2); |
54 by (assume_tac 2); |
57 by (fast_tac ZF_cs 1); |
55 by (fast_tac ZF_cs 1); |
58 val acc_wfD = result(); |
56 val acc_wfD = result(); |
59 |
57 |
60 goal Acc.thy "wf(r) <-> field(r) <= acc(r)"; |
58 goal Acc.thy "wf(r) <-> field(r) <= acc(r)"; |