src/HOL/IMP/OO.thy
author haftmann
Mon, 02 Aug 2021 10:01:06 +0000
changeset 74101 d804e93ae9ff
parent 67406 23307fd33906
permissions -rw-r--r--
moved theory Bit_Operations into Main corpus
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
43158
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
     1
theory OO imports Main begin
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
     2
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
     3
subsection "Towards an OO Language: A Language of Records"
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
     4
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
     5
(* FIXME: move to HOL/Fun *)
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
     6
abbreviation fun_upd2 :: "('a \<Rightarrow> 'b \<Rightarrow> 'c) \<Rightarrow> 'a \<Rightarrow> 'b \<Rightarrow> 'c \<Rightarrow> 'a \<Rightarrow> 'b \<Rightarrow> 'c"
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
     7
  ("_/'((2_,_ :=/ _)')" [1000,0,0,0] 900)
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
     8
where "f(x,y := z) == f(x := (f x)(y := z))"
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
     9
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    10
type_synonym addr = nat
58310
91ea607a34d8 updated news
blanchet
parents: 58249
diff changeset
    11
datatype ref = null | Ref addr
43158
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    12
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    13
type_synonym obj = "string \<Rightarrow> ref"
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    14
type_synonym venv = "string \<Rightarrow> ref"
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    15
type_synonym store = "addr \<Rightarrow> obj"
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    16
58310
91ea607a34d8 updated news
blanchet
parents: 58249
diff changeset
    17
datatype exp =
43158
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    18
  Null |
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    19
  New |
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    20
  V string |
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    21
  Faccess exp string       ("_\<bullet>/_" [63,1000] 63) |
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    22
  Vassign string exp       ("(_ ::=/ _)" [1000,61] 62) |
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    23
  Fassign exp string exp   ("(_\<bullet>_ ::=/ _)" [63,0,62] 62) |
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    24
  Mcall exp string exp     ("(_\<bullet>/_<_>)" [63,0,0] 63) |
47818
151d137f1095 renamed Semi to Seq
nipkow
parents: 43158
diff changeset
    25
  Seq exp exp              ("_;/ _" [61,60] 60) |
43158
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    26
  If bexp exp exp          ("IF _/ THEN (2_)/ ELSE (2_)" [0,0,61] 61)
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    27
and bexp = B bool | Not bexp | And bexp bexp | Eq exp exp
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    28
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    29
type_synonym menv = "string \<Rightarrow> exp"
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    30
type_synonym config = "venv \<times> store \<times> addr"
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    31
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    32
inductive
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    33
  big_step :: "menv \<Rightarrow> exp \<times> config \<Rightarrow> ref \<times> config \<Rightarrow> bool"
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    34
    ("(_ \<turnstile>/ (_/ \<Rightarrow> _))" [60,0,60] 55) and
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    35
  bval ::  "menv \<Rightarrow> bexp \<times> config \<Rightarrow> bool \<times> config \<Rightarrow> bool"
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    36
    ("_ \<turnstile> _ \<rightarrow> _" [60,0,60] 55)
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    37
where
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    38
Null:
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    39
"me \<turnstile> (Null,c) \<Rightarrow> (null,c)" |
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    40
New:
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    41
"me \<turnstile> (New,ve,s,n) \<Rightarrow> (Ref n,ve,s(n := (\<lambda>f. null)),n+1)" |
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    42
Vaccess:
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    43
"me \<turnstile> (V x,ve,sn) \<Rightarrow> (ve x,ve,sn)" |
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    44
Faccess:
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    45
"me \<turnstile> (e,c) \<Rightarrow> (Ref a,ve',s',n') \<Longrightarrow>
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    46
 me \<turnstile> (e\<bullet>f,c) \<Rightarrow> (s' a f,ve',s',n')" |
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    47
Vassign:
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    48
"me \<turnstile> (e,c) \<Rightarrow> (r,ve',sn') \<Longrightarrow>
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    49
 me \<turnstile> (x ::= e,c) \<Rightarrow> (r,ve'(x:=r),sn')" |
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    50
Fassign:
53015
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 47818
diff changeset
    51
"\<lbrakk> me \<turnstile> (oe,c\<^sub>1) \<Rightarrow> (Ref a,c\<^sub>2);  me \<turnstile> (e,c\<^sub>2) \<Rightarrow> (r,ve\<^sub>3,s\<^sub>3,n\<^sub>3) \<rbrakk> \<Longrightarrow>
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 47818
diff changeset
    52
 me \<turnstile> (oe\<bullet>f ::= e,c\<^sub>1) \<Rightarrow> (r,ve\<^sub>3,s\<^sub>3(a,f := r),n\<^sub>3)" |
43158
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    53
Mcall:
53015
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 47818
diff changeset
    54
"\<lbrakk> me \<turnstile> (oe,c\<^sub>1) \<Rightarrow> (or,c\<^sub>2);  me \<turnstile> (pe,c\<^sub>2) \<Rightarrow> (pr,ve\<^sub>3,sn\<^sub>3);
43158
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    55
   ve = (\<lambda>x. null)(''this'' := or, ''param'' := pr);
53015
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 47818
diff changeset
    56
   me \<turnstile> (me m,ve,sn\<^sub>3) \<Rightarrow> (r,ve',sn\<^sub>4) \<rbrakk>
43158
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    57
  \<Longrightarrow>
74101
d804e93ae9ff moved theory Bit_Operations into Main corpus
haftmann
parents: 67406
diff changeset
    58
 me \<turnstile> (oe\<bullet>m<pe>,c\<^sub>1) \<Rightarrow> (r,ve\<^sub>3,sn\<^sub>4)" for or |
47818
151d137f1095 renamed Semi to Seq
nipkow
parents: 43158
diff changeset
    59
Seq:
53015
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 47818
diff changeset
    60
"\<lbrakk> me \<turnstile> (e\<^sub>1,c\<^sub>1) \<Rightarrow> (r,c\<^sub>2);  me \<turnstile> (e\<^sub>2,c\<^sub>2) \<Rightarrow> c\<^sub>3 \<rbrakk> \<Longrightarrow>
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 47818
diff changeset
    61
 me \<turnstile> (e\<^sub>1; e\<^sub>2,c\<^sub>1) \<Rightarrow> c\<^sub>3" |
43158
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    62
IfTrue:
53015
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 47818
diff changeset
    63
"\<lbrakk> me \<turnstile> (b,c\<^sub>1) \<rightarrow> (True,c\<^sub>2);  me \<turnstile> (e\<^sub>1,c\<^sub>2) \<Rightarrow> c\<^sub>3 \<rbrakk> \<Longrightarrow>
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 47818
diff changeset
    64
 me \<turnstile> (IF b THEN e\<^sub>1 ELSE e\<^sub>2,c\<^sub>1) \<Rightarrow> c\<^sub>3" |
43158
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    65
IfFalse:
53015
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 47818
diff changeset
    66
"\<lbrakk> me \<turnstile> (b,c\<^sub>1) \<rightarrow> (False,c\<^sub>2);  me \<turnstile> (e\<^sub>2,c\<^sub>2) \<Rightarrow> c\<^sub>3 \<rbrakk> \<Longrightarrow>
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 47818
diff changeset
    67
 me \<turnstile> (IF b THEN e\<^sub>1 ELSE e\<^sub>2,c\<^sub>1) \<Rightarrow> c\<^sub>3" |
43158
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    68
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    69
"me \<turnstile> (B bv,c) \<rightarrow> (bv,c)" |
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    70
53015
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 47818
diff changeset
    71
"me \<turnstile> (b,c\<^sub>1) \<rightarrow> (bv,c\<^sub>2) \<Longrightarrow> me \<turnstile> (Not b,c\<^sub>1) \<rightarrow> (\<not>bv,c\<^sub>2)" |
43158
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    72
53015
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 47818
diff changeset
    73
"\<lbrakk> me \<turnstile> (b\<^sub>1,c\<^sub>1) \<rightarrow> (bv\<^sub>1,c\<^sub>2);  me \<turnstile> (b\<^sub>2,c\<^sub>2) \<rightarrow> (bv\<^sub>2,c\<^sub>3) \<rbrakk> \<Longrightarrow>
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 47818
diff changeset
    74
 me \<turnstile> (And b\<^sub>1 b\<^sub>2,c\<^sub>1) \<rightarrow> (bv\<^sub>1\<and>bv\<^sub>2,c\<^sub>3)" |
43158
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    75
53015
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 47818
diff changeset
    76
"\<lbrakk> me \<turnstile> (e\<^sub>1,c\<^sub>1) \<Rightarrow> (r\<^sub>1,c\<^sub>2);  me \<turnstile> (e\<^sub>2,c\<^sub>2) \<Rightarrow> (r\<^sub>2,c\<^sub>3) \<rbrakk> \<Longrightarrow>
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 47818
diff changeset
    77
 me \<turnstile> (Eq e\<^sub>1 e\<^sub>2,c\<^sub>1) \<rightarrow> (r\<^sub>1=r\<^sub>2,c\<^sub>3)"
43158
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    78
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    79
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    80
code_pred (modes: i => i => o => bool) big_step .
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    81
67406
23307fd33906 isabelle update_cartouches -c;
wenzelm
parents: 58310
diff changeset
    82
text\<open>Example: natural numbers encoded as objects with a predecessor
43158
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    83
field. Null is zero. Method succ adds an object in front, method add
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    84
adds as many objects in front as the parameter specifies.
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    85
67406
23307fd33906 isabelle update_cartouches -c;
wenzelm
parents: 58310
diff changeset
    86
First, the method bodies:\<close>
43158
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    87
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    88
definition
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    89
"m_succ  =  (''s'' ::= New)\<bullet>''pred'' ::= V ''this''; V ''s''"
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    90
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    91
definition "m_add =
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    92
  IF Eq (V ''param'') Null
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    93
  THEN V ''this''
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    94
  ELSE V ''this''\<bullet>''succ''<Null>\<bullet>''add''<V ''param''\<bullet>''pred''>"
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    95
67406
23307fd33906 isabelle update_cartouches -c;
wenzelm
parents: 58310
diff changeset
    96
text\<open>The method environment:\<close>
43158
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    97
definition
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    98
"menv = (\<lambda>m. Null)(''succ'' := m_succ, ''add'' := m_add)"
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
    99
67406
23307fd33906 isabelle update_cartouches -c;
wenzelm
parents: 58310
diff changeset
   100
text\<open>The main code, adding 1 and 2:\<close>
43158
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
   101
definition "main =
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
   102
  ''1'' ::= Null\<bullet>''succ''<Null>;
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
   103
  ''2'' ::= V ''1''\<bullet>''succ''<Null>;
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
   104
  V ''2'' \<bullet> ''add'' <V ''1''>"
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
   105
67406
23307fd33906 isabelle update_cartouches -c;
wenzelm
parents: 58310
diff changeset
   106
text\<open>Execution of semantics. The final variable environment and store are
43158
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
   107
converted into lists of references based on given lists of variable and field
67406
23307fd33906 isabelle update_cartouches -c;
wenzelm
parents: 58310
diff changeset
   108
names to extract.\<close>
43158
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
   109
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
   110
values
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
   111
 "{(r, map ve' [''1'',''2''], map (\<lambda>n. map (s' n)[''pred'']) [0..<n])|
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
   112
    r ve' s' n. menv \<turnstile> (main, \<lambda>x. null, nth[], 0) \<Rightarrow> (r,ve',s',n)}"
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
   113
686fa0a0696e imported rest of new IMP
kleing
parents:
diff changeset
   114
end