author | oheimb |
Thu, 18 Jan 2001 17:38:56 +0100 | |
changeset 10925 | 5ffe7ed8899a |
parent 10613 | 78b1d6c3ee9c |
child 10996 | 74e970389def |
permissions | -rw-r--r-- |
8011 | 1 |
(* Title: HOL/MicroJava/J/WellForm.ML |
2 |
ID: $Id$ |
|
3 |
Author: David von Oheimb |
|
4 |
Copyright 1999 Technische Universitaet Muenchen |
|
5 |
*) |
|
6 |
||
10925
5ffe7ed8899a
is_class and class now as defs (rather than translations); corrected Digest.thy
oheimb
parents:
10613
diff
changeset
|
7 |
Goalw [wf_prog_def, class_def] |
10613
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
8 |
"[|class G C = Some c; wf_prog wf_mb G|] ==> wf_cdecl wf_mb G (C,c)"; |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
9 |
by (Asm_full_simp_tac 1); |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
10 |
by (fast_tac (set_cs addDs [map_of_SomeD]) 1); |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
11 |
qed "class_wf"; |
8011 | 12 |
|
10925
5ffe7ed8899a
is_class and class now as defs (rather than translations); corrected Digest.thy
oheimb
parents:
10613
diff
changeset
|
13 |
Goalw [wf_prog_def, ObjectC_def, class_def] |
10613
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
14 |
"wf_prog wf_mb G ==> class G Object = Some (arbitrary, [], [])"; |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
15 |
by (auto_tac (claset() addIs [map_of_SomeI], simpset())); |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
16 |
qed "class_Object"; |
8011 | 17 |
Addsimps [class_Object]; |
18 |
||
10925
5ffe7ed8899a
is_class and class now as defs (rather than translations); corrected Digest.thy
oheimb
parents:
10613
diff
changeset
|
19 |
Goalw [is_class_def] "wf_prog wf_mb G ==> is_class G Object"; |
10613
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
20 |
by (Asm_simp_tac 1); |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
21 |
qed "is_class_Object"; |
8011 | 22 |
Addsimps [is_class_Object]; |
23 |
||
10042 | 24 |
Goal "[|G\\<turnstile>C\\<prec>C1D; wf_prog wf_mb G|] ==> D \\<noteq> C \\<and> \\<not>(D,C)\\<in>(subcls1 G)^+"; |
8011 | 25 |
by( forward_tac [r_into_trancl] 1); |
26 |
by( dtac subcls1D 1); |
|
10613
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
27 |
by(Clarify_tac 1); |
8082 | 28 |
by( datac class_wf 1 1); |
8011 | 29 |
by( rewtac wf_cdecl_def); |
8082 | 30 |
by(force_tac (claset(), simpset() addsimps [reflcl_trancl RS sym] |
31 |
delsimps [reflcl_trancl]) 1); |
|
8011 | 32 |
qed "subcls1_wfD"; |
33 |
||
10613
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
34 |
Goalw [wf_cdecl_def] |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
35 |
"!!r. \\<lbrakk>wf_cdecl wf_mb G (C,D,r); C \\<noteq> Object\\<rbrakk> \\<Longrightarrow> is_class G D"; |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
36 |
by (auto_tac (claset(), simpset() addsplits [option.split_asm])); |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
37 |
qed "wf_cdecl_supD"; |
8011 | 38 |
|
10042 | 39 |
Goal "[|wf_prog wf_mb G; (C,D)\\<in>(subcls1 G)^+|] ==> \\<not>(D,C)\\<in>(subcls1 G)^+"; |
8011 | 40 |
by(etac tranclE 1); |
10613
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
41 |
by(TRYALL(fast_tac (claset() addSDs [subcls1_wfD] addIs [trancl_trans]))); |
8011 | 42 |
qed "subcls_asym"; |
43 |
||
10613
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
44 |
Goal "[|wf_prog wf_mb G; (C,D)\\<in>(subcls1 G)^+|] ==> C \\<noteq> D"; |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
45 |
by (etac trancl_trans_induct 1); |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
46 |
by (auto_tac (claset() addDs [subcls1_wfD,subcls_asym],simpset())); |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
47 |
qed "subcls_irrefl"; |
8011 | 48 |
|
10613
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
49 |
Goalw [acyclic_def] "wf_prog wf_mb G ==> acyclic (subcls1 G)"; |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
50 |
by (fast_tac (claset() addDs [subcls_irrefl]) 1); |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
51 |
qed "acyclic_subcls1"; |
8011 | 52 |
|
10613
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
53 |
Goal "wf_prog wf_mb G ==> wf ((subcls1 G)^-1)"; |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
54 |
by (rtac finite_acyclic_wf 1); |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
55 |
by ( stac finite_converse 1); |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
56 |
by ( rtac finite_subcls1 1); |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
57 |
by (stac acyclic_converse 1); |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
58 |
by (etac acyclic_subcls1 1); |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
59 |
qed "wf_subcls1"; |
8011 | 60 |
|
61 |
val major::prems = goal thy |
|
10042 | 62 |
"[|wf_prog wf_mb G; !!C. \\<forall>D. (C,D)\\<in>(subcls1 G)^+ --> P D ==> P C|] ==> P C"; |
8011 | 63 |
by(cut_facts_tac [major RS wf_subcls1] 1); |
64 |
by(dtac wf_trancl 1); |
|
65 |
by(asm_full_simp_tac (HOL_ss addsimps [trancl_converse]) 1); |
|
66 |
by(eres_inst_tac [("a","C")] wf_induct 1); |
|
67 |
by(resolve_tac prems 1); |
|
68 |
by(Auto_tac); |
|
69 |
qed "subcls_induct"; |
|
70 |
||
10925
5ffe7ed8899a
is_class and class now as defs (rather than translations); corrected Digest.thy
oheimb
parents:
10613
diff
changeset
|
71 |
val prems = goalw thy [is_class_def] "[|is_class G C; wf_prog wf_mb G; P Object; \ |
10613
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
72 |
\!!C D fs ms. [|C \\<noteq> Object; is_class G C; class G C = Some (D,fs,ms) \\<and> \ |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
73 |
\ wf_cdecl wf_mb G (C,D,fs,ms) \\<and> G\\<turnstile>C\\<prec>C1D \\<and> is_class G D \\<and> P D|] ==> P C\ |
10042 | 74 |
\ |] ==> P C"; |
8011 | 75 |
by( cut_facts_tac prems 1); |
76 |
by( rtac impE 1); |
|
77 |
by( atac 2); |
|
78 |
by( atac 2); |
|
79 |
by( etac thin_rl 1); |
|
80 |
by( rtac subcls_induct 1); |
|
81 |
by( atac 1); |
|
82 |
by( rtac impI 1); |
|
83 |
by( case_tac "C = Object" 1); |
|
84 |
by( Fast_tac 1); |
|
10613
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
85 |
by Safe_tac; |
10925
5ffe7ed8899a
is_class and class now as defs (rather than translations); corrected Digest.thy
oheimb
parents:
10613
diff
changeset
|
86 |
by( ftac class_wf 1); |
8011 | 87 |
by( atac 1); |
10925
5ffe7ed8899a
is_class and class now as defs (rather than translations); corrected Digest.thy
oheimb
parents:
10613
diff
changeset
|
88 |
by( ftac wf_cdecl_supD 1); |
8011 | 89 |
by( atac 1); |
10613
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
90 |
|
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
91 |
by( subgoal_tac "G\\<turnstile>C\\<prec>C1a" 1); |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
92 |
by( etac subcls1I 2); |
8011 | 93 |
by( rtac (hd (tl (tl (tl prems)))) 1); |
10925
5ffe7ed8899a
is_class and class now as defs (rather than translations); corrected Digest.thy
oheimb
parents:
10613
diff
changeset
|
94 |
by (rewtac is_class_def); |
10613
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
95 |
by Auto_tac; |
8011 | 96 |
qed "subcls1_induct"; |
97 |
||
10613
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
98 |
Goal "[|wf ((subcls1 G)^-1); \\<forall>D fs ms. class G C = Some (D,fs,ms) \\<longrightarrow> C \\<noteq> Object --> is_class G D|] ==> method (G,C) = \ |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
99 |
\ (case class G C of None => arbitrary | Some (D,fs,ms) => \ |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
100 |
\ (if C = Object then empty else method (G,D)) ++ \ |
8011 | 101 |
\ map_of (map (\\<lambda>(s,m). (s,(C,m))) ms))"; |
8624 | 102 |
by( stac (method_TC RS (wf_subcls1_rel RS (hd method.simps))) 1); |
9346
297dcbf64526
re-structuring MicroJava; added Example; corrected := syntax; simplfied cast
oheimb
parents:
8624
diff
changeset
|
103 |
by( asm_simp_tac (simpset() addsplits[option.split]) 1); |
10613
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
104 |
by Auto_tac; |
9346
297dcbf64526
re-structuring MicroJava; added Example; corrected := syntax; simplfied cast
oheimb
parents:
8624
diff
changeset
|
105 |
qed "method_rec_lemma"; |
297dcbf64526
re-structuring MicroJava; added Example; corrected := syntax; simplfied cast
oheimb
parents:
8624
diff
changeset
|
106 |
|
10042 | 107 |
Goal "wf_prog wf_mb G ==> method (G,C) = \ |
10613
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
108 |
\ (case class G C of None => arbitrary | Some (D,fs,ms) => \ |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
109 |
\ (if C = Object then empty else method (G,D)) ++ \ |
9346
297dcbf64526
re-structuring MicroJava; added Example; corrected := syntax; simplfied cast
oheimb
parents:
8624
diff
changeset
|
110 |
\ map_of (map (\\<lambda>(s,m). (s,(C,m))) ms))"; |
297dcbf64526
re-structuring MicroJava; added Example; corrected := syntax; simplfied cast
oheimb
parents:
8624
diff
changeset
|
111 |
by(rtac method_rec_lemma 1); |
8011 | 112 |
by( clarsimp_tac (claset(), simpset() addsimps [wf_subcls1,empty_def] |
113 |
addsplits [option.split]) 1); |
|
114 |
by( case_tac "C = Object" 1); |
|
9346
297dcbf64526
re-structuring MicroJava; added Example; corrected := syntax; simplfied cast
oheimb
parents:
8624
diff
changeset
|
115 |
by( Force_tac 1); |
297dcbf64526
re-structuring MicroJava; added Example; corrected := syntax; simplfied cast
oheimb
parents:
8624
diff
changeset
|
116 |
by Safe_tac; |
297dcbf64526
re-structuring MicroJava; added Example; corrected := syntax; simplfied cast
oheimb
parents:
8624
diff
changeset
|
117 |
by( datac class_wf 1 1); |
297dcbf64526
re-structuring MicroJava; added Example; corrected := syntax; simplfied cast
oheimb
parents:
8624
diff
changeset
|
118 |
by( datac wf_cdecl_supD 1 1); |
8011 | 119 |
by( Asm_full_simp_tac 1); |
8082 | 120 |
qed "method_rec"; |
8011 | 121 |
|
10613
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
122 |
Goal "[|wf ((subcls1 G)^-1); class G C = Some (D,fs,ms); C \\<noteq> Object \\<longrightarrow> is_class G D|] ==> fields (G,C) = \ |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
123 |
\ map (\\<lambda>(fn,ft). ((fn,C),ft)) fs @ (if C = Object then [] else fields (G,D))"; |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
124 |
by(rtac trans 1); |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
125 |
by(rtac (fields_TC RS (wf_subcls1_rel RS (hd fields.simps))) 1); |
9346
297dcbf64526
re-structuring MicroJava; added Example; corrected := syntax; simplfied cast
oheimb
parents:
8624
diff
changeset
|
126 |
by( asm_simp_tac (simpset() addsplits[option.split]) 1); |
297dcbf64526
re-structuring MicroJava; added Example; corrected := syntax; simplfied cast
oheimb
parents:
8624
diff
changeset
|
127 |
qed "fields_rec_lemma"; |
297dcbf64526
re-structuring MicroJava; added Example; corrected := syntax; simplfied cast
oheimb
parents:
8624
diff
changeset
|
128 |
|
10613
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
129 |
Goal "[|class G C = Some (D,fs,ms); wf_prog wf_mb G|] ==> fields (G,C) = \ |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
130 |
\ map (\\<lambda>(fn,ft). ((fn,C),ft)) fs @ (if C = Object then [] else fields (G,D))"; |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
131 |
by(rtac trans 1); |
9346
297dcbf64526
re-structuring MicroJava; added Example; corrected := syntax; simplfied cast
oheimb
parents:
8624
diff
changeset
|
132 |
by(rtac fields_rec_lemma 1); |
10613
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
133 |
by( asm_simp_tac (simpset() addsimps [wf_subcls1]) 1); |
9346
297dcbf64526
re-structuring MicroJava; added Example; corrected := syntax; simplfied cast
oheimb
parents:
8624
diff
changeset
|
134 |
ba 1; |
10613
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
135 |
br refl 2; |
9346
297dcbf64526
re-structuring MicroJava; added Example; corrected := syntax; simplfied cast
oheimb
parents:
8624
diff
changeset
|
136 |
by( datac class_wf 1 1); |
10613
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
137 |
by(rtac impI 1); |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
138 |
by( eatac wf_cdecl_supD 1 1); |
8082 | 139 |
qed "fields_rec"; |
8011 | 140 |
|
10613
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
141 |
Goal "wf_prog wf_mb G ==> method (G,Object) = empty"; |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
142 |
by(stac method_rec 1); |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
143 |
by Auto_tac; |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
144 |
qed "method_Object"; |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
145 |
|
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
146 |
Goal "wf_prog wf_mb G ==> fields (G,Object) = []"; |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
147 |
by(stac fields_rec 1); |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
148 |
by Auto_tac; |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
149 |
qed "fields_Object"; |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
150 |
|
8034
6fc37b5c5e98
Various little changes like cmethd -> method and cfield -> field.
nipkow
parents:
8011
diff
changeset
|
151 |
Addsimps [method_Object, fields_Object]; |
10613
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
152 |
|
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
153 |
Goalw [field_def] "wf_prog wf_mb G ==> field (G,Object) = empty"; |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
154 |
by(Asm_simp_tac 1); |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
155 |
qed "field_Object"; |
8034
6fc37b5c5e98
Various little changes like cmethd -> method and cfield -> field.
nipkow
parents:
8011
diff
changeset
|
156 |
Addsimps [field_Object]; |
8011 | 157 |
|
10042 | 158 |
Goal "[|is_class G C; wf_prog wf_mb G|] ==> G\\<turnstile>C\\<preceq>C Object"; |
8082 | 159 |
by(etac subcls1_induct 1); |
160 |
by( atac 1); |
|
161 |
by( Fast_tac 1); |
|
162 |
by(auto_tac (HOL_cs addSDs [wf_cdecl_supD], simpset())); |
|
163 |
by(eatac rtrancl_into_rtrancl2 1 1); |
|
164 |
qed "subcls_C_Object"; |
|
8011 | 165 |
|
10613
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
166 |
Goalw [wf_mhead_def] "wf_mhead G sig rT ==> is_type G rT"; |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
167 |
by Auto_tac; |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
168 |
qed "is_type_rTI"; |
8011 | 169 |
|
10042 | 170 |
Goal "[|is_class G C; wf_prog wf_mb G|] ==> \ |
8185 | 171 |
\ \\<forall>((fn,fd),fT)\\<in>set (fields (G,C)). G\\<turnstile>C\\<preceq>C fd"; |
8011 | 172 |
by( etac subcls1_induct 1); |
173 |
by( atac 1); |
|
174 |
by( Asm_simp_tac 1); |
|
175 |
by( safe_tac HOL_cs); |
|
176 |
by( stac fields_rec 1); |
|
177 |
by( atac 1); |
|
178 |
by( atac 1); |
|
10613
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
179 |
by( simp_tac (simpset() delsplits [split_if]) 1); |
8011 | 180 |
by( rtac ballI 1); |
181 |
by( split_all_tac 1); |
|
182 |
by( Simp_tac 1); |
|
183 |
by( etac UnE 1); |
|
10613
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
184 |
by( Force_tac 1); |
8185 | 185 |
by( etac (r_into_rtrancl RS rtrancl_trans) 1); |
10613
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
186 |
by Auto_tac; |
8082 | 187 |
qed "widen_fields_defpl'"; |
8011 | 188 |
|
10613
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
189 |
Goal "[|((fn,fd),fT) \\<in> set (fields (G,C)); wf_prog wf_mb G; is_class G C|] ==> \ |
8185 | 190 |
\ G\\<turnstile>C\\<preceq>C fd"; |
8082 | 191 |
by( datac widen_fields_defpl' 1 1); |
10613
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
192 |
by (Fast_tac 1); |
8082 | 193 |
qed "widen_fields_defpl"; |
8011 | 194 |
|
10042 | 195 |
Goal "[|is_class G C; wf_prog wf_mb G|] ==> unique (fields (G,C))"; |
8011 | 196 |
by( etac subcls1_induct 1); |
197 |
by( atac 1); |
|
198 |
by( safe_tac (HOL_cs addSDs [wf_cdecl_supD])); |
|
199 |
by( Asm_simp_tac 1); |
|
200 |
by( dtac subcls1_wfD 1); |
|
201 |
by( atac 1); |
|
202 |
by( stac fields_rec 1); |
|
203 |
by Auto_tac; |
|
204 |
by( rotate_tac ~1 1); |
|
205 |
by( forward_tac [class_wf] 1); |
|
206 |
by Auto_tac; |
|
207 |
by( asm_full_simp_tac (simpset() addsimps [wf_cdecl_def]) 1); |
|
208 |
by( etac unique_append 1); |
|
10613
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
209 |
by( rtac unique_map_inj 1); |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
210 |
by( Clarsimp_tac 1); |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
211 |
by (rtac injI 1); |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
212 |
by( Asm_full_simp_tac 1); |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
213 |
by(auto_tac (claset() addSDs [widen_fields_defpl], simpset())); |
8082 | 214 |
qed "unique_fields"; |
215 |
||
10613
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
216 |
Goal "[|wf_prog wf_mb G; (C',C)\\<in>(subcls1 G)^*|] ==> \ |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
217 |
\ x \\<in> set (fields (G,C)) --> x \\<in> set (fields (G,C'))"; |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
218 |
by(etac converse_rtrancl_induct 1); |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
219 |
by( safe_tac (HOL_cs addSDs [subcls1D])); |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
220 |
by(stac fields_rec 1); |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
221 |
by( Auto_tac); |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
222 |
qed_spec_mp "fields_mono_lemma"; |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
223 |
|
8011 | 224 |
Goal |
10613
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
225 |
"\\<lbrakk>map_of (fields (G,C)) fn = Some f; G\\<turnstile>D\\<preceq>C C; is_class G D; wf_prog wf_mb G\\<rbrakk>\ |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
226 |
\ \\<Longrightarrow> map_of (fields (G,D)) fn = Some f"; |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
227 |
by (rtac map_of_SomeI 1); |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
228 |
by (eatac unique_fields 1 1); |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
229 |
by (eatac fields_mono_lemma 1 1); |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
230 |
by (etac map_of_SomeD 1); |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
231 |
qed "fields_mono"; |
8011 | 232 |
|
10613
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
233 |
Goal |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
234 |
"[|field (G,C) fn = Some (fd, fT); G\\<turnstile>D\\<preceq>C C; wf_prog wf_mb G|]==> \ |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
235 |
\ map_of (fields (G,D)) (fn, fd) = Some fT"; |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
236 |
by (dtac field_fields 1); |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
237 |
by (dtac rtranclD 1); |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
238 |
by Safe_tac; |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
239 |
by (ftac subcls_is_class 1); |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
240 |
by (dtac trancl_into_rtrancl 1); |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
241 |
by (fast_tac (HOL_cs addDs [fields_mono]) 1); |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
242 |
qed "widen_cfs_fields"; |
8011 | 243 |
|
10613
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
244 |
Goal "wf_prog wf_mb G ==> is_class G C \\<Longrightarrow> \ |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
245 |
\ method (G,C) sig = Some (md,mh,m)\ |
10042 | 246 |
\ --> G\\<turnstile>C\\<preceq>C md \\<and> wf_mdecl wf_mb G md (sig,(mh,m))"; |
8011 | 247 |
by( etac subcls1_induct 1); |
248 |
by( atac 1); |
|
249 |
by( Force_tac 1); |
|
8034
6fc37b5c5e98
Various little changes like cmethd -> method and cfield -> field.
nipkow
parents:
8011
diff
changeset
|
250 |
by( forw_inst_tac [("C","C")] method_rec 1); |
10613
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
251 |
by( Clarify_tac 1); |
8011 | 252 |
by( rotate_tac ~1 1); |
253 |
by( Asm_full_simp_tac 1); |
|
254 |
by( dtac override_SomeD 1); |
|
255 |
by( etac disjE 1); |
|
10042 | 256 |
by( thin_tac "?P --> ?Q" 1); |
8011 | 257 |
by( Clarify_tac 2); |
8185 | 258 |
by( rtac rtrancl_trans 2); |
8011 | 259 |
by( atac 3); |
8082 | 260 |
by( rtac r_into_rtrancl 2); |
8011 | 261 |
by( fast_tac (HOL_cs addIs [subcls1I]) 2); |
10613
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
262 |
by (rotate_tac ~1 1); |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
263 |
by (ftac map_of_SomeD 1); |
8011 | 264 |
by( rewtac wf_cdecl_def); |
10613
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
265 |
by (Clarsimp_tac 1); |
8082 | 266 |
qed_spec_mp "method_wf_mdecl"; |
8011 | 267 |
|
10042 | 268 |
Goal "[|G\\<turnstile>T\\<preceq>C T'; wf_prog wf_mb G|] ==> \ |
269 |
\ \\<forall>D rT b. method (G,T') sig = Some (D,rT ,b) -->\ |
|
8034
6fc37b5c5e98
Various little changes like cmethd -> method and cfield -> field.
nipkow
parents:
8011
diff
changeset
|
270 |
\ (\\<exists>D' rT' b'. method (G,T) sig = Some (D',rT',b') \\<and> G\\<turnstile>rT'\\<preceq>rT)"; |
8082 | 271 |
by( dtac rtranclD 1); |
272 |
by( etac disjE 1); |
|
273 |
by( Fast_tac 1); |
|
274 |
by( etac conjE 1); |
|
8011 | 275 |
by( etac trancl_trans_induct 1); |
10613
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
276 |
by( Clarify_tac 2); |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
277 |
by( EVERY[smp_tac 3 2]); |
8011 | 278 |
by( fast_tac (HOL_cs addEs [widen_trans]) 2); |
10613
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
279 |
by( Clarify_tac 1); |
8011 | 280 |
by( dtac subcls1D 1); |
10613
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
281 |
by( Clarify_tac 1); |
8034
6fc37b5c5e98
Various little changes like cmethd -> method and cfield -> field.
nipkow
parents:
8011
diff
changeset
|
282 |
by( stac method_rec 1); |
8011 | 283 |
by( atac 1); |
284 |
by( rewtac override_def); |
|
285 |
by( asm_simp_tac (simpset() delsimps [split_paired_Ex]) 1); |
|
286 |
by( case_tac "\\<exists>z. map_of(map (\\<lambda>(s,m). (s, ?C, m)) ms) sig = Some z" 1); |
|
287 |
by( etac exE 1); |
|
288 |
by( asm_full_simp_tac (HOL_ss addsimps [not_None_eq RS sym]) 2); |
|
289 |
by( ALLGOALS (rotate_tac ~1 THEN' forward_tac[ssubst] THEN' (fn n=>atac(n+1)))); |
|
290 |
by( ALLGOALS (asm_simp_tac (simpset() delsimps [split_paired_Ex]))); |
|
291 |
by( dtac class_wf 1); |
|
292 |
by( atac 1); |
|
293 |
by( split_all_tac 1); |
|
294 |
by( rewtac wf_cdecl_def); |
|
10613
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
295 |
by( dtac map_of_SomeD 1); |
8011 | 296 |
by Auto_tac; |
297 |
qed_spec_mp "subcls_widen_methd"; |
|
298 |
||
299 |
Goal |
|
10042 | 300 |
"[| G\\<turnstile> C\\<preceq>C D; wf_prog wf_mb G; \ |
301 |
\ method (G,D) sig = Some (md, rT, b) |] \ |
|
302 |
\ ==> \\<exists>mD' rT' b'. method (G,C) sig= Some(mD',rT',b') \\<and> G\\<turnstile>rT'\\<preceq>rT"; |
|
8185 | 303 |
by(auto_tac (claset() addDs [subcls_widen_methd,method_wf_mdecl], |
8011 | 304 |
simpset() addsimps [wf_mdecl_def,wf_mhead_def,split_def])); |
305 |
qed "subtype_widen_methd"; |
|
306 |
||
10613
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
307 |
Goal "wf_prog wf_mb G ==> is_class G C \\<Longrightarrow> \\<forall>D. method (G,C) sig = Some(D,mh,code) --> is_class G D \\<and> method (G,D) sig = Some(D,mh,code)"; |
8011 | 308 |
by (etac subcls1_induct 1); |
309 |
ba 1; |
|
310 |
by (Asm_full_simp_tac 1); |
|
8034
6fc37b5c5e98
Various little changes like cmethd -> method and cfield -> field.
nipkow
parents:
8011
diff
changeset
|
311 |
by (stac method_rec 1); |
8011 | 312 |
ba 1; |
313 |
by (Clarify_tac 1); |
|
314 |
by (eres_inst_tac [("x","Da")] allE 1); |
|
315 |
by (Clarsimp_tac 1); |
|
316 |
by (asm_full_simp_tac (simpset() addsimps [map_of_map]) 1); |
|
317 |
by (Clarify_tac 1); |
|
8034
6fc37b5c5e98
Various little changes like cmethd -> method and cfield -> field.
nipkow
parents:
8011
diff
changeset
|
318 |
by (stac method_rec 1); |
8011 | 319 |
ba 1; |
320 |
by (asm_full_simp_tac (simpset() addsimps [override_def,map_of_map] addsplits [option.split]) 1); |
|
8034
6fc37b5c5e98
Various little changes like cmethd -> method and cfield -> field.
nipkow
parents:
8011
diff
changeset
|
321 |
qed_spec_mp "method_in_md"; |
8011 | 322 |
|
10042 | 323 |
Goal "[|is_class G C; wf_prog wf_mb G|] ==> \ |
8011 | 324 |
\ \\<forall>f\\<in>set (fields (G,C)). is_type G (snd f)"; |
325 |
by( etac subcls1_induct 1); |
|
326 |
by( atac 1); |
|
327 |
by( Asm_simp_tac 1); |
|
328 |
by( stac fields_rec 1); |
|
10613
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
329 |
by( Fast_tac 1); |
8011 | 330 |
by( atac 1); |
10613
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
331 |
by( Clarsimp_tac 1); |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
332 |
by( Safe_tac); |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
333 |
by( Force_tac 2); |
8011 | 334 |
by( dtac class_wf 1); |
335 |
by( atac 1); |
|
336 |
by( rewtac wf_cdecl_def); |
|
10613
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
337 |
by( Clarsimp_tac 1); |
8011 | 338 |
by( EVERY[dtac bspec 1, atac 1]); |
339 |
by( rewtac wf_fdecl_def); |
|
10613
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
340 |
by Auto_tac; |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
341 |
qed_spec_mp "fields_is_type_lemma"; |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
342 |
|
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
343 |
Goal "[|map_of (fields (G,C)) fn = Some f; wf_prog wf_mb G; is_class G C|] ==> \ |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
344 |
\ is_type G f"; |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
345 |
by(dtac map_of_SomeD 1); |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
346 |
by(datac fields_is_type_lemma 2 1); |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
347 |
by(Auto_tac); |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
348 |
qed "fields_is_type"; |
78b1d6c3ee9c
improved superclass entry for classes and definition status of is_class, class
oheimb
parents:
10138
diff
changeset
|
349 |