src/HOL/BCV/JVM.thy
author nipkow
Wed, 29 Nov 2000 17:23:27 +0100
changeset 10539 5929460a41df
parent 9791 a39e5d43de55
permissions -rw-r--r--
*** empty log message ***
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9791
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
     1
(*  Title:      HOL/BCV/JVM.thy
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
     2
    ID:         $Id$
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
     3
    Author:     Tobias Nipkow
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
     4
    Copyright   2000 TUM
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
     5
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
     6
A micro-JVM
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
     7
*)
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
     8
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
     9
JVM = Kildall + JType + Opt + Product +
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    10
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    11
types mname
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    12
arities mname :: term
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    13
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    14
datatype instr =
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    15
    Load nat | Store nat | AConst_Null | IConst int
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    16
  | IAdd | Getfield ty cname | Putfield ty cname
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    17
  | New cname
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    18
  | Invoke cname mname ty ty
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    19
  | CmpEq nat
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    20
  | Return
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    21
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    22
types mdict = "cname => (mname * ty ~=> ty)"
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    23
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    24
constdefs
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    25
 wfi :: subclass => mdict => nat => instr => bool
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    26
"wfi S md maxr i == case i of
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    27
   Load n => n < maxr
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    28
 | Store n => n < maxr
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    29
 | AConst_Null => True
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    30
 | IConst j => True
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    31
 | IAdd => True
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    32
 | Getfield T C => is_type S T & is_type S (Class C)
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    33
 | Putfield T C => is_type S T & is_type S (Class C)
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    34
 | New C => is_type S (Class C)
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    35
 | Invoke C m pT rT => md C (m,pT) = Some(rT)
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    36
 | CmpEq n => True
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    37
 | Return => True"
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    38
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    39
 wfis :: subclass => mdict => nat => instr list => bool
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    40
"wfis S md maxr ins == !i : set ins. wfi S md maxr i"
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    41
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    42
types config = "ty list * ty err list"
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    43
      state  = config err option
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    44
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    45
constdefs
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    46
 stk_esl :: subclass => nat => ty list esl
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    47
"stk_esl S maxs == upto_esl maxs (JType.esl S)"
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    48
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    49
 reg_sl :: subclass => nat => ty err list sl
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    50
"reg_sl S maxr == Listn.sl maxr (Err.sl (JType.esl S))"
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    51
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    52
 sl :: subclass => nat => nat => state sl
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    53
"sl S maxs maxr ==
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    54
 Opt.sl(Err.sl(Product.esl (stk_esl S maxs) (Err.esl(reg_sl S maxr))))"
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    55
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    56
 states :: subclass => nat => nat => state set
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    57
"states S maxs maxr == fst(sl S maxs maxr)"
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    58
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    59
 le :: subclass => nat => nat => state ord
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    60
"le S maxs maxr == fst(snd(sl S maxs maxr))"
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    61
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    62
 sup :: subclass => nat => nat => state binop
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    63
"sup S maxs maxr == snd(snd(sl S maxs maxr))"
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    64
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    65
syntax "@lle" :: state => subclass => state => bool
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    66
       ("(_ /<<='__ _)" [50, 1000, 51] 50)
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    67
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    68
translations
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    69
"x <<=_S y" => "x <=_(le S arbitrary arbitrary) y"
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    70
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    71
constdefs
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    72
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    73
 wf_mdict :: subclass => mdict => bool
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    74
"wf_mdict S md ==
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    75
 !C mpT rT. md C mpT = Some(rT)
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    76
    --> is_type S rT &
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    77
        (!C'. (C',C) : S^*
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    78
            --> (EX rT'. md C' mpT = Some(rT') & rT' [=_S rT))"
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    79
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    80
 wti :: subclass => nat => ty => instr list => state list => nat => bool
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    81
"wti S maxs rT bs ss p ==
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    82
 case ss!p of
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    83
   None => True
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    84
 | Some e =>
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    85
 (case e of
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    86
   Err => False
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    87
 | OK (st,reg) =>
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    88
 (case bs!p of
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    89
   Load n => size st < maxs &
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    90
             (? T. reg!n = OK T & Some(OK(T#st,reg)) <<=_S ss!(p+1))
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    91
 | Store n => (? T Ts. st = T#Ts & Some(OK(Ts,reg[n := OK T])) <<=_S ss!(p+1))
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    92
 | AConst_Null => size st < maxs & Some(OK(NullT#st,reg)) <<=_S ss!(p+1)
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    93
 | IConst i => size st < maxs & Some(OK(Integer#st,reg)) <<=_S ss!(p+1)
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    94
 | IAdd => (? Ts. st = Integer#Integer#Ts &
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    95
                  Some(OK(Integer#Ts,reg)) <<=_S ss!(p+1))
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    96
 | Getfield fT C => (? T Ts. st = T#Ts & T [=_S Class(C) &
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    97
                            Some(OK(fT#Ts,reg)) <<=_S ss!(p+1))
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    98
 | Putfield fT C => (? vT oT Ts. st = vT#oT#Ts & vT [=_S fT & oT [=_S Class C &
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
    99
                                 Some(OK(Ts,reg)) <<=_S ss!(p+1))
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   100
 | New C => (size st < maxs & Some(OK((Class C)#st,reg)) <<=_S ss!(p+1))
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   101
 | Invoke C m pT rT =>
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   102
   (? aT oT Ts. st = aT#oT#Ts & oT [=_S Class C & aT [=_S pT &
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   103
                Some(OK(rT#Ts,reg)) <<=_S ss!(p+1))
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   104
 | CmpEq q => (? T1 T2 Ts. st = T1#T2#Ts & (T1=T2 | is_ref T1 & is_ref T2) &
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   105
                           Some(OK(Ts,reg)) <<=_S ss!(p+1) &
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   106
                           Some(OK(Ts,reg)) <<=_S ss!q)
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   107
 | Return => (? T Ts. st = T#Ts & T [=_S rT)))"
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   108
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   109
 succs :: "instr list => nat => nat list"
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   110
"succs bs p ==
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   111
  case bs!p of
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   112
    Load n       => [p+1]
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   113
  | Store n      => [p+1]
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   114
  | AConst_Null  => [p+1]
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   115
  | IConst i     => [p+1]
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   116
  | IAdd         => [p+1]
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   117
  | Getfield x C => [p+1]
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   118
  | Putfield x C => [p+1]
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   119
  | New C        => [p+1]
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   120
  | Invoke C m pT rT => [p+1]
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   121
  | CmpEq q      => [p+1,q]
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   122
  | Return       => [p]"
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   123
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   124
 exec :: "subclass => nat => ty => instr => config => config err"
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   125
"exec S maxs rT instr == %(st,reg).
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   126
  case instr of
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   127
    Load n => if size st < maxs
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   128
              then case reg!n of Err => Err | OK T => OK(T#st,reg)
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   129
              else Err
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   130
  | Store n => (case st of [] => Err | T#Ts => OK(Ts,reg[n := OK T]))
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   131
  | AConst_Null => if size st < maxs then OK(NullT#st,reg) else Err
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   132
  | IConst i => if size st < maxs then OK(Integer#st,reg) else Err
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   133
  | IAdd =>
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   134
      (case st of [] => Err | T1#st1 =>
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   135
      (case st1 of [] => Err | T2#st2 =>
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   136
       if T1 = Integer & T2 = Integer then OK(st1,reg) else Err))
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   137
  | Getfield fT C =>
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   138
      (case st of [] => Err | oT#st' =>
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   139
      (if oT [=_S Class(C) then OK(fT#st',reg) else Err))
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   140
  | Putfield fT C =>
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   141
      (case st of [] => Err | vT#st1 =>
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   142
      (case st1 of [] => Err | oT#st2 =>
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   143
       if vT [=_S fT & oT [=_S Class C then OK(st2,reg) else Err))
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   144
  | New C => if size st < maxs then OK((Class C)#st,reg) else Err
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   145
  | Invoke C m pT rT =>
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   146
      (case st of [] => Err | aT#st1 =>
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   147
      (case st1 of [] => Err | oT#st2 =>
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   148
       if oT [=_S Class C & aT [=_S pT then OK(rT#st2,reg) else Err))
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   149
  | CmpEq q =>
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   150
      (case st of [] => Err | T1#st1 =>
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   151
      (case st1 of [] => Err | T2#st2 =>
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   152
       if T1=T2 | is_ref T1 & is_ref T2 then OK(st2,reg) else Err))
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   153
  | Return =>
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   154
      (case st of [] => Err | T#Ts =>
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   155
       if T [=_S rT then OK(st,reg) else Err)"
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   156
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   157
 step :: "subclass => nat => ty => instr list => nat => state => state"
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   158
"step S maxs rT bs p == option_map (lift (exec S maxs rT (bs!p)))"
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   159
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   160
 kiljvm ::
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   161
    "subclass => nat => nat => ty => instr list => state list => state list"
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   162
"kiljvm S maxs maxr rT bs ==
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   163
 kildall (sl S maxs maxr) (step S maxs rT bs) (succs bs)"
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   164
a39e5d43de55 Completely new version of BCV
nipkow
parents:
diff changeset
   165
end