src/HOL/MicroJava/J/TypeRel.thy
author kleing
Thu, 21 Sep 2000 10:42:49 +0200
changeset 10042 7164dc0d24d8
parent 9348 f495dba0cb07
child 10061 fe82134773dc
permissions -rw-r--r--
unsymbolized
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
     1
(*  Title:      HOL/MicroJava/J/TypeRel.thy
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
     2
    ID:         $Id$
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
     3
    Author:     David von Oheimb
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
     4
    Copyright   1999 Technische Universitaet Muenchen
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
     5
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
     6
The relations between Java types
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
     7
*)
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
     8
9346
297dcbf64526 re-structuring MicroJava; added Example; corrected := syntax; simplfied cast
oheimb
parents: 9246
diff changeset
     9
TypeRel = Decl +
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    10
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    11
consts
10042
7164dc0d24d8 unsymbolized
kleing
parents: 9348
diff changeset
    12
  subcls1	:: "'c prog => (cname \\<times> cname) set"  (* subclass *)
7164dc0d24d8 unsymbolized
kleing
parents: 9348
diff changeset
    13
  widen 	:: "'c prog => (ty    \\<times> ty   ) set"  (* widening *)
7164dc0d24d8 unsymbolized
kleing
parents: 9348
diff changeset
    14
  cast		:: "'c prog => (cname \\<times> cname) set"  (* casting *)
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    15
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    16
syntax
10042
7164dc0d24d8 unsymbolized
kleing
parents: 9348
diff changeset
    17
  subcls1	:: "'c prog => [cname, cname] => bool" ("_\\<turnstile>_\\<prec>C1_"	 [71,71,71] 70)
7164dc0d24d8 unsymbolized
kleing
parents: 9348
diff changeset
    18
  subcls	:: "'c prog => [cname, cname] => bool" ("_\\<turnstile>_\\<preceq>C _"	 [71,71,71] 70)
7164dc0d24d8 unsymbolized
kleing
parents: 9348
diff changeset
    19
  widen		:: "'c prog => [ty   , ty   ] => bool" ("_\\<turnstile>_\\<preceq>_"  [71,71,71] 70)
7164dc0d24d8 unsymbolized
kleing
parents: 9348
diff changeset
    20
  cast		:: "'c prog => [cname, cname] => bool" ("_\\<turnstile>_\\<preceq>? _"[71,71,71] 70)
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    21
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    22
translations
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    23
  	"G\\<turnstile>C \\<prec>C1 D" == "(C,D) \\<in> subcls1 G"
8106
de9fae0cdfde improved symbol for subcls relation
oheimb
parents: 8082
diff changeset
    24
	"G\\<turnstile>C \\<preceq>C  D" == "(C,D) \\<in> (subcls1 G)^*"
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    25
	"G\\<turnstile>S \\<preceq>   T" == "(S,T) \\<in> widen   G"
9348
f495dba0cb07 corrections (cast relation, Prog.ML -> Decl.ML)
oheimb
parents: 9346
diff changeset
    26
	"G\\<turnstile>C \\<preceq>?  D" == "(C,D) \\<in> cast    G"
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    27
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    28
defs
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    29
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    30
  (* direct subclass, cf. 8.1.3 *)
10042
7164dc0d24d8 unsymbolized
kleing
parents: 9348
diff changeset
    31
  subcls1_def	"subcls1 G == {(C,D). \\<exists>c. class G C = Some c \\<and> fst c = Some D}"
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    32
  
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    33
consts
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    34
10042
7164dc0d24d8 unsymbolized
kleing
parents: 9348
diff changeset
    35
  method	:: "'c prog \\<times> cname => ( sig   \\<leadsto> cname \\<times> ty \\<times> 'c)"
7164dc0d24d8 unsymbolized
kleing
parents: 9348
diff changeset
    36
  field	:: "'c prog \\<times> cname => ( vname \\<leadsto> cname \\<times> ty)"
7164dc0d24d8 unsymbolized
kleing
parents: 9348
diff changeset
    37
  fields	:: "'c prog \\<times> cname => ((vname \\<times> cname) \\<times>  ty) list"
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    38
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    39
constdefs       (* auxiliary relations for recursive definitions below *)
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    40
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    41
  subcls1_rel	:: "(('c prog \\<times> cname) \\<times> ('c prog \\<times> cname)) set"
10042
7164dc0d24d8 unsymbolized
kleing
parents: 9348
diff changeset
    42
 "subcls1_rel == {((G,C),(G',C')). G = G' \\<and>  wf ((subcls1 G)^-1) \\<and>  G\\<turnstile>C'\\<prec>C1C}"
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    43
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    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"
10042
7164dc0d24d8 unsymbolized
kleing
parents: 9348
diff changeset
    46
 "method (G,C) = (if wf((subcls1 G)^-1) then (case class G C of None => empty
7164dc0d24d8 unsymbolized
kleing
parents: 9348
diff changeset
    47
                   | Some (sc,fs,ms) => (case sc of None => empty | Some D => 
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
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    49
                                                           else arbitrary) \\<oplus>
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    50
                                           map_of (map (\\<lambda>(s,  m ). 
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    51
                                                        (s,(C,m))) ms))
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    52
                  else arbitrary)"
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    53
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    54
(* list of fields of a class, including inherited and hidden ones *)
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    55
recdef fields  "subcls1_rel"
10042
7164dc0d24d8 unsymbolized
kleing
parents: 9348
diff changeset
    56
 "fields (G,C) = (if wf((subcls1 G)^-1) then (case class G C of None => arbitrary
7164dc0d24d8 unsymbolized
kleing
parents: 9348
diff changeset
    57
                   | Some (sc,fs,ms) => map (\\<lambda>(fn,ft). ((fn,C),ft)) fs@
7164dc0d24d8 unsymbolized
kleing
parents: 9348
diff changeset
    58
                                           (case sc of None => [] | Some D => 
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    59
                                           if is_class G D then fields (G,D) 
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    60
                                                           else arbitrary))
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    61
                  else arbitrary)"
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    62
defs
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    63
10042
7164dc0d24d8 unsymbolized
kleing
parents: 9348
diff changeset
    64
  field_def "field == map_of o (map (\\<lambda>((fn,fd),ft). (fn,(fd,ft)))) o fields"
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    65
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    66
inductive "widen G" intrs (*widening, viz. method invocation conversion, cf. 5.3
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    67
			     i.e. sort of syntactic subtyping *)
9348
f495dba0cb07 corrections (cast relation, Prog.ML -> Decl.ML)
oheimb
parents: 9346
diff changeset
    68
  refl	             "G\\<turnstile>      T \\<preceq> T" 	 (* identity conv., cf. 5.1.1 *)
10042
7164dc0d24d8 unsymbolized
kleing
parents: 9348
diff changeset
    69
  subcls "G\\<turnstile>C\\<preceq>C D ==> G\\<turnstile>Class C \\<preceq> Class D"
9348
f495dba0cb07 corrections (cast relation, Prog.ML -> Decl.ML)
oheimb
parents: 9346
diff changeset
    70
  null	             "G\\<turnstile>     NT \\<preceq> RefT R"
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    71
9246
91423cd08c6f corrected symbol for casting relation
oheimb
parents: 8106
diff changeset
    72
inductive "cast G" intrs (* casting conversion, cf. 5.5 / 5.1.5 *)
9348
f495dba0cb07 corrections (cast relation, Prog.ML -> Decl.ML)
oheimb
parents: 9346
diff changeset
    73
                         (* left out casts on primitve types    *)
10042
7164dc0d24d8 unsymbolized
kleing
parents: 9348
diff changeset
    74
  widen	 "G\\<turnstile>C\\<preceq>C D ==> G\\<turnstile>C \\<preceq>? D"
7164dc0d24d8 unsymbolized
kleing
parents: 9348
diff changeset
    75
  subcls "G\\<turnstile>D\\<preceq>C C ==> G\\<turnstile>C \\<preceq>? D"
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    76
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    77
end