src/HOL/MicroJava/BV/DFA_err.thy
author kleing
Tue, 12 Dec 2000 14:08:26 +0100
changeset 10650 114999ff8d19
parent 10592 fc0b575a2cf7
child 11085 b830bf10bf71
permissions -rw-r--r--
added direction dynamic ==> static
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10496
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
     1
(*  Title:      HOL/BCV/DFA_err.thy
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
     2
    ID:         $Id$
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
     3
    Author:     Gerwin Klein
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
     4
    Copyright   2000 TUM
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
     5
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
     6
static and dynamic welltyping 
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
     7
*)
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
     8
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
     9
header "Static and Dynamic Welltyping"
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    10
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    11
theory DFA_err = DFA_Framework:
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    12
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    13
constdefs
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    14
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    15
dynamic_wt :: "'s ord => (nat => 's err => 's err) => (nat => nat list) => 
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    16
               's err list => bool"
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    17
"dynamic_wt r step succs ts == welltyping (Err.le r) Err step succs ts"
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    18
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    19
static_wt :: "'s ord => (nat => 's => bool) => 
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    20
              (nat => 's => 's) => (nat => nat list) =>  's list => bool"
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    21
"static_wt r app step succs ts == 
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    22
  !p < size ts. app p (ts!p) & (!q:set(succs p). step p (ts!p) <=_r ts!q)"
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    23
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    24
err_step :: "(nat => 's => bool) => (nat => 's => 's) => 
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    25
             (nat => 's err => 's err)"
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    26
"err_step app step p == lift (%t. if app p t then OK (step p t) else Err)"
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    27
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    28
non_empty :: "(nat => nat list) => bool"
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    29
"non_empty succs == !p. succs p ~= []"
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    30
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    31
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    32
lemma non_emptyD:
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    33
  "non_empty succs ==> ? q. q:set(succs p)"
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    34
proof (unfold non_empty_def)
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    35
  assume "!p. succs p ~= []"
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    36
  hence "succs p ~= []" ..
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    37
  then obtain x xs where "succs p = x#xs"
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    38
    by (auto simp add: neq_Nil_conv)
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    39
  thus ?thesis 
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    40
    by auto
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    41
qed
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    42
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    43
lemma dynamic_imp_static:
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    44
  "[| bounded succs (size ts); non_empty succs;
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    45
      dynamic_wt r (err_step app step) succs ts |] 
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    46
  ==> static_wt r app step succs (map ok_val ts)"
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    47
proof (unfold static_wt_def, intro strip, rule conjI)
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    48
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    49
  assume b:  "bounded succs (size ts)"
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    50
  assume n:  "non_empty succs"
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    51
  assume wt: "dynamic_wt r (err_step app step) succs ts"
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    52
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    53
  fix p 
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    54
  assume "p < length (map ok_val ts)"
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    55
  hence lp: "p < length ts" by simp
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    56
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    57
  from wt lp
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    58
  have [intro?]: "!!p. p < length ts ==> ts ! p ~= Err" 
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    59
    by (unfold dynamic_wt_def welltyping_def) simp
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    60
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    61
  show app: "app p (map ok_val ts ! p)"
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    62
  proof -
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    63
    from n
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    64
    obtain q where q: "q:set(succs p)"
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    65
      by (auto dest: non_emptyD)
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    66
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    67
    from wt lp q
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    68
    obtain s where
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    69
      OKp:  "ts ! p = OK s" and
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    70
      less: "err_step app step p (ts ! p) <=_(Err.le r) ts ! q"
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    71
      by (unfold dynamic_wt_def welltyping_def stable_def) 
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    72
         (auto iff: not_Err_eq)
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    73
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    74
    from lp b q
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    75
    have lq: "q < length ts"
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    76
      by (unfold bounded_def) blast
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    77
    hence "ts!q ~= Err" ..
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    78
    then
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    79
    obtain s' where OKq: "ts ! q = OK s'"
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    80
      by (auto iff: not_Err_eq)      
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    81
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    82
    with OKp less
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    83
    have "app p s"
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    84
      by (simp add: err_step_def lift_def split: err.split_asm split_if_asm)
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    85
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    86
    with lp OKp
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    87
    show ?thesis
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    88
      by simp
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    89
  qed
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    90
  
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    91
  show "!q:set(succs p). step p (map ok_val ts ! p) <=_r map ok_val ts ! q"
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    92
  proof (intro strip)
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    93
    fix q
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    94
    assume q: "q:set (succs p)"
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    95
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    96
    from wt lp q
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    97
    obtain s where
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    98
      OKp:  "ts ! p = OK s" and
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
    99
      less: "err_step app step p (ts ! p) <=_(Err.le r) ts ! q"
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
   100
      by (unfold dynamic_wt_def welltyping_def stable_def) 
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
   101
         (auto iff: not_Err_eq)
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
   102
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
   103
    from lp b q
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
   104
    have lq: "q < length ts"
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
   105
      by (unfold bounded_def) blast
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
   106
    hence "ts!q ~= Err" ..
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
   107
    then
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
   108
    obtain s' where OKq: "ts ! q = OK s'"
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
   109
      by (auto iff: not_Err_eq)      
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
   110
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
   111
    from lp lq OKp OKq app less
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
   112
    show "step p (map ok_val ts ! p) <=_r map ok_val ts ! q"
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
   113
      by (simp add: err_step_def lift_def)
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
   114
  qed
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
   115
qed
f2d304bdf3cc BCV integration (first step)
kleing
parents:
diff changeset
   116
10650
114999ff8d19 added direction dynamic ==> static
kleing
parents: 10592
diff changeset
   117
114999ff8d19 added direction dynamic ==> static
kleing
parents: 10592
diff changeset
   118
lemma static_imp_dynamic:
114999ff8d19 added direction dynamic ==> static
kleing
parents: 10592
diff changeset
   119
  "[| static_wt r app step succs ts; bounded succs (size ts) |] 
114999ff8d19 added direction dynamic ==> static
kleing
parents: 10592
diff changeset
   120
  ==> dynamic_wt r (err_step app step) succs (map OK ts)"
114999ff8d19 added direction dynamic ==> static
kleing
parents: 10592
diff changeset
   121
proof (unfold dynamic_wt_def welltyping_def, intro strip, rule conjI)
114999ff8d19 added direction dynamic ==> static
kleing
parents: 10592
diff changeset
   122
  assume bounded: "bounded succs (size ts)"
114999ff8d19 added direction dynamic ==> static
kleing
parents: 10592
diff changeset
   123
  assume static:  "static_wt r app step succs ts"
114999ff8d19 added direction dynamic ==> static
kleing
parents: 10592
diff changeset
   124
  fix p assume "p < length (map OK ts)" 
114999ff8d19 added direction dynamic ==> static
kleing
parents: 10592
diff changeset
   125
  hence p: "p < length ts" by simp
114999ff8d19 added direction dynamic ==> static
kleing
parents: 10592
diff changeset
   126
  thus "map OK ts ! p \<noteq> Err" by simp
114999ff8d19 added direction dynamic ==> static
kleing
parents: 10592
diff changeset
   127
  { fix q
114999ff8d19 added direction dynamic ==> static
kleing
parents: 10592
diff changeset
   128
    assume q: "q : set (succs p)"
114999ff8d19 added direction dynamic ==> static
kleing
parents: 10592
diff changeset
   129
    with p static obtain 
114999ff8d19 added direction dynamic ==> static
kleing
parents: 10592
diff changeset
   130
      "app p (ts ! p)" "step p (ts ! p) <=_r ts ! q"
114999ff8d19 added direction dynamic ==> static
kleing
parents: 10592
diff changeset
   131
      by (unfold static_wt_def) blast
114999ff8d19 added direction dynamic ==> static
kleing
parents: 10592
diff changeset
   132
    moreover
114999ff8d19 added direction dynamic ==> static
kleing
parents: 10592
diff changeset
   133
    from q p bounded
114999ff8d19 added direction dynamic ==> static
kleing
parents: 10592
diff changeset
   134
    have "q < size ts" by (unfold bounded_def) blast
114999ff8d19 added direction dynamic ==> static
kleing
parents: 10592
diff changeset
   135
    hence "map OK ts ! q = OK (ts!q)" by simp
114999ff8d19 added direction dynamic ==> static
kleing
parents: 10592
diff changeset
   136
    moreover
114999ff8d19 added direction dynamic ==> static
kleing
parents: 10592
diff changeset
   137
    have "p < size ts" by (rule p)
114999ff8d19 added direction dynamic ==> static
kleing
parents: 10592
diff changeset
   138
    ultimately     
114999ff8d19 added direction dynamic ==> static
kleing
parents: 10592
diff changeset
   139
    have "err_step app step p (map OK ts ! p) <=_(Err.le r) map OK ts ! q"
114999ff8d19 added direction dynamic ==> static
kleing
parents: 10592
diff changeset
   140
      by (simp add: err_step_def lift_def)
114999ff8d19 added direction dynamic ==> static
kleing
parents: 10592
diff changeset
   141
  }
114999ff8d19 added direction dynamic ==> static
kleing
parents: 10592
diff changeset
   142
  thus "stable (Err.le r) (err_step app step) succs (map OK ts) p"
114999ff8d19 added direction dynamic ==> static
kleing
parents: 10592
diff changeset
   143
    by (unfold stable_def) blast
114999ff8d19 added direction dynamic ==> static
kleing
parents: 10592
diff changeset
   144
qed
114999ff8d19 added direction dynamic ==> static
kleing
parents: 10592
diff changeset
   145
114999ff8d19 added direction dynamic ==> static
kleing
parents: 10592
diff changeset
   146
end