|
2570
|
1 |
(* Title: FOCUS/ex/coind.ML
|
|
|
2 |
ID: $ $
|
|
|
3 |
Author: Franz Regensburger
|
|
|
4 |
Copyright 1993, 1995 Technische Universitaet Muenchen
|
|
|
5 |
*)
|
|
|
6 |
|
|
|
7 |
open Coind;
|
|
|
8 |
|
|
|
9 |
(* ------------------------------------------------------------------------- *)
|
|
|
10 |
(* expand fixed point properties *)
|
|
|
11 |
(* ------------------------------------------------------------------------- *)
|
|
|
12 |
|
|
|
13 |
|
|
|
14 |
val nats_def2 = fix_prover2 Coind.thy nats_def
|
|
|
15 |
"nats = dzero&&(smap`dsucc`nats)";
|
|
|
16 |
|
|
|
17 |
val from_def2 = fix_prover2 Coind.thy from_def
|
|
|
18 |
"from = (¤n.n&&(from`(dsucc`n)))";
|
|
|
19 |
|
|
|
20 |
|
|
|
21 |
|
|
|
22 |
(* ------------------------------------------------------------------------- *)
|
|
|
23 |
(* recursive properties *)
|
|
|
24 |
(* ------------------------------------------------------------------------- *)
|
|
|
25 |
|
|
|
26 |
|
|
|
27 |
val from = prove_goal Coind.thy "from`n = n&&(from`(dsucc`n))"
|
|
|
28 |
(fn prems =>
|
|
|
29 |
[
|
|
|
30 |
(rtac trans 1),
|
|
|
31 |
(rtac (from_def2 RS ssubst) 1),
|
|
|
32 |
(simp_tac HOLCF_ss 1),
|
|
|
33 |
(rtac refl 1)
|
|
|
34 |
]);
|
|
|
35 |
|
|
|
36 |
|
|
|
37 |
val from1 = prove_goal Coind.thy "from`Ø = Ø"
|
|
|
38 |
(fn prems =>
|
|
|
39 |
[
|
|
|
40 |
(rtac trans 1),
|
|
|
41 |
(rtac (from RS ssubst) 1),
|
|
|
42 |
(resolve_tac stream.con_rews 1),
|
|
|
43 |
(rtac refl 1)
|
|
|
44 |
]);
|
|
|
45 |
|
|
|
46 |
val coind_rews =
|
|
|
47 |
[iterator1, iterator2, iterator3, smap1, smap2,from1];
|
|
|
48 |
|
|
|
49 |
(* ------------------------------------------------------------------------- *)
|
|
|
50 |
(* the example *)
|
|
|
51 |
(* prove: nats = from`dzero *)
|
|
|
52 |
(* ------------------------------------------------------------------------- *)
|
|
|
53 |
|
|
|
54 |
val prems = goal Coind.thy "iterator`n`(smap`dsucc)`nats =\
|
|
|
55 |
\ n&&(iterator`(dsucc`n)`(smap`dsucc)`nats)";
|
|
|
56 |
by (res_inst_tac [("x","n")] dnat.ind 1);
|
|
|
57 |
by (simp_tac (HOLCF_ss addsimps (coind_rews @ stream.rews)) 1);
|
|
|
58 |
by (simp_tac (HOLCF_ss addsimps (coind_rews @ stream.rews)) 1);
|
|
|
59 |
by (rtac trans 1);
|
|
|
60 |
by (rtac nats_def2 1);
|
|
|
61 |
by (simp_tac (HOLCF_ss addsimps (coind_rews @ dnat.rews)) 1);
|
|
|
62 |
by (rtac trans 1);
|
|
|
63 |
by (etac iterator3 1);
|
|
|
64 |
by (rtac trans 1);
|
|
|
65 |
by (asm_simp_tac HOLCF_ss 1);
|
|
|
66 |
by (rtac trans 1);
|
|
|
67 |
by (etac smap2 1);
|
|
|
68 |
by (rtac cfun_arg_cong 1);
|
|
|
69 |
by (asm_simp_tac (HOLCF_ss addsimps ([iterator3 RS sym] @ dnat.rews)) 1);
|
|
|
70 |
val coind_lemma1 = result();
|
|
|
71 |
|
|
|
72 |
val prems = goal Coind.thy "nats = from`dzero";
|
|
|
73 |
by (res_inst_tac [("R","% p q.? n. p = iterator`n`(smap`dsucc)`nats & q = from`n")] stream.coind 1);
|
|
|
74 |
by (res_inst_tac [("x","dzero")] exI 2);
|
|
|
75 |
by (asm_simp_tac (HOLCF_ss addsimps coind_rews) 2);
|
|
|
76 |
by (rewrite_goals_tac [stream.bisim_def]);
|
|
|
77 |
by (strip_tac 1);
|
|
|
78 |
by (etac exE 1);
|
|
|
79 |
by (etac conjE 1);
|
|
|
80 |
by (case_tac "n=Ø" 1);
|
|
|
81 |
by (rtac disjI1 1);
|
|
|
82 |
by (asm_simp_tac (HOLCF_ss addsimps coind_rews) 1);
|
|
|
83 |
by (rtac disjI2 1);
|
|
|
84 |
by (hyp_subst_tac 1);
|
|
|
85 |
by (res_inst_tac [("x","n")] exI 1);
|
|
|
86 |
by (res_inst_tac [("x","iterator`(dsucc`n)`(smap`dsucc)`nats")] exI 1);
|
|
|
87 |
by (res_inst_tac [("x","from`(dsucc`n)")] exI 1);
|
|
|
88 |
by (etac conjI 1);
|
|
|
89 |
by (rtac conjI 1);
|
|
|
90 |
by (res_inst_tac [("x","dsucc`n")] exI 1);
|
|
|
91 |
by (fast_tac HOL_cs 1);
|
|
|
92 |
by (rtac conjI 1);
|
|
|
93 |
by (rtac coind_lemma1 1);
|
|
|
94 |
by (rtac from 1);
|
|
|
95 |
val nats_eq_from = result();
|
|
|
96 |
|
|
|
97 |
(* another proof using stream_coind_lemma2 *)
|
|
|
98 |
|
|
|
99 |
val prems = goal Coind.thy "nats = from`dzero";
|
|
|
100 |
by (res_inst_tac [("R","% p q.? n. p = iterator`n`(smap`dsucc)`nats & q = from`n")] stream.coind 1);
|
|
|
101 |
by (rtac stream_coind_lemma2 1);
|
|
|
102 |
by (strip_tac 1);
|
|
|
103 |
by (etac exE 1);
|
|
|
104 |
by (case_tac "n=Ø" 1);
|
|
|
105 |
by (asm_simp_tac (HOLCF_ss addsimps coind_rews) 1);
|
|
|
106 |
by (res_inst_tac [("x","Ø::dnat")] exI 1);
|
|
|
107 |
by (simp_tac (HOLCF_ss addsimps coind_rews addsimps stream.rews) 1);
|
|
|
108 |
by (etac conjE 1);
|
|
|
109 |
by (hyp_subst_tac 1);
|
|
|
110 |
by (rtac conjI 1);
|
|
|
111 |
by (rtac (coind_lemma1 RS ssubst) 1);
|
|
|
112 |
by (rtac (from RS ssubst) 1);
|
|
|
113 |
by (asm_simp_tac (HOLCF_ss addsimps stream.rews) 1);
|
|
|
114 |
by (res_inst_tac [("x","dsucc`n")] exI 1);
|
|
|
115 |
by (rtac conjI 1);
|
|
|
116 |
by (rtac trans 1);
|
|
|
117 |
by (rtac (coind_lemma1 RS ssubst) 1);
|
|
|
118 |
by (asm_simp_tac (HOLCF_ss addsimps stream.rews) 1);
|
|
|
119 |
by (rtac refl 1);
|
|
|
120 |
by (rtac trans 1);
|
|
|
121 |
by (rtac (from RS ssubst) 1);
|
|
|
122 |
by (asm_simp_tac (HOLCF_ss addsimps stream.rews) 1);
|
|
|
123 |
by (rtac refl 1);
|
|
|
124 |
by (res_inst_tac [("x","dzero")] exI 1);
|
|
|
125 |
by (asm_simp_tac (HOLCF_ss addsimps coind_rews) 1);
|
|
|
126 |
val nats_eq_from = result();
|