author | oheimb |
Wed, 05 Jul 2000 10:28:29 +0200 | |
changeset 9246 | 91423cd08c6f |
parent 8106 | de9fae0cdfde |
child 9346 | 297dcbf64526 |
permissions | -rw-r--r-- |
8011 | 1 |
(* Title: HOL/MicroJava/J/TypeRel.thy |
2 |
ID: $Id$ |
|
3 |
Author: David von Oheimb |
|
4 |
Copyright 1999 Technische Universitaet Muenchen |
|
5 |
||
6 |
The relations between Java types |
|
7 |
*) |
|
8 |
||
9 |
TypeRel = Prog + |
|
10 |
||
11 |
consts |
|
12 |
subcls1 :: "'c prog \\<Rightarrow> (cname \\<times> cname) set" (* subclass *) |
|
13 |
widen, (* widening *) |
|
14 |
cast :: "'c prog \\<Rightarrow> (ty \\<times> ty) set" (* casting *) |
|
15 |
||
16 |
syntax |
|
17 |
subcls1 :: "'c prog \\<Rightarrow> [cname, cname] \\<Rightarrow> bool" ("_\\<turnstile>_\\<prec>C1_" [71,71,71] 70) |
|
8106 | 18 |
subcls :: "'c prog \\<Rightarrow> [cname, cname] \\<Rightarrow> bool" ("_\\<turnstile>_\\<preceq>C _" [71,71,71] 70) |
8011 | 19 |
widen :: "'c prog \\<Rightarrow> [ty, ty] \\<Rightarrow> bool" ("_\\<turnstile>_\\<preceq>_" [71,71,71] 70) |
9246 | 20 |
cast :: "'c prog \\<Rightarrow> [ty, ty] \\<Rightarrow> bool" ("_\\<turnstile>_\\<preceq>? _"[71,71,71] 70) |
8011 | 21 |
|
22 |
translations |
|
23 |
"G\\<turnstile>C \\<prec>C1 D" == "(C,D) \\<in> subcls1 G" |
|
8106 | 24 |
"G\\<turnstile>C \\<preceq>C D" == "(C,D) \\<in> (subcls1 G)^*" |
8011 | 25 |
"G\\<turnstile>S \\<preceq> T" == "(S,T) \\<in> widen G" |
9246 | 26 |
"G\\<turnstile>S \\<preceq>? T" == "(S,T) \\<in> cast G" |
8011 | 27 |
|
28 |
defs |
|
29 |
||
30 |
(* direct subclass, cf. 8.1.3 *) |
|
31 |
subcls1_def "subcls1 G \\<equiv> {(C,D). \\<exists>c. class G C = Some c \\<and> fst c = Some D}" |
|
32 |
||
33 |
consts |
|
34 |
||
8034
6fc37b5c5e98
Various little changes like cmethd -> method and cfield -> field.
nipkow
parents:
8011
diff
changeset
|
35 |
method :: "'c prog \\<times> cname \\<Rightarrow> ( sig \\<leadsto> cname \\<times> ty \\<times> 'c)" |
6fc37b5c5e98
Various little changes like cmethd -> method and cfield -> field.
nipkow
parents:
8011
diff
changeset
|
36 |
field :: "'c prog \\<times> cname \\<Rightarrow> ( vname \\<leadsto> cname \\<times> ty)" |
8011 | 37 |
fields :: "'c prog \\<times> cname \\<Rightarrow> ((vname \\<times> cname) \\<times> ty) list" |
38 |
||
39 |
constdefs (* auxiliary relations for recursive definitions below *) |
|
40 |
||
41 |
subcls1_rel :: "(('c prog \\<times> cname) \\<times> ('c prog \\<times> cname)) set" |
|
42 |
"subcls1_rel \\<equiv> {((G,C),(G',C')). G = G' \\<and> wf ((subcls1 G)^-1) \\<and> G\\<turnstile>C'\\<prec>C1C}" |
|
43 |
||
44 |
(* methods of a class, with inheritance, overriding and hiding, cf. 8.4.6 *) |
|
8034
6fc37b5c5e98
Various little changes like cmethd -> method and cfield -> field.
nipkow
parents:
8011
diff
changeset
|
45 |
recdef method "subcls1_rel" |
6fc37b5c5e98
Various little changes like cmethd -> method and cfield -> field.
nipkow
parents:
8011
diff
changeset
|
46 |
"method (G,C) = (if wf((subcls1 G)^-1) then (case class G C of None \\<Rightarrow> empty |
8011 | 47 |
| Some (sc,fs,ms) \\<Rightarrow> (case sc of None \\<Rightarrow> empty | Some D \\<Rightarrow> |
8034
6fc37b5c5e98
Various little changes like cmethd -> method and cfield -> field.
nipkow
parents:
8011
diff
changeset
|
48 |
if is_class G D then method (G,D) |
8011 | 49 |
else arbitrary) \\<oplus> |
50 |
map_of (map (\\<lambda>(s, m ). |
|
51 |
(s,(C,m))) ms)) |
|
52 |
else arbitrary)" |
|
53 |
||
54 |
(* list of fields of a class, including inherited and hidden ones *) |
|
55 |
recdef fields "subcls1_rel" |
|
56 |
"fields (G,C) = (if wf((subcls1 G)^-1) then (case class G C of None \\<Rightarrow> arbitrary |
|
57 |
| Some (sc,fs,ms) \\<Rightarrow> map (\\<lambda>(fn,ft). ((fn,C),ft)) fs@ |
|
58 |
(case sc of None \\<Rightarrow> [] | Some D \\<Rightarrow> |
|
59 |
if is_class G D then fields (G,D) |
|
60 |
else arbitrary)) |
|
61 |
else arbitrary)" |
|
62 |
defs |
|
63 |
||
8034
6fc37b5c5e98
Various little changes like cmethd -> method and cfield -> field.
nipkow
parents:
8011
diff
changeset
|
64 |
field_def "field \\<equiv> map_of o (map (\\<lambda>((fn,fd),ft). (fn,(fd,ft)))) o fields" |
8011 | 65 |
|
66 |
inductive "widen G" intrs (*widening, viz. method invocation conversion, cf. 5.3 |
|
67 |
i.e. sort of syntactic subtyping *) |
|
68 |
refl "G\\<turnstile> T \\<preceq> T" (* identity conv., cf. 5.1.1 *) |
|
8106 | 69 |
subcls "G\\<turnstile>C\\<preceq>C D \\<Longrightarrow> G\\<turnstile>Class C \\<preceq> Class D" |
8011 | 70 |
null "G\\<turnstile> NT \\<preceq> RefT R" |
71 |
||
9246 | 72 |
inductive "cast G" intrs (* casting conversion, cf. 5.5 / 5.1.5 *) |
73 |
widen "G\\<turnstile>S\\<preceq>T \\<Longrightarrow> G\\<turnstile> S \\<preceq>? T" |
|
74 |
subcls "G\\<turnstile>C\\<preceq>C D \\<Longrightarrow> G\\<turnstile>Class D \\<preceq>? Class C" |
|
8011 | 75 |
|
76 |
end |