src/HOL/ex/NBE.thy
author haftmann
Fri, 25 Jan 2008 14:53:56 +0100
changeset 25963 07e08dad8a77
parent 25876 64647dcd2293
child 26017 31115576b858
permissions -rw-r--r--
distinguished examples for Efficient_Nat.thy
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
     1
(*  ID:         $Id$
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
     2
    Author:     Klaus Aehlig, Tobias Nipkow
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
     3
    Work in progress
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
     4
*)
25876
nipkow
parents: 25873
diff changeset
     5
header {* Normalization by Evaluation *}
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
     6
23854
688a8a7bcd4e uniform naming conventions for CG theories
haftmann
parents: 23778
diff changeset
     7
theory NBE imports Main Executable_Set begin
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
     8
25876
nipkow
parents: 25873
diff changeset
     9
ML"Syntax.ambiguity_level := 1000000"
nipkow
parents: 25873
diff changeset
    10
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    11
declare Let_def[simp]
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    12
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    13
consts_code undefined ("(raise Match)")
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    14
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    15
(*typedecl const_name*)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    16
types lam_var_name = nat
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    17
      ml_var_name = nat
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    18
      const_name = nat
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    19
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
    20
datatype ml = (* rep of universal datatype *)
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    21
          C const_name "ml list" | V lam_var_name "ml list"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    22
        | Fun ml "ml list" nat
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    23
        | "apply" ml ml (* function 'apply' *)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    24
          (* ML *)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    25
        | V_ML ml_var_name | A_ML ml "ml list" | Lam_ML ml
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    26
        | CC const_name (* ref to compiled code *)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    27
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
    28
datatype tm = Ct const_name | Vt lam_var_name | Lam tm | At tm tm
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
    29
            | term_of ml (* function 'to_term' *)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
    30
25680
909bfa21acc2 Adapted to changes in size function.
berghofe
parents: 24448
diff changeset
    31
lemma [simp]: "x \<in> set vs \<Longrightarrow> size x < Suc (list_size size vs)"
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    32
by (induct vs) auto
25680
909bfa21acc2 Adapted to changes in size function.
berghofe
parents: 24448
diff changeset
    33
lemma [simp]:"x \<in> set vs \<Longrightarrow> size x < Suc (size v + list_size size vs)"
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    34
by (induct vs) auto
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    35
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    36
locale Vars =
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    37
 fixes r s t:: tm
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    38
 and rs ss ts :: "tm list"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    39
 and u v w :: ml
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    40
 and us vs ws :: "ml list"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    41
 and nm :: const_name
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    42
 and x :: lam_var_name
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    43
 and X :: ml_var_name
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    44
23778
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
    45
inductive_set Pure_tms :: "tm set"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
    46
where
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
    47
  "Ct s : Pure_tms"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
    48
| "Vt x : Pure_tms"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
    49
| "t : Pure_tms ==> Lam t : Pure_tms"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
    50
| "s : Pure_tms ==> t : Pure_tms ==> At s t : Pure_tms"
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    51
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    52
consts
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    53
  R :: "(const_name * tm list * tm)set" (* reduction rules *)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    54
  compR :: "(const_name * ml list * ml)set" (* compiled reduction rules *)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    55
25876
nipkow
parents: 25873
diff changeset
    56
fun lift_ml :: "nat \<Rightarrow> ml \<Rightarrow> ml" ("lift") where
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    57
"lift i (C nm vs) = C nm (map (lift i) vs)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    58
"lift i (V x vs) = V (if x < i then x else x+1) (map (lift i) vs)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    59
"lift i (Fun v vs n) = Fun (lift i v) (map (lift i) vs) n" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    60
"lift i (apply u v) = apply (lift i u) (lift i v)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    61
"lift i (V_ML X) = V_ML X" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    62
"lift i (A_ML v vs) = A_ML (lift i v) (map (lift i) vs)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    63
"lift i (Lam_ML v) = Lam_ML (lift i v)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    64
"lift i (CC nm) = CC nm"
25876
nipkow
parents: 25873
diff changeset
    65
nipkow
parents: 25873
diff changeset
    66
lemmas ml_induct = lift_ml.induct[of "%i v. P v", standard]
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    67
25876
nipkow
parents: 25873
diff changeset
    68
fun lift_tm :: "nat \<Rightarrow> tm \<Rightarrow> tm" ("lift") where
nipkow
parents: 25873
diff changeset
    69
"lift i (Ct nm) = Ct nm" |
nipkow
parents: 25873
diff changeset
    70
"lift i (Vt x) = Vt(if x < i then x else x+1)" |
nipkow
parents: 25873
diff changeset
    71
"lift i (Lam t) = Lam (lift (i+1) t)" |
nipkow
parents: 25873
diff changeset
    72
"lift i (At s t) = At (lift i s) (lift i t)" |
nipkow
parents: 25873
diff changeset
    73
"lift i (term_of v) = term_of (lift i v)"
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    74
25876
nipkow
parents: 25873
diff changeset
    75
fun lift_ml_ML :: "nat \<Rightarrow> ml \<Rightarrow> ml" ("lift\<^bsub>ML\<^esub>") where
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    76
"lift\<^bsub>ML\<^esub> i (C nm vs) = C nm (map (lift\<^bsub>ML\<^esub> i) vs)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    77
"lift\<^bsub>ML\<^esub> i (V x vs) = V x (map (lift\<^bsub>ML\<^esub> i) vs)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    78
"lift\<^bsub>ML\<^esub> i (Fun v vs n) = Fun (lift\<^bsub>ML\<^esub> i v) (map (lift\<^bsub>ML\<^esub> i) vs) n" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    79
"lift\<^bsub>ML\<^esub> i (apply u v) = apply (lift\<^bsub>ML\<^esub> i u) (lift\<^bsub>ML\<^esub> i v)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    80
"lift\<^bsub>ML\<^esub> i (V_ML X) = V_ML (if X < i then X else X+1)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    81
"lift\<^bsub>ML\<^esub> i (A_ML v vs) = A_ML (lift\<^bsub>ML\<^esub> i v) (map (lift\<^bsub>ML\<^esub> i) vs)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    82
"lift\<^bsub>ML\<^esub> i (Lam_ML v) = Lam_ML (lift\<^bsub>ML\<^esub> (i+1) v)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    83
"lift\<^bsub>ML\<^esub> i (CC nm) = CC nm"
25876
nipkow
parents: 25873
diff changeset
    84
nipkow
parents: 25873
diff changeset
    85
fun lift_tm_ML :: "nat \<Rightarrow> tm \<Rightarrow> tm" ("lift\<^bsub>ML\<^esub>") where
nipkow
parents: 25873
diff changeset
    86
"lift\<^bsub>ML\<^esub> i (Ct nm) = Ct nm" |
nipkow
parents: 25873
diff changeset
    87
"lift\<^bsub>ML\<^esub> i (Vt x) = Vt x" |
nipkow
parents: 25873
diff changeset
    88
"lift\<^bsub>ML\<^esub> i (Lam t) = Lam (lift\<^bsub>ML\<^esub> i t)" |
nipkow
parents: 25873
diff changeset
    89
"lift\<^bsub>ML\<^esub> i (At s t) = At (lift\<^bsub>ML\<^esub> i s) (lift\<^bsub>ML\<^esub> i t)" |
nipkow
parents: 25873
diff changeset
    90
"lift\<^bsub>ML\<^esub> i (term_of v) = term_of (lift\<^bsub>ML\<^esub> i v)"
nipkow
parents: 25873
diff changeset
    91
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    92
constdefs
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    93
 cons :: "tm \<Rightarrow> (nat \<Rightarrow> tm) \<Rightarrow> (nat \<Rightarrow> tm)" (infix "##" 65)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    94
"t##f \<equiv> \<lambda>i. case i of 0 \<Rightarrow> t | Suc j \<Rightarrow> lift 0 (f j)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    95
 cons_ML :: "ml \<Rightarrow> (nat \<Rightarrow> ml) \<Rightarrow> (nat \<Rightarrow> ml)" (infix "##" 65)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    96
"v##f \<equiv> \<lambda>i. case i of 0 \<Rightarrow> v::ml | Suc j \<Rightarrow> lift\<^bsub>ML\<^esub> 0 (f j)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    97
25876
nipkow
parents: 25873
diff changeset
    98
text{* Only for pure terms! *}
nipkow
parents: 25873
diff changeset
    99
primrec subst :: "(nat \<Rightarrow> tm) \<Rightarrow> tm \<Rightarrow> tm" where
nipkow
parents: 25873
diff changeset
   100
"subst f (Ct nm) = Ct nm" |
nipkow
parents: 25873
diff changeset
   101
"subst f (Vt x) = f x" |
nipkow
parents: 25873
diff changeset
   102
"subst f (Lam t) = Lam (subst (Vt 0 ## f) t)" |
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   103
"subst f (At s t) = At (subst f s) (subst f t)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   104
25680
909bfa21acc2 Adapted to changes in size function.
berghofe
parents: 24448
diff changeset
   105
lemma list_size_map [simp]: "list_size f (map g xs) = list_size (f o g) xs"
25876
nipkow
parents: 25873
diff changeset
   106
by (induct xs) simp_all
25680
909bfa21acc2 Adapted to changes in size function.
berghofe
parents: 24448
diff changeset
   107
909bfa21acc2 Adapted to changes in size function.
berghofe
parents: 24448
diff changeset
   108
lemma list_size_cong [cong]:
909bfa21acc2 Adapted to changes in size function.
berghofe
parents: 24448
diff changeset
   109
  "\<lbrakk>xs = ys; \<And>x. x \<in> set ys \<Longrightarrow> f x = g x\<rbrakk> \<Longrightarrow> list_size f xs = list_size g ys"
25876
nipkow
parents: 25873
diff changeset
   110
by (induct xs arbitrary: ys) auto
25680
909bfa21acc2 Adapted to changes in size function.
berghofe
parents: 24448
diff changeset
   111
25876
nipkow
parents: 25873
diff changeset
   112
lemma size_lift_ml[simp]: "size(lift i (v::ml)) = size v"
nipkow
parents: 25873
diff changeset
   113
by (induct i v rule: lift_ml.induct) simp_all
nipkow
parents: 25873
diff changeset
   114
lemma size_lift_tm[simp]: "size(lift i t) = size(t::tm)"
nipkow
parents: 25873
diff changeset
   115
by (induct i t rule: lift_tm.induct) simp_all
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   116
25876
nipkow
parents: 25873
diff changeset
   117
lemma size_lift_ml_ML[simp]: "size(lift\<^bsub>ML\<^esub> i (v::ml)) = size v"
nipkow
parents: 25873
diff changeset
   118
by (induct i v rule: lift_ml_ML.induct) simp_all
nipkow
parents: 25873
diff changeset
   119
lemma size_lift_tm_ML[simp]: "size(lift\<^bsub>ML\<^esub> i t) = size(t::tm)"
nipkow
parents: 25873
diff changeset
   120
by (induct i t rule: lift_tm_ML.induct) simp_all
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   121
25876
nipkow
parents: 25873
diff changeset
   122
fun subst_ml_ML :: "(nat \<Rightarrow> ml) \<Rightarrow> ml \<Rightarrow> ml" ("subst\<^bsub>ML\<^esub>") where
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   123
"subst\<^bsub>ML\<^esub> f (C nm vs) = C nm (map (subst\<^bsub>ML\<^esub> f) vs)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   124
"subst\<^bsub>ML\<^esub> f (V x vs) = V x (map (subst\<^bsub>ML\<^esub> f) vs)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   125
"subst\<^bsub>ML\<^esub> f (Fun v vs n) = Fun (subst\<^bsub>ML\<^esub> f v) (map (subst\<^bsub>ML\<^esub> f) vs) n" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   126
"subst\<^bsub>ML\<^esub> f (apply u v) = apply (subst\<^bsub>ML\<^esub> f u) (subst\<^bsub>ML\<^esub> f v)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   127
"subst\<^bsub>ML\<^esub> f (V_ML X) = f X" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   128
"subst\<^bsub>ML\<^esub> f (A_ML v vs) = A_ML (subst\<^bsub>ML\<^esub> f v) (map (subst\<^bsub>ML\<^esub> f) vs)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   129
"subst\<^bsub>ML\<^esub> f (Lam_ML v) = Lam_ML (subst\<^bsub>ML\<^esub> (V_ML 0 ## f) v)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   130
"subst\<^bsub>ML\<^esub> f (CC nm) = CC nm"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   131
25876
nipkow
parents: 25873
diff changeset
   132
fun subst_tm_ML :: "(nat \<Rightarrow> ml) \<Rightarrow> tm \<Rightarrow> tm" ("subst\<^bsub>ML\<^esub>") where
nipkow
parents: 25873
diff changeset
   133
"subst\<^bsub>ML\<^esub> f (Ct nm) = Ct nm" |
nipkow
parents: 25873
diff changeset
   134
"subst\<^bsub>ML\<^esub> f (Vt x) = Vt x" |
nipkow
parents: 25873
diff changeset
   135
"subst\<^bsub>ML\<^esub> f (Lam t) = Lam (subst\<^bsub>ML\<^esub> (lift 0 o f) t)" |
nipkow
parents: 25873
diff changeset
   136
"subst\<^bsub>ML\<^esub> f (At s t) = At (subst\<^bsub>ML\<^esub> f s) (subst\<^bsub>ML\<^esub> f t)" |
nipkow
parents: 25873
diff changeset
   137
"subst\<^bsub>ML\<^esub> f (term_of v) = term_of (subst\<^bsub>ML\<^esub> f v)"
nipkow
parents: 25873
diff changeset
   138
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   139
(* FIXME currrently needed for code generator *)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   140
lemmas [code] = lift_tm_ML.simps lift_ml_ML.simps
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   141
lemmas [code] = lift_tm.simps lift_ml.simps
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   142
lemmas [code] = subst_tm_ML.simps subst_ml_ML.simps
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   143
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   144
abbreviation
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   145
  subst_decr :: "nat \<Rightarrow> tm \<Rightarrow> nat \<Rightarrow> tm" where
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   146
 "subst_decr k t == %n. if n<k then Vt n else if n=k then t else Vt(n - 1)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   147
abbreviation
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   148
  subst_decr_ML :: "nat \<Rightarrow> ml \<Rightarrow> nat \<Rightarrow> ml" where
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   149
 "subst_decr_ML k v == %n. if n<k then V_ML n else if n=k then v else V_ML(n - 1)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   150
abbreviation
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   151
  subst1 :: "tm \<Rightarrow> tm \<Rightarrow> nat \<Rightarrow> tm" ("(_/[_'/_])" [300, 0, 0] 300) where
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   152
 "s[t/k] == subst (subst_decr k t) s"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   153
abbreviation
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   154
  subst1_ML :: "ml \<Rightarrow> ml \<Rightarrow> nat \<Rightarrow> ml" ("(_/[_'/_])" [300, 0, 0] 300) where
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   155
 "u[v/k] == subst\<^bsub>ML\<^esub> (subst_decr_ML k v) u"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   156
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   157
25876
nipkow
parents: 25873
diff changeset
   158
lemma size_subst_ml_ML[simp]:
nipkow
parents: 25873
diff changeset
   159
  "(!x. size(f x) = 0) \<longrightarrow> size(subst\<^bsub>ML\<^esub> f (v::ml)) = size v"
nipkow
parents: 25873
diff changeset
   160
by (induct f v rule: subst_ml_ML.induct)
nipkow
parents: 25873
diff changeset
   161
    (simp_all add: cons_ML_def split: nat.split)
nipkow
parents: 25873
diff changeset
   162
lemma size_subst_tm_ML[simp]:
25680
909bfa21acc2 Adapted to changes in size function.
berghofe
parents: 24448
diff changeset
   163
  "(!x. size(f x) = 0) \<longrightarrow> size(subst\<^bsub>ML\<^esub> f t) = size(t::tm)"
25876
nipkow
parents: 25873
diff changeset
   164
by (induct f t rule: subst_tm_ML.induct) (simp_all add: o_def)
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   165
25876
nipkow
parents: 25873
diff changeset
   166
lemma lift_lift_ml: includes Vars shows
nipkow
parents: 25873
diff changeset
   167
  "i < k+1 \<Longrightarrow> lift (Suc k) (lift i v) = lift i (lift k v)"
nipkow
parents: 25873
diff changeset
   168
by(induct i v rule:lift_ml.induct)
nipkow
parents: 25873
diff changeset
   169
  (simp_all add:map_compose[symmetric])
nipkow
parents: 25873
diff changeset
   170
lemma lift_lift_tm: includes Vars shows
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   171
    "i < k+1 \<Longrightarrow> lift (Suc k) (lift i t) = lift i (lift k t)"
25876
nipkow
parents: 25873
diff changeset
   172
by(induct t arbitrary: i rule:lift_tm.induct)(simp_all add:lift_lift_ml)
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   173
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   174
corollary lift_o_lift: shows
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   175
 "i < k+1 \<Longrightarrow> lift_tm (Suc k) o (lift_tm i) = lift_tm i o lift_tm k" and
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   176
 "i < k+1 \<Longrightarrow> lift_ml (Suc k) o (lift_ml i) = lift_ml i o lift_ml k"
25876
nipkow
parents: 25873
diff changeset
   177
by(rule ext, simp add:lift_lift_ml lift_lift_tm)+
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   178
25876
nipkow
parents: 25873
diff changeset
   179
lemma lift_lift_ml_ML: includes Vars shows
nipkow
parents: 25873
diff changeset
   180
  "i < k+1 \<Longrightarrow> lift\<^bsub>ML\<^esub> (Suc k) (lift\<^bsub>ML\<^esub> i v) = lift\<^bsub>ML\<^esub> i (lift\<^bsub>ML\<^esub> k v)"
nipkow
parents: 25873
diff changeset
   181
by(induct v arbitrary: i rule:lift_ml_ML.induct)
nipkow
parents: 25873
diff changeset
   182
  (simp_all add:map_compose[symmetric])
nipkow
parents: 25873
diff changeset
   183
lemma lift_lift_tm_ML: includes Vars shows
nipkow
parents: 25873
diff changeset
   184
  "i < k+1 \<Longrightarrow> lift\<^bsub>ML\<^esub> (Suc k) (lift\<^bsub>ML\<^esub> i t) = lift\<^bsub>ML\<^esub> i (lift\<^bsub>ML\<^esub> k t)"
nipkow
parents: 25873
diff changeset
   185
by(induct t arbitrary: i rule:lift_tm_ML.induct)(simp_all add:lift_lift_ml_ML)
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   186
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   187
25876
nipkow
parents: 25873
diff changeset
   188
lemma lift_lift_ml_ML_comm: includes Vars shows
nipkow
parents: 25873
diff changeset
   189
  "lift j (lift\<^bsub>ML\<^esub> i v) = lift\<^bsub>ML\<^esub> i (lift j v)"
nipkow
parents: 25873
diff changeset
   190
by(induct v arbitrary: i j rule:lift_ml_ML.induct)
nipkow
parents: 25873
diff changeset
   191
  (simp_all add:map_compose[symmetric])
nipkow
parents: 25873
diff changeset
   192
lemma lift_lift_tm_ML_comm: includes Vars shows
nipkow
parents: 25873
diff changeset
   193
 "lift j (lift\<^bsub>ML\<^esub> i t) = lift\<^bsub>ML\<^esub> i (lift j t)"
nipkow
parents: 25873
diff changeset
   194
by(induct t arbitrary: i j rule:lift_tm_ML.induct)
nipkow
parents: 25873
diff changeset
   195
  (simp_all add:lift_lift_ml_ML_comm)
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   196
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   197
lemma [simp]:
25876
nipkow
parents: 25873
diff changeset
   198
  "V_ML 0 ## subst_decr_ML k v = subst_decr_ML (Suc k) (lift\<^bsub>ML\<^esub> 0 v)"
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   199
by(rule ext)(simp add:cons_ML_def split:nat.split)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   200
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   201
lemma [simp]: "lift 0 o subst_decr_ML k v = subst_decr_ML k (lift 0 v)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   202
by(rule ext)(simp add:cons_ML_def split:nat.split)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   203
25876
nipkow
parents: 25873
diff changeset
   204
lemma subst_lift_ml_id[simp]: includes Vars shows "(lift\<^bsub>ML\<^esub> k u)[v/k] = u"
nipkow
parents: 25873
diff changeset
   205
apply(induct k u arbitrary: v rule: lift_ml_ML.induct)
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   206
apply (simp_all add:map_idI map_compose[symmetric])
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   207
apply (simp cong:if_cong)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   208
done
25876
nipkow
parents: 25873
diff changeset
   209
lemma subst_lift_tm_id[simp]: includes Vars shows
nipkow
parents: 25873
diff changeset
   210
  "subst\<^bsub>ML\<^esub> (subst_decr_ML k v) (lift\<^bsub>ML\<^esub> k t) = t"
nipkow
parents: 25873
diff changeset
   211
by (induct k t arbitrary: v rule: lift_tm_ML.induct) simp_all
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   212
23778
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   213
inductive_set
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   214
  tRed :: "(tm * tm)set" (* beta red + eta exp + R reduction on pure terms *)
23778
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   215
  and tred :: "[tm, tm] => bool"  (infixl "\<rightarrow>" 50)
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   216
where
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   217
  "s \<rightarrow> t == (s, t) \<in> tRed"
23778
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   218
| "At (Lam t) s \<rightarrow> t[s/0]"
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   219
| "t \<rightarrow> Lam (At (lift 0 t) (Vt 0))"
23778
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   220
| "(nm,ts,t) : R ==> foldl At (Ct nm) (map (subst rs) ts) \<rightarrow> subst rs t"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   221
| "t \<rightarrow> t' ==> Lam t \<rightarrow> Lam t'"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   222
| "s \<rightarrow> s' ==> At s t \<rightarrow> At s' t"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   223
| "t \<rightarrow> t' ==> At s t \<rightarrow> At s t'"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   224
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   225
abbreviation
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   226
  treds :: "[tm, tm] => bool"  (infixl "\<rightarrow>*" 50) where
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   227
  "s \<rightarrow>* t == (s, t) \<in> tRed^*"
23778
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   228
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   229
inductive_set
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   230
  tRed_list :: "(tm list * tm list) set"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   231
  and treds_list :: "[tm list, tm list] \<Rightarrow> bool" (infixl "\<rightarrow>*" 50)
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   232
where
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   233
  "ss \<rightarrow>* ts == (ss, ts) \<in> tRed_list"
23778
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   234
| "[] \<rightarrow>* []"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   235
| "ts \<rightarrow>* ts' ==> t \<rightarrow>* t' ==> t#ts \<rightarrow>* t'#ts'"
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   236
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   237
declare tRed_list.intros[simp]
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   238
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   239
lemma tRed_list_refl[simp]: includes Vars shows "ts \<rightarrow>* ts"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   240
by(induct ts) auto
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   241
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   242
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   243
fun ML_closed :: "nat \<Rightarrow> ml \<Rightarrow> bool"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   244
and ML_closed_t :: "nat \<Rightarrow> tm \<Rightarrow> bool" where
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   245
"ML_closed i (C nm vs) = (ALL v:set vs. ML_closed i v)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   246
"ML_closed i (V nm vs) = (ALL v:set vs. ML_closed i v)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   247
"ML_closed i (Fun f vs n) = (ML_closed i f & (ALL v:set vs. ML_closed i v))" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   248
"ML_closed i (A_ML v vs) = (ML_closed i v & (ALL v:set vs. ML_closed i v))" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   249
"ML_closed i (apply v w) = (ML_closed i v & ML_closed i w)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   250
"ML_closed i (CC nm) = True" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   251
"ML_closed i (V_ML X) = (X<i)"  |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   252
"ML_closed i (Lam_ML v) = ML_closed (i+1) v" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   253
"ML_closed_t i (term_of v) = ML_closed i v" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   254
"ML_closed_t i (At r s) = (ML_closed_t i r & ML_closed_t i s)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   255
"ML_closed_t i (Lam t) = (ML_closed_t i t)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   256
"ML_closed_t i v = True"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   257
thm ML_closed.simps ML_closed_t.simps
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   258
23778
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   259
inductive_set
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   260
  Red :: "(ml * ml)set"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   261
  and Redt :: "(tm * tm)set"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   262
  and Redl :: "(ml list * ml list)set"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   263
  and red :: "[ml, ml] => bool"  (infixl "\<Rightarrow>" 50)
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   264
  and redl :: "[ml list, ml list] => bool"  (infixl "\<Rightarrow>" 50)
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   265
  and redt :: "[tm, tm] => bool"  (infixl "\<Rightarrow>" 50)
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   266
  and reds :: "[ml, ml] => bool"  (infixl "\<Rightarrow>*" 50)
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   267
  and redts :: "[tm, tm] => bool"  (infixl "\<Rightarrow>*" 50)
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   268
where
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   269
  "s \<Rightarrow> t == (s, t) \<in> Red"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   270
| "s \<Rightarrow> t == (s, t) \<in> Redl"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   271
| "s \<Rightarrow> t == (s, t) \<in> Redt"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   272
| "s \<Rightarrow>* t == (s, t) \<in> Red^*"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   273
| "s \<Rightarrow>* t == (s, t) \<in> Redt^*"
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   274
(* ML *)
23778
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   275
| "A_ML (Lam_ML u) [v] \<Rightarrow> u[v/0]"
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   276
(* compiled rules *)
23778
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   277
| "(nm,vs,v) : compR ==> ALL i. ML_closed 0 (f i) \<Longrightarrow> A_ML (CC nm) (map (subst\<^bsub>ML\<^esub> f) vs) \<Rightarrow> subst\<^bsub>ML\<^esub> f v"
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   278
(* apply *)
23778
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   279
| apply_Fun1: "apply (Fun f vs (Suc 0)) v \<Rightarrow> A_ML f (vs @ [v])"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   280
| apply_Fun2: "n > 0 ==>
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   281
 apply (Fun f vs (Suc n)) v \<Rightarrow> Fun f (vs @ [v]) n"
23778
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   282
| apply_C: "apply (C nm vs) v \<Rightarrow> C nm (vs @ [v])"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   283
| apply_V: "apply (V x vs) v \<Rightarrow> V x (vs @ [v])"
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   284
(* term_of *)
23778
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   285
| term_of_C: "term_of (C nm vs) \<Rightarrow> foldl At (Ct nm) (map term_of vs)"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   286
| term_of_V: "term_of (V x vs) \<Rightarrow> foldl At (Vt x) (map term_of vs)"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   287
| term_of_Fun: "term_of(Fun vf vs n) \<Rightarrow>
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   288
 Lam (term_of ((apply (lift 0 (Fun vf vs n)) (V_ML 0))[V 0 []/0]))"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   289
(* Context *)
23778
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   290
| ctxt_Lam: "t \<Rightarrow> t' ==> Lam t \<Rightarrow> Lam t'"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   291
| ctxt_At1: "s \<Rightarrow> s' ==> At s t \<Rightarrow> At s' t"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   292
| ctxt_At2: "t \<Rightarrow> t' ==> At s t \<Rightarrow> At s t'"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   293
| ctxt_term_of: "v \<Rightarrow> v' ==> term_of v \<Rightarrow> term_of v'"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   294
| ctxt_C: "vs \<Rightarrow> vs' ==> C nm vs \<Rightarrow> C nm vs'"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   295
| ctxt_V: "vs \<Rightarrow> vs' ==> V x vs \<Rightarrow> V x vs'"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   296
| ctxt_Fun1: "f \<Rightarrow> f'   ==> Fun f vs n \<Rightarrow> Fun f' vs n"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   297
| ctxt_Fun3: "vs \<Rightarrow> vs' ==> Fun f vs n \<Rightarrow> Fun f vs' n"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   298
| ctxt_apply1: "s \<Rightarrow> s'   ==> apply s t \<Rightarrow> apply s' t"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   299
| ctxt_apply2: "t \<Rightarrow> t'   ==> apply s t \<Rightarrow> apply s t'"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   300
| ctxt_A_ML1: "f \<Rightarrow> f'   ==> A_ML f vs \<Rightarrow> A_ML f' vs"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   301
| ctxt_A_ML2: "vs \<Rightarrow> vs' ==> A_ML f vs \<Rightarrow> A_ML f vs'"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   302
| ctxt_list1: "v \<Rightarrow> v'   ==> v#vs \<Rightarrow> v'#vs"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   303
| ctxt_list2: "vs \<Rightarrow> vs' ==> v#vs \<Rightarrow> v#vs'"
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   304
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   305
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   306
consts
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   307
 ar :: "const_name \<Rightarrow> nat"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   308
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   309
axioms
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   310
ar_pos: "ar nm > 0"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   311
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   312
types env = "ml list"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   313
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   314
consts eval :: "tm \<Rightarrow> env \<Rightarrow> ml"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   315
primrec
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   316
"eval (Vt x) e = e!x"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   317
"eval (Ct nm) e = Fun (CC nm) [] (ar nm)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   318
"eval (At s t) e = apply (eval s e) (eval t e)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   319
"eval (Lam t) e = Fun (Lam_ML (eval t ((V_ML 0) # map (lift\<^bsub>ML\<^esub> 0) e))) [] 1"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   320
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   321
fun size' :: "ml \<Rightarrow> nat" where
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   322
"size' (C nm vs) = (\<Sum>v\<leftarrow>vs. size' v)+1" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   323
"size' (V nm vs) = (\<Sum>v\<leftarrow>vs. size' v)+1" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   324
"size' (Fun f vs n) = (size' f + (\<Sum>v\<leftarrow>vs. size' v))+1" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   325
"size' (A_ML v vs) = (size' v + (\<Sum>v\<leftarrow>vs. size' v))+1" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   326
"size' (apply v w) = (size' v + size' w)+1" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   327
"size' (CC nm) = 1" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   328
"size' (V_ML X) = 1"  |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   329
"size' (Lam_ML v) = size' v + 1"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   330
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   331
lemma listsum_size'[simp]:
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   332
 "v \<in> set vs \<Longrightarrow> size' v < Suc(listsum (map size' vs))"
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   333
by(induct vs)(auto)
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   334
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   335
corollary cor_listsum_size'[simp]:
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   336
 "v \<in> set vs \<Longrightarrow> size' v < Suc(m + listsum (map size' vs))"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   337
using listsum_size'[of v vs] by arith
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   338
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   339
lemma size'_lift_ML: "size' (lift\<^bsub>ML\<^esub> k v) = size' v"
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   340
apply(induct v arbitrary:k rule:size'.induct)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   341
apply(simp add:map_compose[symmetric])
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   342
apply(rule arg_cong[where f = listsum])
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   343
apply(rule map_ext)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   344
apply simp
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   345
apply(simp add:map_compose[symmetric])
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   346
apply(rule arg_cong[where f = listsum])
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   347
apply(rule map_ext)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   348
apply simp
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   349
apply(simp add:map_compose[symmetric])
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   350
apply(rule arg_cong[where f = listsum])
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   351
apply(rule map_ext)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   352
apply simp
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   353
apply(simp add:map_compose[symmetric])
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   354
apply(rule arg_cong[where f = listsum])
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   355
apply(rule map_ext)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   356
apply simp
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   357
apply(simp)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   358
apply simp
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   359
apply simp
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   360
apply(simp)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   361
done
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   362
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   363
(* FIXME needed? *)
25876
nipkow
parents: 25873
diff changeset
   364
lemma size_subst_ml_ML[simp]: includes Vars shows
nipkow
parents: 25873
diff changeset
   365
 "!i. size(f i) = 0 \<Longrightarrow> size(subst\<^bsub>ML\<^esub> f v) = size(v)"
nipkow
parents: 25873
diff changeset
   366
by (induct f v rule: subst_ml_ML.induct)
nipkow
parents: 25873
diff changeset
   367
    (simp_all add: cons_ML_def split: nat.split)
nipkow
parents: 25873
diff changeset
   368
lemma size_subst_tm_ML[simp]: includes Vars shows
nipkow
parents: 25873
diff changeset
   369
  "!i. size(f i) = 0 \<Longrightarrow> size(subst\<^bsub>ML\<^esub> f t) = size(t)"
nipkow
parents: 25873
diff changeset
   370
by (induct f t rule: subst_tm_ML.induct)(simp_all add: o_def)
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   371
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   372
(* FIXME name and use explicitly *)
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   373
lemma [simp]:
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   374
 "\<forall>i j. size'(f i) = 1 \<Longrightarrow> size' (subst\<^bsub>ML\<^esub> f v) = size' v"
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   375
apply(induct v arbitrary:f rule:size'.induct)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   376
apply(simp add:map_compose[symmetric])
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   377
apply(rule arg_cong[where f = listsum])
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   378
apply(rule map_ext)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   379
apply simp
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   380
apply(simp add:map_compose[symmetric])
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   381
apply(rule arg_cong[where f = listsum])
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   382
apply(rule map_ext)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   383
apply simp
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   384
apply(simp add:map_compose[symmetric])
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   385
apply(rule arg_cong[where f = listsum])
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   386
apply(rule map_ext)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   387
apply simp
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   388
apply(simp add:map_compose[symmetric])
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   389
apply(rule arg_cong[where f = listsum])
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   390
apply(rule map_ext)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   391
apply simp
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   392
apply(simp)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   393
apply(simp)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   394
apply(simp)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   395
apply(simp)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   396
apply(erule meta_allE)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   397
apply(erule meta_mp)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   398
apply(simp add:cons_ML_def size'_lift_ML split:nat.split)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   399
done
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   400
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   401
lemma [simp]: "size' (lift i v) = size' v"
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   402
apply(induct v arbitrary:i rule:size'.induct)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   403
apply(simp add:map_compose[symmetric])
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   404
apply(rule arg_cong[where f = listsum])
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   405
apply(rule map_ext)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   406
apply simp
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   407
apply(simp add:map_compose[symmetric])
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   408
apply(rule arg_cong[where f = listsum])
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   409
apply(rule map_ext)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   410
apply simp
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   411
apply(simp add:map_compose[symmetric])
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   412
apply(rule arg_cong[where f = listsum])
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   413
apply(rule map_ext)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   414
apply simp
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   415
apply(simp add:map_compose[symmetric])
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   416
apply(rule arg_cong[where f = listsum])
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   417
apply(rule map_ext)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   418
apply simp
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   419
apply simp
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   420
apply simp
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   421
apply simp
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   422
apply simp
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   423
done
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   424
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   425
(* the kernel function as in Section 4.1 of "Operational aspects\<dots>" *)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   426
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   427
function kernel  :: "ml \<Rightarrow> tm" ("_!" 300) where
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   428
"(C nm vs)! = foldl At (Ct nm) (map kernel vs)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   429
"(Lam_ML v)! = Lam (((lift 0 v)[V 0 []/0])!)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   430
"(Fun f vs n)! = foldl At (f!) (map kernel vs)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   431
"(A_ML v vs)! = foldl At (v!) (map kernel vs)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   432
"(apply v w)! = At (v!) (w!)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   433
"(CC nm)! = Ct nm" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   434
"(V x vs)! = foldl At (Vt x) (map kernel vs)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   435
"(V_ML X)! = undefined"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   436
by pat_completeness auto
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   437
termination by(relation "measure size'") auto
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   438
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   439
consts kernelt :: "tm \<Rightarrow> tm" ("_!" 300)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   440
primrec 
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   441
"(Ct nm)! = Ct nm"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   442
"(term_of v)! = v!"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   443
"(Vt x)! = Vt x"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   444
"(At s t)! = At (s!) (t!)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   445
"(Lam t)! = Lam (t!)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   446
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   447
abbreviation
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   448
  kernels :: "ml list \<Rightarrow> tm list" ("_!" 300) where
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   449
  "vs ! == map kernel vs"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   450
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   451
(* soundness of the code generator *)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   452
axioms
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   453
compiler_correct:
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   454
"(nm, vs, v) : compR ==> ALL i. ML_closed 0 (f i) \<Longrightarrow> (nm, (map (subst\<^bsub>ML\<^esub> f) vs)!, (subst\<^bsub>ML\<^esub> f v)!) : R"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   455
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   456
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   457
consts
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   458
  free_vars :: "tm \<Rightarrow> lam_var_name set"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   459
primrec
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   460
"free_vars (Ct nm) = {}"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   461
"free_vars (Vt x) = {x}"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   462
"free_vars (Lam t) = {i. EX j : free_vars t. j = i+1}"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   463
"free_vars (At s t) = free_vars s \<union> free_vars t"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   464
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   465
lemma [simp]: "t : Pure_tms \<Longrightarrow> lift\<^bsub>ML\<^esub> k t = t"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   466
by (erule Pure_tms.induct) simp_all
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   467
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   468
lemma kernel_pure: includes Vars assumes "t : Pure_tms" shows "t! = t"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   469
using assms by (induct) simp_all
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   470
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   471
lemma lift_eval:
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   472
 "t : Pure_tms \<Longrightarrow> ALL e k. (ALL i : free_vars t. i < size e) --> lift k (eval t e) = eval t (map (lift k) e)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   473
apply(induct set:Pure_tms)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   474
apply simp_all
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   475
apply clarsimp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   476
apply(erule_tac x = "V_ML 0 # map (lift\<^bsub>ML\<^esub> 0) e" in allE)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   477
apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   478
apply(erule impE)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   479
 apply clarsimp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   480
 apply(case_tac i)apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   481
 apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   482
apply (simp add: map_compose[symmetric])
25876
nipkow
parents: 25873
diff changeset
   483
apply (simp add: o_def lift_lift_ml_ML_comm)
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   484
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   485
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   486
lemma lift_ML_eval[rule_format]:
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   487
 "t : Pure_tms \<Longrightarrow> ALL e k. (ALL i : free_vars t. i < size e) --> lift\<^bsub>ML\<^esub> k (eval t e) = eval t (map (lift\<^bsub>ML\<^esub> k) e)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   488
apply(induct set:Pure_tms)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   489
apply simp_all
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   490
apply clarsimp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   491
apply(erule_tac x = "V_ML 0 # map (lift\<^bsub>ML\<^esub> 0) e" in allE)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   492
apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   493
apply(erule impE)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   494
 apply clarsimp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   495
 apply(case_tac i)apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   496
 apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   497
apply (simp add: map_compose[symmetric])
25876
nipkow
parents: 25873
diff changeset
   498
apply (simp add:o_def lift_lift_ml_ML)
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   499
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   500
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   501
lemma [simp]: includes Vars shows "(v ## f) 0 = v"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   502
by(simp add:cons_ML_def)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   504
lemma [simp]:  includes Vars shows "(v ## f) (Suc n) = lift\<^bsub>ML\<^esub> 0 (f n)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   505
by(simp add:cons_ML_def)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   506
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   507
lemma lift_o_shift: "lift k o (V_ML 0 ## f) = (V_ML 0 ## (lift k \<circ> f))"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   508
apply(rule ext)
25876
nipkow
parents: 25873
diff changeset
   509
apply (simp add:cons_ML_def lift_lift_ml_ML_comm split:nat.split)
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   510
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   511
25876
nipkow
parents: 25873
diff changeset
   512
lemma lift_subst_ML_ml:
nipkow
parents: 25873
diff changeset
   513
 "lift_ml k (subst\<^bsub>ML\<^esub> f v) = subst\<^bsub>ML\<^esub> (lift_ml k o f) (lift_ml k v)"
nipkow
parents: 25873
diff changeset
   514
by (induct k v arbitrary: f rule: lift_ml.induct)
nipkow
parents: 25873
diff changeset
   515
   (simp_all add:map_compose[symmetric] o_assoc lift_o_lift lift_o_shift)
nipkow
parents: 25873
diff changeset
   516
lemma lift_subst_ML_tm: shows
nipkow
parents: 25873
diff changeset
   517
 "lift_tm k (subst\<^bsub>ML\<^esub> f t) = subst\<^bsub>ML\<^esub> (lift_ml k o f) (lift_tm k t)"
nipkow
parents: 25873
diff changeset
   518
by(induct k t arbitrary: f rule: lift_tm.induct)
nipkow
parents: 25873
diff changeset
   519
  (simp_all add: o_assoc lift_o_lift lift_subst_ML_ml)
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   520
25876
nipkow
parents: 25873
diff changeset
   521
corollary lift_subst_ML1:
nipkow
parents: 25873
diff changeset
   522
  "\<forall>v k. lift_ml 0 (u[v/k]) = (lift_ml 0 u)[lift 0 v/k]"
nipkow
parents: 25873
diff changeset
   523
apply(induct u rule:ml_induct)
nipkow
parents: 25873
diff changeset
   524
apply(simp_all add:lift_lift_ml map_compose[symmetric] lift_subst_ML_ml)
nipkow
parents: 25873
diff changeset
   525
apply(subst lift_lift_ml_ML_comm)apply simp
nipkow
parents: 25873
diff changeset
   526
done
nipkow
parents: 25873
diff changeset
   527
(*
nipkow
parents: 25873
diff changeset
   528
lemma lift_ML_lift_ML_ml: includes Vars shows
nipkow
parents: 25873
diff changeset
   529
  "i < k+1 \<Longrightarrow> lift\<^bsub>ML\<^esub> (Suc k) (lift\<^bsub>ML\<^esub> i v) = lift\<^bsub>ML\<^esub> i (lift\<^bsub>ML\<^esub> k v)"
nipkow
parents: 25873
diff changeset
   530
by (induct k v arbitrary: i rule: lift_ml_ML.induct)
nipkow
parents: 25873
diff changeset
   531
   (simp_all add:map_compose[symmetric])
nipkow
parents: 25873
diff changeset
   532
lemma lift_ML_lift_ML_tm: includes Vars shows
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   533
    "i < k+1 \<Longrightarrow> lift\<^bsub>ML\<^esub> (Suc k) (lift\<^bsub>ML\<^esub> i t) = lift\<^bsub>ML\<^esub> i (lift\<^bsub>ML\<^esub> k t)"
25876
nipkow
parents: 25873
diff changeset
   534
by(induct k t arbitrary: i rule: lift_tm_ML.induct)
nipkow
parents: 25873
diff changeset
   535
  (simp_all add:lift_ML_lift_ML_ml)
nipkow
parents: 25873
diff changeset
   536
*)
nipkow
parents: 25873
diff changeset
   537
(*FIXME move up *)
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   538
corollary lift_ML_o_lift_ML: shows
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   539
 "i < k+1 \<Longrightarrow> lift_tm_ML (Suc k) o (lift_tm_ML i) = lift_tm_ML i o lift_tm_ML k" and
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   540
 "i < k+1 \<Longrightarrow> lift_ml_ML (Suc k) o (lift_ml_ML i) = lift_ml_ML i o lift_ml_ML k"
25876
nipkow
parents: 25873
diff changeset
   541
apply(rule ext, simp add: lift_lift_tm_ML)
nipkow
parents: 25873
diff changeset
   542
apply(rule ext, simp add: lift_lift_ml_ML)
nipkow
parents: 25873
diff changeset
   543
done
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   544
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   545
abbreviation insrt where
25876
nipkow
parents: 25873
diff changeset
   546
"insrt k f ==
nipkow
parents: 25873
diff changeset
   547
 (%i. if i<k then lift_ml_ML k (f i) else if i=k then V_ML k else lift_ml_ML k (f(i - 1)))"
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   548
25876
nipkow
parents: 25873
diff changeset
   549
lemma subst_insrt_lift_ml: includes Vars shows
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   550
 "subst\<^bsub>ML\<^esub> (insrt k f) (lift\<^bsub>ML\<^esub> k v) = lift\<^bsub>ML\<^esub> k (subst\<^bsub>ML\<^esub> f v)"
25876
nipkow
parents: 25873
diff changeset
   551
apply (induct k v arbitrary: f k rule: lift_ml_ML.induct)
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   552
apply (simp_all add:map_compose[symmetric] o_assoc lift_o_lift lift_o_shift)
25876
nipkow
parents: 25873
diff changeset
   553
apply(subgoal_tac "V_ML 0 ## insrt k f = insrt (Suc k) (V_ML 0 ## f)")
nipkow
parents: 25873
diff changeset
   554
 apply simp
nipkow
parents: 25873
diff changeset
   555
apply (simp add:expand_fun_eq lift_lift_ml_ML cons_ML_def split:nat.split)
nipkow
parents: 25873
diff changeset
   556
done
nipkow
parents: 25873
diff changeset
   557
lemma subst_insrt_lift_tm: includes Vars shows
nipkow
parents: 25873
diff changeset
   558
 "subst\<^bsub>ML\<^esub> (insrt k f) (lift\<^bsub>ML\<^esub> k t) = lift\<^bsub>ML\<^esub> k (subst\<^bsub>ML\<^esub> f t)"
nipkow
parents: 25873
diff changeset
   559
apply (induct k t arbitrary: f k rule: lift_tm_ML.induct)
nipkow
parents: 25873
diff changeset
   560
apply (simp_all)
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   561
  apply(subgoal_tac "lift 0 \<circ> insrt k f = insrt k (lift 0 \<circ> f)")
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   562
  apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   563
 apply(rule ext)
25876
nipkow
parents: 25873
diff changeset
   564
 apply (simp add:lift_lift_ml_ML_comm)
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   565
apply(subgoal_tac "V_ML 0 ## insrt k f = insrt (Suc k) (V_ML 0 ## f)")
25876
nipkow
parents: 25873
diff changeset
   566
 apply (simp add:subst_insrt_lift_ml)
nipkow
parents: 25873
diff changeset
   567
 apply (simp add:expand_fun_eq lift_lift_ml_ML cons_ML_def split:nat.split)
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   568
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   569
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   570
corollary subst_cons_lift: includes Vars shows
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   571
 "subst\<^bsub>ML\<^esub> (V_ML 0 ## f) o (lift_ml_ML 0) = lift_ml_ML 0 o (subst_ml_ML f)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   572
apply(rule ext)
25876
nipkow
parents: 25873
diff changeset
   573
apply(simp add: cons_ML_def subst_insrt_lift_ml[symmetric])
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   574
apply(subgoal_tac "nat_case (V_ML 0) (\<lambda>j. lift\<^bsub>ML\<^esub> 0 (f j)) = (\<lambda>i. if i = 0 then V_ML 0 else lift\<^bsub>ML\<^esub> 0 (f (i - 1)))")
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   575
 apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   576
apply(rule ext, simp split:nat.split)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   577
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   578
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   579
lemma subst_eval[rule_format]: "t : Pure_tms \<Longrightarrow>
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   580
 ALL f e. (ALL i : free_vars t. i < size e) \<longrightarrow> subst\<^bsub>ML\<^esub> f (eval t e) = eval t (map (subst\<^bsub>ML\<^esub> f) e)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   581
apply(induct set:Pure_tms)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   582
apply simp_all
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   583
apply clarsimp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   584
apply(erule_tac x="V_ML 0 ## f" in allE)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   585
apply(erule_tac x= "(V_ML 0 # map (lift\<^bsub>ML\<^esub> 0) e)" in allE)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   586
apply(erule impE)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   587
 apply clarsimp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   588
 apply(case_tac i)apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   589
 apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   590
apply (simp add:subst_cons_lift map_compose[symmetric])
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   591
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   592
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   593
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   594
theorem kernel_eval[rule_format]: includes Vars shows
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   595
 "t : Pure_tms ==>
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   596
 ALL e. (ALL i : free_vars t. i < size e) \<longrightarrow> (ALL i < size e. e!i = V i []) --> (eval t e)! =  t!"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   597
apply(induct set:Pure_tms)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   598
apply simp_all
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   599
apply clarsimp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   600
apply(subst lift_eval) apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   601
 apply clarsimp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   602
 apply(case_tac i)apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   603
 apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   604
apply(subst subst_eval) apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   605
 apply clarsimp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   606
 apply(case_tac i)apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   607
 apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   608
apply(erule_tac x="map (subst\<^bsub>ML\<^esub> (\<lambda>n. if n = 0 then V 0 [] else V_ML (n - 1)))
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   609
                (map (lift 0) (V_ML 0 # map (lift\<^bsub>ML\<^esub> 0) e))" in allE)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   610
apply(erule impE)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   611
apply(clarsimp)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   612
 apply(case_tac i)apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   613
 apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   614
apply(erule impE)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   615
apply(clarsimp)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   616
 apply(case_tac i)apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   617
 apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   618
apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   619
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   620
25876
nipkow
parents: 25873
diff changeset
   621
lemma ML_closed_lift_ML_ml[simp]:
nipkow
parents: 25873
diff changeset
   622
  includes Vars shows "ML_closed k v \<Longrightarrow> lift\<^bsub>ML\<^esub> k v = v"
nipkow
parents: 25873
diff changeset
   623
by(induct k v rule: lift_ml_ML.induct)(simp_all add:list_eq_iff_nth_eq)
nipkow
parents: 25873
diff changeset
   624
lemma ML_closed_lift_ML_tm[simp]:
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   625
  includes Vars shows "ML_closed_t k t \<Longrightarrow> lift\<^bsub>ML\<^esub> k t = t"
25876
nipkow
parents: 25873
diff changeset
   626
by(induct k t rule: lift_tm_ML.induct)(simp_all)
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   627
25876
nipkow
parents: 25873
diff changeset
   628
lemma ML_closed_subst_ML_ml[simp]: includes Vars shows
nipkow
parents: 25873
diff changeset
   629
  "ML_closed k v \<Longrightarrow> !i<k. f i = V_ML i \<Longrightarrow> subst\<^bsub>ML\<^esub> f v = v"
nipkow
parents: 25873
diff changeset
   630
apply (induct f v arbitrary: k rule: subst_ml_ML.induct)
nipkow
parents: 25873
diff changeset
   631
apply (auto simp add: list_eq_iff_nth_eq)
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   632
apply(simp add:Ball_def)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   633
apply(erule_tac x="vs!i" in meta_allE)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   634
apply(erule_tac x="k" in meta_allE)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   635
apply simp
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   636
apply(erule_tac x="vs!i" in meta_allE)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   637
apply(erule_tac x="k" in meta_allE)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   638
apply simp
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   639
apply(erule_tac x="vs!i" in meta_allE)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   640
apply(erule_tac x="k" in meta_allE)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   641
apply(erule_tac x="k" in meta_allE)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   642
apply simp
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   643
apply(erule_tac x="vs!i" in meta_allE)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   644
apply(erule_tac x="k" in meta_allE)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   645
apply(erule_tac x="k" in meta_allE)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   646
apply simp
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   647
apply(erule_tac x="Suc k" in meta_allE)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   648
apply (simp add:cons_ML_def split:nat.split)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   649
done
25876
nipkow
parents: 25873
diff changeset
   650
lemma ML_closed_subst_ML_tm[simp]: includes Vars shows
nipkow
parents: 25873
diff changeset
   651
  "ML_closed_t k t \<Longrightarrow> !i<k. f i = V_ML i \<Longrightarrow> subst\<^bsub>ML\<^esub> f t = t"
nipkow
parents: 25873
diff changeset
   652
by (induct f t arbitrary: k rule: subst_tm_ML.induct) (auto)
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   653
25876
nipkow
parents: 25873
diff changeset
   654
lemma ML_closed_lift_ml[simp]:
nipkow
parents: 25873
diff changeset
   655
  includes Vars shows "ML_closed k v \<Longrightarrow> ML_closed k (lift m v)"
nipkow
parents: 25873
diff changeset
   656
by(induct k v arbitrary: m rule: lift_ml_ML.induct)
nipkow
parents: 25873
diff changeset
   657
  (simp_all add:list_eq_iff_nth_eq)
nipkow
parents: 25873
diff changeset
   658
lemma ML_closed_lift_tm[simp]:
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   659
  includes Vars shows "ML_closed_t k t \<Longrightarrow> ML_closed_t k (lift m t)"
25876
nipkow
parents: 25873
diff changeset
   660
by(induct k t arbitrary: m rule: lift_tm_ML.induct)(simp_all)
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   661
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   662
lemma red_Lam[simp]: includes Vars shows "t \<rightarrow>* t' ==> Lam t \<rightarrow>* Lam t'"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   663
apply(induct rule:rtrancl_induct)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   664
apply(simp_all)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   665
apply(blast intro: rtrancl_into_rtrancl tRed.intros)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   666
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   667
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   668
lemma red_At1[simp]: includes Vars shows "t \<rightarrow>* t' ==> At t s \<rightarrow>* At t' s"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   669
apply(induct rule:rtrancl_induct)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   670
apply(simp_all)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   671
apply(blast intro: rtrancl_into_rtrancl tRed.intros)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   672
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   673
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   674
lemma red_At2[simp]: includes Vars shows "t \<rightarrow>* t' ==> At s t \<rightarrow>* At s t'"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   675
apply(induct rule:rtrancl_induct)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   676
apply(simp_all)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   677
apply(blast intro:rtrancl_into_rtrancl tRed.intros)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   678
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   679
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   680
lemma tRed_list_foldl_At:
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   681
 "ts \<rightarrow>* ts' \<Longrightarrow> s \<rightarrow>* s' \<Longrightarrow> foldl At s ts \<rightarrow>* foldl At s' ts'"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   682
apply(induct arbitrary:s s' rule:tRed_list.induct)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   683
apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   684
apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   685
apply(blast dest: red_At1 red_At2 intro:rtrancl_trans)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   686
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   687
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   688
lemma [trans]: "s = t \<Longrightarrow> t \<rightarrow> t' \<Longrightarrow> s \<rightarrow> t'"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   689
by simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   690
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   691
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   692
lemma subst_foldl[simp]:
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   693
 "subst f (foldl At s ts) = foldl At (subst f s) (map (subst f) ts)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   694
by (induct ts arbitrary: s) auto
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   695
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   696
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   697
lemma foldl_At_size: "size ts = size ts' \<Longrightarrow>
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   698
 foldl At s ts = foldl At s' ts' \<longleftrightarrow> s = s' & ts = ts'"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   699
by (induct arbitrary: s s' rule:list_induct2) simp_all
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   700
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   701
consts depth_At :: "tm \<Rightarrow> nat"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   702
primrec
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   703
"depth_At(Ct cn) = 0"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   704
"depth_At(Vt x) = 0"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   705
"depth_At(Lam t) = 0"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   706
"depth_At(At s t) = depth_At s + 1"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   707
"depth_At(term_of v) = 0"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   708
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   709
lemma depth_At_foldl:
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   710
 "depth_At(foldl At s ts) = depth_At s + size ts"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   711
by (induct ts arbitrary: s) simp_all
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   712
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   713
lemma foldl_At_eq_length:
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   714
 "foldl At s ts = foldl At s ts' \<Longrightarrow> length ts = length ts'"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   715
apply(subgoal_tac "depth_At(foldl At s ts) = depth_At(foldl At s ts')")
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   716
apply(erule thin_rl)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   717
 apply (simp add:depth_At_foldl)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   718
apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   719
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   720
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   721
lemma foldl_At_eq[simp]: "foldl At s ts = foldl At s ts' \<longleftrightarrow> ts = ts'"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   722
apply(rule)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   723
 prefer 2 apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   724
apply(blast dest:foldl_At_size foldl_At_eq_length)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   725
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   726
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   727
lemma [simp]: "foldl At s ts ! = foldl At (s!) (map kernelt ts)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   728
by (induct ts arbitrary: s) simp_all
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   729
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   730
lemma [simp]: "(kernelt \<circ> term_of) = kernel"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   731
by(rule ext) simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   732
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   733
lemma shift_subst_decr:
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   734
 "Vt 0 ## subst_decr k t = subst_decr (Suc k) (lift 0 t)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   735
apply(rule ext)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   736
apply (simp add:cons_def split:nat.split)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   737
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   738
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   739
lemma lift_foldl_At[simp]:
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   740
  "lift k (foldl At s ts) = foldl At (lift k s) (map (lift k) ts)"
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   741
by(induct ts arbitrary:s) simp_all
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   742
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   743
subsection "Horrible detour"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   744
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   745
definition "liftn n == lift_ml 0 ^ n"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   746
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   747
lemma [simp]: "liftn n (C i vs) = C i (map (liftn n) vs)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   748
apply(unfold liftn_def)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   749
apply(induct n)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   750
apply (simp_all add: map_compose[symmetric])
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   751
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   752
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   753
lemma [simp]: "liftn n (CC nm) = CC nm"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   754
apply(unfold liftn_def)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   755
apply(induct n)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   756
apply (simp_all add: map_compose[symmetric])
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   757
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   758
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   759
lemma [simp]: "liftn n (apply v w) = apply (liftn n v) (liftn n w)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   760
apply(unfold liftn_def)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   761
apply(induct n)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   762
apply (simp_all add: map_compose[symmetric])
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   763
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   764
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   765
lemma [simp]: "liftn n (A_ML v vs) = A_ML (liftn n v) (map (liftn n) vs)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   766
apply(unfold liftn_def)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   767
apply(induct n)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   768
apply (simp_all add: map_compose[symmetric])
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   769
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   770
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   771
lemma [simp]:
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   772
 "liftn n (Fun v vs i) = Fun (liftn n v) (map (liftn n) vs) i"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   773
apply(unfold liftn_def)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   774
apply(induct n)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   775
apply (simp_all add: map_compose[symmetric] id_def)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   776
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   777
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   778
lemma [simp]: "liftn n (Lam_ML v) = Lam_ML (liftn n v)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   779
apply(unfold liftn_def)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   780
apply(induct n)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   781
apply (simp_all add: map_compose[symmetric] id_def)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   782
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   783
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   784
lemma liftn_liftn_add: "liftn m (liftn n v) = liftn (m+n) v"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   785
by(simp add:liftn_def funpow_add)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   786
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   787
lemma [simp]: "liftn n (V_ML k) = V_ML k"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   788
apply(unfold liftn_def)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   789
apply(induct n)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   790
apply (simp_all)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   791
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   792
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   793
lemma liftn_lift_ML_comm: "liftn n (lift\<^bsub>ML\<^esub> 0 v) = lift\<^bsub>ML\<^esub> 0 (liftn n v)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   794
apply(unfold liftn_def)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   795
apply(induct n)
25876
nipkow
parents: 25873
diff changeset
   796
apply (simp_all add:lift_lift_ml_ML_comm)
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   797
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   798
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   799
lemma liftn_cons: "liftn n ((V_ML 0 ## f) x) = (V_ML 0 ## (liftn n o f)) x"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   800
apply(simp add:cons_ML_def liftn_lift_ML_comm split:nat.split)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   801
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   802
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   803
text{* End of horrible detour *}
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   804
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   805
lemma includes Vars shows foldl_Pure[simp]:
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   806
 "t : Pure_tms \<Longrightarrow> \<forall>t\<in>set ts. t : Pure_tms \<Longrightarrow> 
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   807
 (!!s t. s : Pure_tms \<Longrightarrow> t : Pure_tms \<Longrightarrow> f s t : Pure_tms) \<Longrightarrow>
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   808
 foldl f t ts \<in> Pure_tms"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   809
by(induct ts arbitrary: t) simp_all
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   810
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   811
declare Pure_tms.intros[simp]
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   812
25876
nipkow
parents: 25873
diff changeset
   813
lemma ML_closed_Suc: "ML_closed n v \<Longrightarrow> ML_closed (Suc n) (lift\<^bsub>ML\<^esub> k v)"
nipkow
parents: 25873
diff changeset
   814
by (induct k v arbitrary: n rule: lift_ml_ML.induct) simp_all
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   815
25876
nipkow
parents: 25873
diff changeset
   816
lemma subst_ml_ML_coincidence:
nipkow
parents: 25873
diff changeset
   817
  "ML_closed k v \<Longrightarrow> !i<k. f i = g i \<Longrightarrow> subst\<^bsub>ML\<^esub> f v = subst\<^bsub>ML\<^esub> g v"
nipkow
parents: 25873
diff changeset
   818
by (induct f v arbitrary: k g rule: subst_ml_ML.induct)
nipkow
parents: 25873
diff changeset
   819
   (auto simp:cons_ML_def split:nat.split)
nipkow
parents: 25873
diff changeset
   820
lemma subst_tm_ML_coincidence:
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   821
  "ML_closed_t k t \<Longrightarrow> !i<k. f i = g i \<Longrightarrow> subst\<^bsub>ML\<^esub> f t = subst\<^bsub>ML\<^esub> g t"
25876
nipkow
parents: 25873
diff changeset
   822
by (induct f t arbitrary: k g rule: subst_tm_ML.induct)
nipkow
parents: 25873
diff changeset
   823
   (auto simp:subst_ml_ML_coincidence)
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   824
25876
nipkow
parents: 25873
diff changeset
   825
lemma ML_closed_subst_ML1_ml:
nipkow
parents: 25873
diff changeset
   826
  "!i. ML_closed k (f i) \<Longrightarrow> ML_closed k (subst\<^bsub>ML\<^esub> f v)"
nipkow
parents: 25873
diff changeset
   827
by(induct f v arbitrary: k rule: subst_ml_ML.induct)
nipkow
parents: 25873
diff changeset
   828
  (auto simp:cons_ML_def ML_closed_Suc split:nat.split)
nipkow
parents: 25873
diff changeset
   829
lemma ML_closed_subst_ML1_tm:
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   830
  "!i. ML_closed k (f i) \<Longrightarrow> ML_closed_t k (subst\<^bsub>ML\<^esub> f t)"
25876
nipkow
parents: 25873
diff changeset
   831
by(induct f t arbitrary: k rule: subst_tm_ML.induct)
nipkow
parents: 25873
diff changeset
   832
  (simp_all add:ML_closed_subst_ML1_ml)
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   833
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   834
lemma ML_closed_t_foldl_At:
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   835
  "ML_closed_t k (foldl At t ts) \<longleftrightarrow>
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   836
   ML_closed_t k t & (ALL t:set ts. ML_closed_t k t)"
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   837
by(induct ts arbitrary: t) simp_all
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   838
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   839
lemma subst_Vt: "t : Pure_tms \<Longrightarrow> subst Vt t = t"
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   840
apply(induct set:Pure_tms)
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   841
apply simp_all
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   842
apply(subgoal_tac "Vt 0 ## Vt = Vt")
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   843
apply simp
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   844
apply(rule ext)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   845
apply(simp add:cons_def split:nat.split)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   846
done
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   847
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   848
lemma ML_closed_Pure_tms: "ML_closed 0 v \<Longrightarrow> v! : Pure_tms"
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   849
apply(induct v rule:kernel.induct)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   850
apply auto
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   851
apply(rule Pure_tms.intros)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   852
apply(erule meta_mp)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   853
apply(subgoal_tac "ML_closed (Suc 0) (lift 0 v)")
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   854
apply(subgoal_tac "ML_closed 0 (subst\<^bsub>ML\<^esub> (\<lambda>n. V 0 []) (lift 0 v))")
25876
nipkow
parents: 25873
diff changeset
   855
apply(drule subst_ml_ML_coincidence[of _ _ "\<lambda>n. V 0 []" "\<lambda>n. if n = 0 then V 0 [] else V_ML (n - 1)"])back
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   856
apply simp
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   857
apply metis
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   858
apply simp
25876
nipkow
parents: 25873
diff changeset
   859
apply(rule ML_closed_subst_ML1_ml)
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   860
apply simp+
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   861
done
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   862
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   863
corollary subst_Vt_kernel: "ML_closed 0 v \<Longrightarrow> subst Vt (v!) = v!"
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   864
by (metis ML_closed_Pure_tms subst_Vt)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   865
25876
nipkow
parents: 25873
diff changeset
   866
lemma ML_closed_subst_ML3_ml:
nipkow
parents: 25873
diff changeset
   867
  "ML_closed k v \<Longrightarrow> !i<k. ML_closed l (f i) \<Longrightarrow> ML_closed l (subst\<^bsub>ML\<^esub> f v)"
nipkow
parents: 25873
diff changeset
   868
by(induct f v arbitrary: k l rule: subst_ml_ML.induct)
nipkow
parents: 25873
diff changeset
   869
  (auto simp:cons_ML_def ML_closed_Suc split:nat.split)
nipkow
parents: 25873
diff changeset
   870
lemma ML_closed_subst_ML3_tm:
nipkow
parents: 25873
diff changeset
   871
  "ML_closed_t k t \<Longrightarrow> !i<k. ML_closed l (f i) \<Longrightarrow> ML_closed_t l (subst\<^bsub>ML\<^esub> f t)"
nipkow
parents: 25873
diff changeset
   872
by(induct f t arbitrary: k l rule: subst_tm_ML.induct)
nipkow
parents: 25873
diff changeset
   873
  (auto simp:ML_closed_subst_ML3_ml)
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   874
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   875
lemma kernel_lift_tm: "ML_closed 0 v \<Longrightarrow> (lift i v)! = lift i (v!)"
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   876
apply(induct v arbitrary: i rule: kernel.induct)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   877
apply (simp_all add:list_eq_iff_nth_eq)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   878
apply(erule_tac x="Suc i" in meta_allE)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   879
apply(erule meta_impE)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   880
defer
25876
nipkow
parents: 25873
diff changeset
   881
apply (simp add:lift_subst_ML_ml)
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   882
apply(subgoal_tac "lift (Suc i) \<circ> (\<lambda>n. if n = 0 then V 0 [] else V_ML (n - 1)) = (\<lambda>n. if n = 0 then V 0 [] else V_ML (n - 1))")
25876
nipkow
parents: 25873
diff changeset
   883
apply (simp add:lift_lift_ml)
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   884
apply(rule ext)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   885
apply(simp)
25876
nipkow
parents: 25873
diff changeset
   886
apply(subst ML_closed_subst_ML3_ml[of "1"])
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   887
apply(simp)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   888
apply(simp)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   889
apply(simp)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   890
done
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   891
25876
nipkow
parents: 25873
diff changeset
   892
lemma subst_ML_ml_comp: includes Vars shows
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   893
  "!i. h i = subst\<^bsub>ML\<^esub> f (g i) \<Longrightarrow> subst\<^bsub>ML\<^esub> f (subst\<^bsub>ML\<^esub> g v) = subst\<^bsub>ML\<^esub> h v"
25876
nipkow
parents: 25873
diff changeset
   894
apply (induct h v arbitrary: f g rule: subst_ml_ML.induct)
nipkow
parents: 25873
diff changeset
   895
apply (simp add: list_eq_iff_nth_eq)
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   896
apply (simp add: list_eq_iff_nth_eq)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   897
apply (simp add: list_eq_iff_nth_eq)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   898
apply (simp add: list_eq_iff_nth_eq)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   899
apply (simp)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   900
apply (simp add: list_eq_iff_nth_eq)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   901
apply (simp)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   902
apply(erule meta_allE)+
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   903
apply(erule meta_mp)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   904
apply(auto simp:cons_ML_def split:nat.split)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   905
apply (metis cons_ML_def o_apply subst_cons_lift)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   906
done
25876
nipkow
parents: 25873
diff changeset
   907
lemma subst_ML_tm_comp: includes Vars shows
nipkow
parents: 25873
diff changeset
   908
  "!i. h i = subst\<^bsub>ML\<^esub> f (g i) \<Longrightarrow> subst\<^bsub>ML\<^esub> f (subst\<^bsub>ML\<^esub> g t) = subst\<^bsub>ML\<^esub> h t"
nipkow
parents: 25873
diff changeset
   909
apply (induct h t arbitrary: f g rule: subst_tm_ML.induct)
nipkow
parents: 25873
diff changeset
   910
apply (simp)
nipkow
parents: 25873
diff changeset
   911
apply (simp)
nipkow
parents: 25873
diff changeset
   912
apply (simp)
nipkow
parents: 25873
diff changeset
   913
apply (metis lift_subst_ML_ml o_apply subst_ML_ml_comp subst_ml_ML.simps(5))
nipkow
parents: 25873
diff changeset
   914
apply (simp)
nipkow
parents: 25873
diff changeset
   915
apply simp
nipkow
parents: 25873
diff changeset
   916
apply (metis subst_ML_ml_comp subst_ml_ML.simps(5))
nipkow
parents: 25873
diff changeset
   917
done
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   918
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   919
lemma if_cong0: "If x y z = If x y z"
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   920
by simp
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   921
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   922
corollary [simp]: "ML_closed 0 v \<Longrightarrow> subst\<^bsub>ML\<^esub> f v = v"
25876
nipkow
parents: 25873
diff changeset
   923
using ML_closed_subst_ML_ml[where k=0] by simp
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   924
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   925
fun subst_ml :: "(nat \<Rightarrow> nat) \<Rightarrow> ml \<Rightarrow> ml" where
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   926
"subst_ml f (C nm vs) = C nm (map (subst_ml f) vs)" |
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   927
"subst_ml f (V x vs) = V (f x) (map (subst_ml f) vs)" |
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   928
"subst_ml f (Fun v vs n) = Fun (subst_ml f v) (map (subst_ml f) vs) n" |
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   929
"subst_ml f (apply u v) = apply (subst_ml f u) (subst_ml f v)" |
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   930
"subst_ml f (V_ML X) = V_ML X" |
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   931
"subst_ml f (A_ML v vs) = A_ML (subst_ml f v) (map (subst_ml f) vs)" |
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   932
"subst_ml f (Lam_ML v) = Lam_ML (subst_ml f v)" |
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   933
"subst_ml f (CC nm) = CC nm"
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   934
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   935
lemma lift_ML_subst_ml:
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   936
"lift\<^bsub>ML\<^esub> k (subst_ml f v) = subst_ml f (lift\<^bsub>ML\<^esub> k v)"
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   937
apply (induct f v arbitrary: k rule:subst_ml.induct)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   938
apply (simp_all add:list_eq_iff_nth_eq)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   939
done
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   940
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   941
lemma subst_ml_subst_ML: includes Vars shows
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   942
  "subst_ml f (subst\<^bsub>ML\<^esub> g v) = subst\<^bsub>ML\<^esub> (subst_ml f o g) (subst_ml f v)"
25876
nipkow
parents: 25873
diff changeset
   943
apply (induct g v arbitrary: f rule: subst_ml_ML.induct)
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   944
apply(simp_all add:list_eq_iff_nth_eq)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   945
apply(subgoal_tac "(subst_ml fa \<circ> V_ML 0 ## f) = V_ML 0 ## (subst_ml fa \<circ> f)")
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   946
apply simp
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   947
apply(rule ext)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   948
apply(simp add:cons_ML_def lift_ML_subst_ml split:nat.split)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   949
done
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   950
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   951
lemma lift_Pure_tms[simp]: "t : Pure_tms \<Longrightarrow> lift k t : Pure_tms"
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   952
by(induct arbitrary:k set:Pure_tms) simp_all
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   953
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   954
lemma lift_subst_aux:
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   955
  "t : Pure_tms \<Longrightarrow> !i<k. g i = lift k (f i) \<Longrightarrow>
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   956
   ALL i>= k. g(Suc i) = lift k (f i) \<Longrightarrow> 
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   957
  g k = Vt k \<Longrightarrow> lift k (subst f t) = subst g (lift k t)"
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   958
apply(induct arbitrary:f g k set:Pure_tms)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   959
apply (simp_all add: split:nat.split)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   960
apply(erule meta_allE)+
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   961
apply(erule meta_impE)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   962
defer
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   963
apply(erule meta_impE)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   964
defer
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   965
apply(erule meta_mp)
25876
nipkow
parents: 25873
diff changeset
   966
apply (simp_all add: cons_def lift_lift_ml lift_lift_tm split:nat.split)
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   967
done
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   968
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   969
corollary lift_subst:
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   970
  "t : Pure_tms \<Longrightarrow> lift 0 (subst f t) = subst (Vt 0 ## f) (lift 0 t)"
25876
nipkow
parents: 25873
diff changeset
   971
by (simp add: lift_subst_aux cons_def lift_lift_ml split:nat.split)
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   972
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   973
lemma subst_comp: includes Vars shows
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   974
  "t : Pure_tms \<Longrightarrow> !i. g i : Pure_tms \<Longrightarrow>
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   975
   h = (%i. subst f (g i)) \<Longrightarrow> subst f (subst g t) = subst h t"
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   976
apply(induct arbitrary:f g h set:Pure_tms)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   977
apply simp
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   978
apply simp
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   979
defer
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   980
apply simp
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   981
apply (simp (no_asm))
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   982
apply(erule meta_allE)+
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   983
apply(erule meta_impE)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   984
defer
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   985
apply(erule meta_mp)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   986
prefer 2 apply (simp add:cons_def split:nat.split)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   987
apply(rule ext)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   988
apply(subst (1) cons_def)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   989
apply(subst (2) cons_def)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   990
apply(simp split:nat.split)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   991
apply rule apply (simp add:cons_def)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   992
apply(simp add:lift_subst)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   993
done
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   994
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   995
lemma lift_is_subst_ml:"lift k v = subst_ml (%n. if n<k then n else n+1) v"
25876
nipkow
parents: 25873
diff changeset
   996
by(induct k v rule:lift_ml.induct)(simp_all add:list_eq_iff_nth_eq)
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   997
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   998
lemma subst_ml_comp:
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
   999
 "subst_ml f (subst_ml g v) = subst_ml (f o g) v"
25876
nipkow
parents: 25873
diff changeset
  1000
by(induct g v rule:subst_ml.induct)(simp_all add:list_eq_iff_nth_eq)
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1001
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1002
lemma subst_kernel:
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1003
  "ML_closed 0 v \<Longrightarrow>  subst (%n. Vt (f n)) (v!) = (subst_ml f v)!"
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1004
apply (induct v arbitrary: f rule:kernel.induct)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1005
apply (simp_all add:list_eq_iff_nth_eq)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1006
apply(erule_tac x="%n. case n of 0 \<Rightarrow> 0 | Suc k \<Rightarrow> Suc(f k)" in meta_allE)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1007
apply(erule_tac meta_impE)
25876
nipkow
parents: 25873
diff changeset
  1008
apply(rule ML_closed_subst_ML3_ml[where k="Suc 0"])
nipkow
parents: 25873
diff changeset
  1009
apply (metis ML_closed_lift_ml)
nipkow
parents: 25873
diff changeset
  1010
apply simp
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1011
apply(subgoal_tac "(\<lambda>n. Vt (case n of 0 \<Rightarrow> 0 | Suc k \<Rightarrow> Suc (f k))) = (Vt 0 ## (\<lambda>n. Vt (f n)))")
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1012
apply (simp add:subst_ml_subst_ML)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1013
defer
25876
nipkow
parents: 25873
diff changeset
  1014
apply(simp add:expand_fun_eq cons_def split:nat.split)
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1015
apply(simp add:cons_def)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1016
defer
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1017
apply(simp add:lift_is_subst_ml subst_ml_comp)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1018
apply(rule arg_cong[where f = kernel])
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1019
apply(subgoal_tac "(nat_case 0 (\<lambda>k. Suc (f k)) \<circ> Suc) = Suc o f")
25876
nipkow
parents: 25873
diff changeset
  1020
prefer 2 apply(simp add:expand_fun_eq split:nat.split)
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1021
apply(subgoal_tac "(subst_ml (nat_case 0 (\<lambda>k. Suc (f k))) \<circ>
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1022
               (\<lambda>n. if n = 0 then V 0 [] else V_ML (n - 1)))
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1023
             = (\<lambda>n. if n = 0 then V 0 [] else V_ML (n - 1))")
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1024
apply simp
25876
nipkow
parents: 25873
diff changeset
  1025
apply(simp add: expand_fun_eq split:nat.split)
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1026
done
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1027
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1028
lemma kernel_subst1:
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1029
  "ML_closed 0 v \<Longrightarrow> ML_closed (Suc 0) u \<Longrightarrow>
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1030
   kernel(u[v/0]) = (kernel((lift 0 u)[V 0 []/0]))[v!/0]"
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1031
proof(induct u arbitrary:v rule:kernel.induct)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1032
  case (2 w)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1033
  show ?case (is "?L = ?R")
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1034
  proof -
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1035
    have "?L = Lam (lift 0 (w[lift\<^bsub>ML\<^esub> 0 v/Suc 0])[V 0 []/0]!)"
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1036
      by (simp cong:if_cong0)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1037
    also have "\<dots> = Lam ((lift 0 w)[lift\<^bsub>ML\<^esub> 0 (lift 0 v)/Suc 0][V 0 []/0]!)"
25876
nipkow
parents: 25873
diff changeset
  1038
      by (metis kernel.simps(2) lift_lift_ml_ML_comm lift_subst_ML1)
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1039
    also have "\<dots> = Lam (subst\<^bsub>ML\<^esub> (%n. if n=0 then V 0 [] else
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1040
            if n=Suc 0 then lift 0 v else V_ML (n - 2)) (lift 0 w) !)"
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1041
      apply simp
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1042
      apply(rule arg_cong[where f = kernel])
25876
nipkow
parents: 25873
diff changeset
  1043
      apply(rule subst_ML_ml_comp)
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1044
      using 2
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1045
      apply auto
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1046
      done
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1047
    also have "\<dots> = Lam ((lift 0 w)[V 0 []/0][lift 0 v/0]!)"
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1048
      apply simp
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1049
      apply(rule arg_cong[where f = kernel])
25876
nipkow
parents: 25873
diff changeset
  1050
      apply(rule subst_ML_ml_comp[symmetric])
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1051
      using 2
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1052
      apply auto
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1053
      done
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1054
    also have "\<dots> = Lam ((lift_ml 0 ((lift_ml 0 w)[V 0 []/0]))[V 0 []/0]![(lift 0 v)!/0])"
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1055
      apply(rule arg_cong[where f = Lam])
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1056
      apply(rule 2(1))
25876
nipkow
parents: 25873
diff changeset
  1057
      apply (metis ML_closed_lift_ml 2)
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1058
      apply(subgoal_tac "ML_closed (Suc(Suc 0)) w")
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1059
      defer
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1060
      using 2
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1061
      apply force
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1062
      apply(subgoal_tac  "ML_closed (Suc (Suc 0)) (lift 0 w)")
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1063
      defer
25876
nipkow
parents: 25873
diff changeset
  1064
      apply(erule ML_closed_lift_ml)
nipkow
parents: 25873
diff changeset
  1065
      apply(erule ML_closed_subst_ML3_ml)
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1066
      apply simp
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1067
      done
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1068
    also have "\<dots> = Lam ((lift_ml 0 (lift_ml 0 w)[V 1 []/0])[V 0 []/0]![(lift 0 v)!/0])" (is "_ = ?M")
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1069
      apply(subgoal_tac "lift_ml 0 (lift_ml 0 w[V 0 []/0])[V 0 []/0] =
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1070
                         lift_ml 0 (lift_ml 0 w)[V 1 []/0][V 0 []/0]")
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1071
      apply simp
25876
nipkow
parents: 25873
diff changeset
  1072
      apply(subst lift_subst_ML_ml)
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1073
      apply(simp add:comp_def if_distrib[where f="lift_ml 0"] cong:if_cong)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1074
      done
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1075
    finally have "?L = ?M" .
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1076
    have "?R = Lam (subst (Vt 0 ## subst_decr 0 (v!))
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1077
          (lift 0 (lift_ml 0 w[V 0 []/Suc 0])[V 0 []/0]!))"
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1078
      apply(subgoal_tac "(V_ML 0 ## (\<lambda>n. if n = 0 then V 0 [] else V_ML (n - Suc 0))) = subst_decr_ML (Suc 0) (V 0 [])")
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1079
      apply(simp cong:if_cong)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1080
      apply(simp add:expand_fun_eq cons_ML_def split:nat.splits)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1081
      done
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1082
    also have "\<dots> = Lam (subst (Vt 0 ## subst_decr 0 (v!))
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1083
          ((lift 0 (lift_ml 0 w))[V 1 []/Suc 0][V 0 []/0]!))"
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1084
      apply(subgoal_tac "lift 0 (lift 0 w[V 0 []/Suc 0]) = lift 0 (lift 0 w)[V 1 []/Suc 0]")
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1085
      apply simp
25876
nipkow
parents: 25873
diff changeset
  1086
      apply(subst lift_subst_ML_ml)
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1087
      apply(simp add:comp_def if_distrib[where f="lift_ml 0"] cong:if_cong)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1088
      done
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1089
    also have "(lift_ml 0 (lift_ml 0 w))[V 1 []/Suc 0][V 0 []/0] =
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1090
               (lift 0 (lift_ml 0 w))[V 0 []/0][V 1 []/ 0]" (is "?l = ?r")
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1091
    proof -
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1092
      have "?l = subst\<^bsub>ML\<^esub> (%n. if n= 0 then V 0 [] else if n = 1 then V 1 [] else
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1093
                      V_ML (n - 2))
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1094
               (lift_ml 0 (lift_ml 0 w))"
25876
nipkow
parents: 25873
diff changeset
  1095
      by(auto intro!:subst_ML_ml_comp)
nipkow
parents: 25873
diff changeset
  1096
    also have "\<dots> = ?r" by(auto intro!:subst_ML_ml_comp[symmetric])
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1097
    finally show ?thesis .
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1098
  qed
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1099
  also have "Lam (subst (Vt 0 ## subst_decr 0 (v!)) (?r !)) = ?M"
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1100
  proof-
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1101
    have "subst (subst_decr (Suc 0) (lift_tm 0 (kernel v))) (lift_ml 0 (lift_ml 0 w)[V 0 []/0][V 1 []/0]!) =
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1102
    subst (subst_decr 0 (kernel(lift_ml 0 v))) (lift_ml 0 (lift_ml 0 w)[V 1 []/0][V 0 []/0]!)" (is "?a = ?b")
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1103
    proof-
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1104
      def pi == "%n::nat. if n = 0 then 1 else if n = 1 then 0 else n"
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1105
      have "(\<lambda>i. Vt (pi i)[lift 0 (v!)/0]) = subst_decr (Suc 0) (lift 0 (v!))"
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1106
	by(rule ext)(simp add:pi_def)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1107
      hence "?a =
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1108
  subst (subst_decr 0 (lift_tm 0 (kernel v))) (subst (% n. Vt (pi n)) (lift_ml 0 (lift_ml 0 w)[V 0 []/0][V 1 []/0]!))"
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1109
	apply(subst subst_comp[OF _ _ refl])
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1110
	prefer 3 apply simp
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1111
	using 2(3)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1112
	apply simp
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1113
	apply(rule ML_closed_Pure_tms)
25876
nipkow
parents: 25873
diff changeset
  1114
	apply(rule ML_closed_subst_ML3_ml[where k="Suc 0"])
nipkow
parents: 25873
diff changeset
  1115
	apply(rule ML_closed_subst_ML3_ml[where k="Suc(Suc 0)"])
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1116
	apply simp
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1117
	apply simp
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1118
	apply simp
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1119
	apply simp
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1120
	done
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1121
      also have "\<dots> =
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1122
 (subst_ml pi (lift_ml 0 (lift_ml 0 w)[V 0 []/0][V 1 []/0]))![lift_tm 0 (v!)/0]"
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1123
	apply(subst subst_kernel)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1124
	using 2 apply auto
25876
nipkow
parents: 25873
diff changeset
  1125
	apply(rule ML_closed_subst_ML3_ml[where k="Suc 0"])
nipkow
parents: 25873
diff changeset
  1126
	apply(rule ML_closed_subst_ML3_ml[where k="Suc(Suc 0)"])
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1127
	apply simp
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1128
	apply simp
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1129
	apply simp
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1130
	done
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1131
      also have "\<dots> = (subst_ml pi (lift_ml 0 (lift_ml 0 w)[V 0 []/0][V 1 []/0]))![lift 0 v!/0]"
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1132
      proof -
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1133
	have "lift 0 (v!) = lift 0 v!" by (metis 2(2) kernel_lift_tm)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1134
	thus ?thesis by (simp cong:if_cong)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1135
      qed
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1136
      also have "\<dots> = ?b"
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1137
      proof-
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1138
	have 1: "subst_ml pi (lift 0 (lift 0 w)) = lift 0 (lift 0 w)"
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1139
	  apply(simp add:lift_is_subst_ml subst_ml_comp)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1140
	  apply(subgoal_tac "pi \<circ> (Suc \<circ> Suc) = (Suc \<circ> Suc)")
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1141
	  apply(simp)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1142
	  apply(simp add:pi_def expand_fun_eq)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1143
	  done
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1144
	have "subst_ml pi (lift_ml 0 (lift_ml 0 w)[V 0 []/0][V 1 []/0]) =
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1145
             lift_ml 0 (lift_ml 0 w)[V 1 []/0][V 0 []/0]"
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1146
	  apply(subst subst_ml_subst_ML)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1147
	  apply(subst subst_ml_subst_ML)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1148
	  apply(subst 1)
25876
nipkow
parents: 25873
diff changeset
  1149
	  apply(subst subst_ML_ml_comp)
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1150
	  apply(rule)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1151
	  apply(rule)
25876
nipkow
parents: 25873
diff changeset
  1152
	  apply(rule subst_ML_ml_comp[symmetric])
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1153
	  apply(auto simp:pi_def)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1154
	  done
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1155
	thus ?thesis by simp
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1156
      qed
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1157
      finally show ?thesis .
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1158
    qed
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1159
    thus ?thesis by(simp cong:if_cong0 add:shift_subst_decr)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1160
  qed
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1161
  finally have "?R = ?M" .
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1162
  then show "?L = ?R" using `?L = ?M` by metis
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1163
qed
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1164
qed (simp_all add:list_eq_iff_nth_eq)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1165
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1166
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1167
theorem Red_sound: includes Vars
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1168
 shows "v \<Rightarrow> v' \<Longrightarrow> ML_closed 0 v \<Longrightarrow> v! \<rightarrow>* v'! & ML_closed 0 v'"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1169
    and "t \<Rightarrow> t' \<Longrightarrow> ML_closed_t 0 t \<Longrightarrow> kernelt t \<rightarrow>* kernelt t'  & ML_closed_t 0 t'"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1170
    and "(vs :: ml list) \<Rightarrow> vs' \<Longrightarrow> !v : set vs . ML_closed 0 v \<Longrightarrow> map kernel vs \<rightarrow>* map kernel vs' & (! v':set vs'. ML_closed 0 v')"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1171
proof(induct rule:Red_Redt_Redl.inducts)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1172
  fix u v
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1173
  let ?v = "A_ML (Lam_ML u) [v]"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1174
  assume cl: "ML_closed 0 (A_ML (Lam_ML u) [v])"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1175
  let ?u' = "(lift_ml 0 u)[V 0 []/0]"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1176
  have "?v! = At (Lam ((?u')!)) (v !)" by simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1177
  also have "\<dots> \<rightarrow> (?u' !)[v!/0]" (is "_ \<rightarrow> ?R") by(rule tRed.intros)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1178
  also have "?R = u[v/0]!" using cl
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1179
    apply(cut_tac u = "u" and v = "v" in kernel_subst1)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1180
    apply(simp_all)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1181
    done
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1182
  finally have "kernel(A_ML (Lam_ML u) [v]) \<rightarrow>* kernel(u[v/0])" (is ?A) by(rule r_into_rtrancl)
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1183
  moreover have "ML_closed 0 (u[v/0])" (is "?C")
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1184
  proof -
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1185
    let ?f = "\<lambda>n. if n = 0 then v else V_ML (n - 1)"
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1186
    let ?g = "\<lambda>n. v"
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1187
    have clu: "ML_closed (Suc 0) u" and clv: "ML_closed 0 v" using cl by simp+
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1188
    have "ML_closed 0 (subst\<^bsub>ML\<^esub> ?g u)"
25876
nipkow
parents: 25873
diff changeset
  1189
      by (metis COMBK_def ML_closed_subst_ML1_ml clv)
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1190
    hence "ML_closed 0 (subst\<^bsub>ML\<^esub> ?f u)"
25876
nipkow
parents: 25873
diff changeset
  1191
      using subst_ml_ML_coincidence[OF clu, of ?f ?g] by auto
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1192
    thus ?thesis by simp
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1193
  qed
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1194
  ultimately show "?A & ?C" ..
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1195
next
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1196
  case term_of_C thus ?case
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1197
    by (auto simp:ML_closed_t_foldl_At map_compose[symmetric])
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1198
next
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1199
  fix f :: "nat \<Rightarrow> ml" and nm vs v
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1200
  assume f: "\<forall>i. ML_closed 0 (f i)"  and compR: "(nm, vs, v) \<in> compR"
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1201
  have "map (subst Vt) (map (subst\<^bsub>ML\<^esub> f) vs!) = map (subst\<^bsub>ML\<^esub> f) vs!"
25876
nipkow
parents: 25873
diff changeset
  1202
    by(simp add:list_eq_iff_nth_eq subst_Vt_kernel ML_closed_subst_ML1_ml[OF f])
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1203
  with tRed.intros(3)[OF compiler_correct[OF compR f], of Vt,simplified map_compose]
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1204
  have red: "foldl At (Ct nm) ((map (subst\<^bsub>ML\<^esub> f) vs) !) \<rightarrow>
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1205
        (subst\<^bsub>ML\<^esub> f v)!" (is "_ \<rightarrow> ?R")
25876
nipkow
parents: 25873
diff changeset
  1206
    by(simp add:subst_Vt_kernel ML_closed_subst_ML1_ml[OF f])
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1207
  hence "A_ML (CC nm) (map (subst\<^bsub>ML\<^esub> f) vs)! \<rightarrow>* subst\<^bsub>ML\<^esub> f v!" (is ?A) by simp
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1208
  moreover
25876
nipkow
parents: 25873
diff changeset
  1209
  have "ML_closed 0 (subst\<^bsub>ML\<^esub> f v)" (is ?C) by(metis ML_closed_subst_ML1_ml f)
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1210
  ultimately show "?A & ?C" ..
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1211
next
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1212
  case term_of_V thus ?case
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1213
    by (auto simp:map_compose[symmetric]ML_closed_t_foldl_At)
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1214
next
23778
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
  1215
  case (term_of_Fun vf vs n)
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1216
  hence "foldl At (lift 0 vf!)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1217
              (map (subst\<^bsub>ML\<^esub> (\<lambda>n. if n = 0 then V 0 [] else V_ML (n - 1)))
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1218
                (map (lift 0) vs)!)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1219
         = lift 0 (foldl At (vf!) (map kernel vs))"
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1220
    by (simp add:kernel_lift_tm list_eq_iff_nth_eq)
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1221
  hence "term_of (Fun vf vs n)! \<rightarrow>*
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1222
       Lam (term_of (apply (lift 0 (Fun vf vs n)) (V_ML 0)[V 0 []/0]))!"
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1223
    using term_of_Fun
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1224
    apply (simp del:lift_foldl_At)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1225
    apply (metis kernel.simps r_into_rtrancl tRed.intros(2))
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1226
    done
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1227
  moreover
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1228
  have "ML_closed_t 0
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1229
        (Lam (term_of (apply (lift 0 (Fun vf vs n)) (V_ML 0)[V 0 []/0])))"
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1230
    using term_of_Fun by simp
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1231
  ultimately show ?case ..
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1232
next
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1233
  case apply_Fun1 thus ?case by simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1234
next
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1235
  case apply_Fun2 thus ?case by simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1236
next
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1237
  case apply_C thus ?case by simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1238
next
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1239
  case apply_V thus ?case by simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1240
next
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1241
  case ctxt_Lam thus ?case by(auto)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1242
next
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1243
  case ctxt_At1 thus ?case  by(auto)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1244
next
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1245
  case ctxt_At2 thus ?case by (auto)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1246
next
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1247
  case ctxt_term_of thus ?case by (auto)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1248
next
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1249
  case ctxt_C thus ?case by (fastsimp simp:tRed_list_foldl_At)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1250
next
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1251
  case ctxt_V thus ?case by (fastsimp simp:tRed_list_foldl_At)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1252
next
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1253
  case ctxt_Fun1 thus ?case by (fastsimp simp:tRed_list_foldl_At)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1254
next
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1255
  case ctxt_Fun3 thus ?case by (fastsimp simp:tRed_list_foldl_At)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1256
next
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1257
  case ctxt_apply1 thus ?case by auto
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1258
next
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1259
  case ctxt_apply2 thus ?case  by auto
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1260
next
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1261
  case ctxt_A_ML1 thus ?case by (fastsimp simp:tRed_list_foldl_At)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1262
next
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1263
  case ctxt_A_ML2 thus ?case by (fastsimp simp:tRed_list_foldl_At)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1264
next
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1265
  case ctxt_list1 thus ?case by simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1266
next
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1267
  case ctxt_list2 thus ?case by simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1268
qed
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1269
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1270
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1271
lemma [simp]: "Ct n = foldl At t ts \<longleftrightarrow> t = Ct n & ts = []"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1272
by (induct ts arbitrary:t) auto
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1273
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1274
corollary kernel_inv: includes Vars shows
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1275
 "(t :: tm) \<Rightarrow>* t' ==> ML_closed_t 0 t ==> t! \<rightarrow>* t'! \<and> ML_closed_t 0 t' "
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1276
apply(induct rule: rtrancl.induct)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1277
apply (metis rtrancl_eq_or_trancl)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1278
apply (metis Red_sound rtrancl_trans)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1279
done
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1280
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1281
lemma  ML_closed_t_term_of_eval:
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1282
 "t : Pure_tms \<Longrightarrow> ALL i : free_vars t. i < size e \<Longrightarrow>
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1283
 !i<length e. ML_closed n (e!i) \<Longrightarrow> ML_closed_t n (term_of (eval t e))"
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1284
apply(induct arbitrary:n e rule: Pure_tms.induct)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1285
apply simp
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1286
apply simp
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1287
apply simp
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1288
prefer 2 apply simp
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1289
apply(erule_tac x="Suc n" in meta_allE)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1290
apply(erule_tac x="V_ML 0 # map (lift\<^bsub>ML\<^esub> 0) e" in meta_allE)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1291
apply(subgoal_tac "\<forall>i\<in>free_vars t. i < length (V_ML 0 # map (lift\<^bsub>ML\<^esub> 0) e)")
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1292
prefer 2
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1293
apply simp
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1294
apply (metis Nat.less_trans gr0_implies_Suc gr_implies_not0 linorder_neq_iff not_less_eq)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1295
apply(subgoal_tac " \<forall>i<length (V_ML 0 # map (lift\<^bsub>ML\<^esub> 0) e).
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1296
            ML_closed (Suc n) ((V_ML 0 # map (lift\<^bsub>ML\<^esub> 0) e) ! i)")
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1297
apply (auto simp:nth_Cons')
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1298
apply (metis ML_closed_Suc Nat.less_trans Suc_eq_add_numeral_1 Suc_pred' add_0_left less_add_Suc2 less_antisym)
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1299
done
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1300
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1301
theorem includes Vars
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1302
assumes t: "t : Pure_tms" and t': "t' : Pure_tms" and
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1303
closed: "free_vars t = {}" and reds: "term_of (eval t []) \<Rightarrow>* t'"
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1304
shows "t \<rightarrow>* t'"
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1305
proof -
25873
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1306
  have ML_cl: "ML_closed_t 0 (term_of (eval t []))"
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1307
    apply(rule ML_closed_t_term_of_eval[OF t])
b213fd2924be Finally: no more unproven.
nipkow
parents: 25680
diff changeset
  1308
    using closed apply auto done
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1309
  have "(eval t [])! = t!"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1310
    using kernel_eval[OF t, where e="[]"] closed by simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1311
  hence "(term_of (eval t []))! = t!" by simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1312
  moreover have "term_of (eval t [])! \<rightarrow>* t'!"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1313
    using kernel_inv[OF reds ML_cl] by auto
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1314
  ultimately have "t! \<rightarrow>* t'!" by simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1315
  thus  ?thesis using kernel_pure t t' by auto
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1316
qed
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1317
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
  1318
end