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