src/HOL/ex/NBE.thy
author chaieb
Thu, 26 Jul 2007 21:49:55 +0200
changeset 23996 306aba3e5118
parent 23854 688a8a7bcd4e
child 24447 fbd6d7cbf6dd
permissions -rw-r--r--
Updated reification : CX discontinued for CN
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
*)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
     5
23854
688a8a7bcd4e uniform naming conventions for CG theories
haftmann
parents: 23778
diff changeset
     6
theory NBE imports Main Executable_Set begin
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
     7
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
     8
ML"set quick_and_dirty"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
     9
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    10
declare Let_def[simp]
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    11
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    12
consts_code undefined ("(raise Match)")
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    13
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    14
(*typedecl const_name*)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    15
types lam_var_name = nat
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    16
      ml_var_name = nat
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    17
      const_name = nat
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    18
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    19
datatype tm = Ct const_name | Vt lam_var_name | Lam tm | At tm tm
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    20
            | term_of ml (* function 'to_term' *)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    21
and ml = (* rep of universal datatype *)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    22
          C const_name "ml list" | V lam_var_name "ml list"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    23
        | Fun ml "ml list" nat
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    24
        | "apply" ml ml (* function 'apply' *)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    25
          (* ML *)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    26
        | V_ML ml_var_name | A_ML ml "ml list" | Lam_ML ml
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    27
        | CC const_name (* ref to compiled code *)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    28
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    29
lemma [simp]: "x \<in> set vs \<Longrightarrow> size x < Suc (ml_list_size1 vs)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    30
by (induct vs) auto
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    31
lemma [simp]: "x \<in> set vs \<Longrightarrow> size x < Suc (ml_list_size2 vs)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    32
by (induct vs) auto
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    33
lemma [simp]:"x \<in> set vs \<Longrightarrow> size x < Suc (size v + ml_list_size3 vs)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    34
by (induct vs) auto
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    35
lemma [simp]: "x \<in> set vs \<Longrightarrow> size x < Suc (size v + ml_list_size4 vs)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    36
by (induct vs) auto
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    37
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    38
locale Vars =
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    39
 fixes r s t:: tm
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    40
 and rs ss ts :: "tm list"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    41
 and u v w :: ml
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    42
 and us vs ws :: "ml list"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    43
 and nm :: const_name
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    44
 and x :: lam_var_name
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    45
 and X :: ml_var_name
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    46
23778
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
    47
inductive_set Pure_tms :: "tm set"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
    48
where
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
    49
  "Ct s : Pure_tms"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
    50
| "Vt x : Pure_tms"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
    51
| "t : Pure_tms ==> Lam t : Pure_tms"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
    52
| "s : Pure_tms ==> t : Pure_tms ==> At s t : Pure_tms"
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    53
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    54
consts
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    55
  R :: "(const_name * tm list * tm)set" (* reduction rules *)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    56
  compR :: "(const_name * ml list * ml)set" (* compiled reduction rules *)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    57
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    58
fun
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    59
  lift_tm :: "nat \<Rightarrow> tm \<Rightarrow> tm" ("lift") and
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    60
  lift_ml :: "nat \<Rightarrow> ml \<Rightarrow> ml" ("lift")
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    61
where
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    62
"lift i (Ct nm) = Ct nm" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    63
"lift i (Vt x) = Vt(if x < i then x else x+1)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    64
"lift i (Lam t) = Lam (lift (i+1) t)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    65
"lift i (At s t) = At (lift i s) (lift i t)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    66
"lift i (term_of v) = term_of (lift i v)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    67
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    68
"lift i (C nm vs) = C nm (map (lift i) vs)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    69
"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
    70
"lift i (Fun v vs n) = Fun (lift i v) (map (lift i) vs) n" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    71
"lift i (apply u v) = apply (lift i u) (lift i v)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    72
"lift i (V_ML X) = V_ML X" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    73
"lift i (A_ML v vs) = A_ML (lift i v) (map (lift i) vs)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    74
"lift i (Lam_ML v) = Lam_ML (lift i v)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    75
"lift i (CC nm) = CC nm"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    76
(*
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    77
termination
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    78
apply (relation "measure (sum_case (%(i,t). size t) (%(i,v). size v))")
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    79
apply auto
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    80
*)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    81
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    82
fun
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    83
  lift_tm_ML :: "nat \<Rightarrow> tm \<Rightarrow> tm" ("lift\<^bsub>ML\<^esub>") and
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    84
  lift_ml_ML :: "nat \<Rightarrow> ml \<Rightarrow> ml" ("lift\<^bsub>ML\<^esub>")
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    85
where
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    86
"lift\<^bsub>ML\<^esub> i (Ct nm) = Ct nm" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    87
"lift\<^bsub>ML\<^esub> i (Vt x) = Vt x" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    88
"lift\<^bsub>ML\<^esub> i (Lam t) = Lam (lift\<^bsub>ML\<^esub> i t)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    89
"lift\<^bsub>ML\<^esub> i (At s t) = At (lift\<^bsub>ML\<^esub> i s) (lift\<^bsub>ML\<^esub> i t)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    90
"lift\<^bsub>ML\<^esub> i (term_of v) = term_of (lift\<^bsub>ML\<^esub> i v)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    91
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
    92
"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
    93
"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
    94
"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
    95
"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
    96
"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
    97
"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
    98
"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
    99
"lift\<^bsub>ML\<^esub> i (CC nm) = CC nm"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   100
(*
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   101
termination
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   102
  by (relation "measure (sum_case (%(i,t). size t) (%(i,v). size v))") auto
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   103
*)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   104
constdefs
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   105
 cons :: "tm \<Rightarrow> (nat \<Rightarrow> tm) \<Rightarrow> (nat \<Rightarrow> tm)" (infix "##" 65)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   106
"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
   107
 cons_ML :: "ml \<Rightarrow> (nat \<Rightarrow> ml) \<Rightarrow> (nat \<Rightarrow> ml)" (infix "##" 65)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   108
"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
   109
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   110
(* Only for pure terms! *)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   111
consts subst :: "(nat \<Rightarrow> tm) \<Rightarrow> tm \<Rightarrow> tm"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   112
primrec
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   113
"subst f (Ct nm) = Ct nm"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   114
"subst f (Vt x) = f x"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   115
"subst f (Lam t) = Lam (subst (Vt 0 ## f) t)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   116
"subst f (At s t) = At (subst f s) (subst f t)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   117
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   118
lemma size_lift[simp]: shows
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   119
 "size(lift i t) = size(t::tm)" and "size(lift i (v::ml)) = size v"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   120
and "ml_list_size1 (map (lift i) vs) = ml_list_size1 vs"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   121
and "ml_list_size2 (map (lift i) vs) = ml_list_size2 vs"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   122
and "ml_list_size3 (map (lift i) vs) = ml_list_size3 vs"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   123
and "ml_list_size4 (map (lift i) vs) = ml_list_size4 vs"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   124
by (induct arbitrary: i and i and i and i and i and i rule: tm_ml.inducts)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   125
   simp_all
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   126
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   127
lemma size_lift_ML[simp]: shows
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   128
 "size(lift\<^bsub>ML\<^esub> i t) = size(t::tm)" and "size(lift\<^bsub>ML\<^esub> i (v::ml)) = size v"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   129
and "ml_list_size1 (map (lift\<^bsub>ML\<^esub> i) vs) = ml_list_size1 vs"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   130
and "ml_list_size2 (map (lift\<^bsub>ML\<^esub> i) vs) = ml_list_size2 vs"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   131
and "ml_list_size3 (map (lift\<^bsub>ML\<^esub> i) vs) = ml_list_size3 vs"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   132
and "ml_list_size4 (map (lift\<^bsub>ML\<^esub> i) vs) = ml_list_size4 vs"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   133
by (induct arbitrary: i and i and i and i and i and i rule: tm_ml.inducts)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   134
   simp_all
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   135
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   136
fun
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   137
  subst_ml_ML :: "(nat \<Rightarrow> ml) \<Rightarrow> ml \<Rightarrow> ml" ("subst\<^bsub>ML\<^esub>") and
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   138
  subst_tm_ML :: "(nat \<Rightarrow> ml) \<Rightarrow> tm \<Rightarrow> tm" ("subst\<^bsub>ML\<^esub>")
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   139
where
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   140
"subst\<^bsub>ML\<^esub> f (Ct nm) = Ct nm" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   141
"subst\<^bsub>ML\<^esub> f (Vt x) = Vt x" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   142
"subst\<^bsub>ML\<^esub> f (Lam t) = Lam (subst\<^bsub>ML\<^esub> (lift 0 o f) t)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   143
"subst\<^bsub>ML\<^esub> f (At s t) = At (subst\<^bsub>ML\<^esub> f s) (subst\<^bsub>ML\<^esub> f t)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   144
"subst\<^bsub>ML\<^esub> f (term_of v) = term_of (subst\<^bsub>ML\<^esub> f v)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   145
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   146
"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
   147
"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
   148
"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
   149
"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
   150
"subst\<^bsub>ML\<^esub> f (V_ML X) = f X" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   151
"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
   152
"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
   153
"subst\<^bsub>ML\<^esub> f (CC nm) = CC nm"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   154
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   155
(* FIXME currrently needed for code generator *)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   156
lemmas [code] = lift_tm_ML.simps lift_ml_ML.simps
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   157
lemmas [code] = lift_tm.simps lift_ml.simps
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   158
lemmas [code] = subst_tm_ML.simps subst_ml_ML.simps
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   159
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   160
abbreviation
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   161
  subst_decr :: "nat \<Rightarrow> tm \<Rightarrow> nat \<Rightarrow> tm" where
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   162
 "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
   163
abbreviation
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   164
  subst_decr_ML :: "nat \<Rightarrow> ml \<Rightarrow> nat \<Rightarrow> ml" where
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   165
 "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
   166
abbreviation
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   167
  subst1 :: "tm \<Rightarrow> tm \<Rightarrow> nat \<Rightarrow> tm" ("(_/[_'/_])" [300, 0, 0] 300) where
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   168
 "s[t/k] == subst (subst_decr k t) s"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   169
abbreviation
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   170
  subst1_ML :: "ml \<Rightarrow> ml \<Rightarrow> nat \<Rightarrow> ml" ("(_/[_'/_])" [300, 0, 0] 300) where
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   171
 "u[v/k] == subst\<^bsub>ML\<^esub> (subst_decr_ML k v) u"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   172
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   173
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   174
lemma size_subst_ML[simp]: shows 
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   175
 "(!x. size(f x) = 0) \<longrightarrow> size(subst\<^bsub>ML\<^esub> f t) = size(t::tm)" and
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   176
"(!x. size(f x) = 0) \<longrightarrow> size(subst\<^bsub>ML\<^esub> f (v::ml)) = size v"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   177
and "(!x. size(f x) = 0) \<longrightarrow> ml_list_size1 (map (subst\<^bsub>ML\<^esub> f) vs) = ml_list_size1 vs"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   178
and "(!x. size(f x) = 0) \<longrightarrow> ml_list_size2 (map (subst\<^bsub>ML\<^esub> f) vs) = ml_list_size2 vs"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   179
and "(!x. size(f x) = 0) \<longrightarrow> ml_list_size3 (map (subst\<^bsub>ML\<^esub> f) vs) = ml_list_size3 vs"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   180
and "(!x. size(f x) = 0) \<longrightarrow> ml_list_size4 (map (subst\<^bsub>ML\<^esub> f) vs) = ml_list_size4 vs"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   181
apply (induct arbitrary: f and f and f and f and f and f rule: tm_ml.inducts)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   182
apply (simp_all add:cons_ML_def split:nat.split)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   183
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   184
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   185
lemma lift_lift: includes Vars shows
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   186
    "i < k+1 \<Longrightarrow> lift (Suc k) (lift i t) = lift i (lift k t)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   187
and "i < k+1 \<Longrightarrow> lift (Suc k) (lift i v) = lift i (lift k v)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   188
apply(induct t and v arbitrary: i and i rule:lift_tm_lift_ml.induct)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   189
apply(simp_all add:map_compose[symmetric])
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   190
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   191
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   192
corollary lift_o_lift: shows
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   193
 "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
   194
 "i < k+1 \<Longrightarrow> lift_ml (Suc k) o (lift_ml i) = lift_ml i o lift_ml k"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   195
by(rule ext, simp add:lift_lift)+
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   196
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   197
lemma lift_lift_ML: includes Vars shows
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   198
    "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)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   199
and "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)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   200
apply(induct t and v arbitrary: i and i rule:lift_tm_ML_lift_ml_ML.induct)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   201
apply(simp_all add:map_compose[symmetric])
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   202
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   203
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   204
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   205
lemma lift_lift_ML_comm: includes Vars shows
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   206
 "lift j (lift\<^bsub>ML\<^esub> i t) = lift\<^bsub>ML\<^esub> i (lift j t)" and
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   207
 "lift j (lift\<^bsub>ML\<^esub> i v) = lift\<^bsub>ML\<^esub> i (lift j v)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   208
apply(induct t and v arbitrary: i j and i j rule:lift_tm_ML_lift_ml_ML.induct)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   209
apply(simp_all add:map_compose[symmetric])
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   210
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   211
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   212
lemma [simp]:
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   213
 "V_ML 0 ## subst_decr_ML k v = subst_decr_ML (Suc k) (lift\<^bsub>ML\<^esub> 0 v)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   214
by(rule ext)(simp add:cons_ML_def split:nat.split)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   215
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   216
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
   217
by(rule ext)(simp add:cons_ML_def split:nat.split)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   218
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   219
lemma subst_lift_id[simp]: includes Vars shows
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   220
 "subst\<^bsub>ML\<^esub> (subst_decr_ML k v) (lift\<^bsub>ML\<^esub> k t) = t" and "(lift\<^bsub>ML\<^esub> k u)[v/k] = u"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   221
apply(induct k t and k u arbitrary: v and v rule: lift_tm_ML_lift_ml_ML.induct)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   222
apply (simp_all add:map_idI map_compose[symmetric])
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   223
apply (simp cong:if_cong)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   224
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   225
23778
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   226
inductive_set
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   227
  tRed :: "(tm * tm)set" (* beta + R reduction on pure terms *)
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   228
  and tred :: "[tm, tm] => bool"  (infixl "\<rightarrow>" 50)
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   229
where
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   230
  "s \<rightarrow> t == (s, t) \<in> tRed"
23778
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   231
| "At (Lam t) s \<rightarrow> t[s/0]"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   232
| "(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
   233
| "t \<rightarrow> t' ==> Lam t \<rightarrow> Lam t'"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   234
| "s \<rightarrow> s' ==> At s t \<rightarrow> At s' t"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   235
| "t \<rightarrow> t' ==> At s t \<rightarrow> At s t'"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   236
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   237
abbreviation
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   238
  treds :: "[tm, tm] => bool"  (infixl "\<rightarrow>*" 50) where
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   239
  "s \<rightarrow>* t == (s, t) \<in> tRed^*"
23778
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   240
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   241
inductive_set
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   242
  tRed_list :: "(tm list * tm list) set"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   243
  and treds_list :: "[tm list, tm list] \<Rightarrow> bool" (infixl "\<rightarrow>*" 50)
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   244
where
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   245
  "ss \<rightarrow>* ts == (ss, ts) \<in> tRed_list"
23778
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   246
| "[] \<rightarrow>* []"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   247
| "ts \<rightarrow>* ts' ==> t \<rightarrow>* t' ==> t#ts \<rightarrow>* t'#ts'"
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   248
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   249
declare tRed_list.intros[simp]
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   250
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   251
lemma tRed_list_refl[simp]: includes Vars shows "ts \<rightarrow>* ts"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   252
by(induct ts) auto
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   253
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   254
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   255
fun ML_closed :: "nat \<Rightarrow> ml \<Rightarrow> bool"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   256
and ML_closed_t :: "nat \<Rightarrow> tm \<Rightarrow> bool" where
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   257
"ML_closed i (C nm vs) = (ALL v:set vs. ML_closed i v)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   258
"ML_closed i (V nm vs) = (ALL v:set vs. ML_closed i v)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   259
"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
   260
"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
   261
"ML_closed i (apply v w) = (ML_closed i v & ML_closed i w)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   262
"ML_closed i (CC nm) = True" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   263
"ML_closed i (V_ML X) = (X<i)"  |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   264
"ML_closed i (Lam_ML v) = ML_closed (i+1) v" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   265
"ML_closed_t i (term_of v) = ML_closed i v" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   266
"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
   267
"ML_closed_t i (Lam t) = (ML_closed_t i t)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   268
"ML_closed_t i v = True"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   269
thm ML_closed.simps ML_closed_t.simps
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   270
23778
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   271
inductive_set
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   272
  Red :: "(ml * ml)set"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   273
  and Redt :: "(tm * tm)set"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   274
  and Redl :: "(ml list * ml list)set"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   275
  and red :: "[ml, ml] => bool"  (infixl "\<Rightarrow>" 50)
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   276
  and redl :: "[ml list, ml list] => bool"  (infixl "\<Rightarrow>" 50)
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   277
  and redt :: "[tm, tm] => bool"  (infixl "\<Rightarrow>" 50)
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   278
  and reds :: "[ml, ml] => bool"  (infixl "\<Rightarrow>*" 50)
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   279
  and redts :: "[tm, tm] => bool"  (infixl "\<Rightarrow>*" 50)
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   280
where
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   281
  "s \<Rightarrow> t == (s, t) \<in> Red"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   282
| "s \<Rightarrow> t == (s, t) \<in> Redl"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   283
| "s \<Rightarrow> t == (s, t) \<in> Redt"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   284
| "s \<Rightarrow>* t == (s, t) \<in> Red^*"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   285
| "s \<Rightarrow>* t == (s, t) \<in> Redt^*"
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   286
(* ML *)
23778
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   287
| "A_ML (Lam_ML u) [v] \<Rightarrow> u[v/0]"
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   288
(* compiled rules *)
23778
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   289
| "(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
   290
(* apply *)
23778
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   291
| 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
   292
| apply_Fun2: "n > 0 ==>
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   293
 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
   294
| apply_C: "apply (C nm vs) v \<Rightarrow> C nm (vs @ [v])"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   295
| apply_V: "apply (V x vs) v \<Rightarrow> V x (vs @ [v])"
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   296
(* term_of *)
23778
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   297
| 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
   298
| 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
   299
| term_of_Fun: "term_of(Fun vf vs n) \<Rightarrow>
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   300
 Lam (term_of ((apply (lift 0 (Fun vf vs n)) (V_ML 0))[V 0 []/0]))"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   301
(* Context *)
23778
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   302
| ctxt_Lam: "t \<Rightarrow> t' ==> Lam t \<Rightarrow> Lam t'"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   303
| ctxt_At1: "s \<Rightarrow> s' ==> At s t \<Rightarrow> At s' t"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   304
| ctxt_At2: "t \<Rightarrow> t' ==> At s t \<Rightarrow> At s t'"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   305
| 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
   306
| ctxt_C: "vs \<Rightarrow> vs' ==> C nm vs \<Rightarrow> C nm vs'"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   307
| ctxt_V: "vs \<Rightarrow> vs' ==> V x vs \<Rightarrow> V x vs'"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   308
| 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
   309
| 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
   310
| ctxt_apply1: "s \<Rightarrow> s'   ==> apply s t \<Rightarrow> apply s' t"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   311
| ctxt_apply2: "t \<Rightarrow> t'   ==> apply s t \<Rightarrow> apply s t'"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   312
| 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
   313
| 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
   314
| ctxt_list1: "v \<Rightarrow> v'   ==> v#vs \<Rightarrow> v'#vs"
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   315
| ctxt_list2: "vs \<Rightarrow> vs' ==> v#vs \<Rightarrow> v#vs'"
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   316
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   317
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   318
consts
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   319
 ar :: "const_name \<Rightarrow> nat"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   320
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   321
axioms
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   322
ar_pos: "ar nm > 0"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   323
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   324
types env = "ml list"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   325
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   326
consts eval :: "tm \<Rightarrow> env \<Rightarrow> ml"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   327
primrec
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   328
"eval (Vt x) e = e!x"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   329
"eval (Ct nm) e = Fun (CC nm) [] (ar nm)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   330
"eval (At s t) e = apply (eval s e) (eval t e)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   331
"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
   332
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   333
fun size' :: "ml \<Rightarrow> nat" where
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   334
"size' (C nm vs) = (\<Sum>v\<leftarrow>vs. size' v)+1" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   335
"size' (V nm vs) = (\<Sum>v\<leftarrow>vs. size' v)+1" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   336
"size' (Fun f vs n) = (size' f + (\<Sum>v\<leftarrow>vs. size' v))+1" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   337
"size' (A_ML v vs) = (size' v + (\<Sum>v\<leftarrow>vs. size' v))+1" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   338
"size' (apply v w) = (size' v + size' w)+1" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   339
"size' (CC nm) = 1" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   340
"size' (V_ML X) = 1"  |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   341
"size' (Lam_ML v) = size' v + 1"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   342
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   343
lemma listsum_size'[simp]:
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   344
 "v \<in> set vs \<Longrightarrow> size' v < Suc(listsum (map size' vs))"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   345
sorry
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   346
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   347
corollary cor_listsum_size'[simp]:
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   348
 "v \<in> set vs \<Longrightarrow> size' v < Suc(m + listsum (map size' vs))"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   349
using listsum_size'[of v vs] by arith
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   350
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   351
lemma
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   352
size_subst_ML[simp]: includes Vars assumes A: "!i. size(f i) = 0"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   353
shows "size(subst\<^bsub>ML\<^esub> f t) = size(t)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   354
and "size(subst\<^bsub>ML\<^esub> f v) = size(v)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   355
and "ml_list_size1 (map (subst\<^bsub>ML\<^esub> f) vs) = ml_list_size1 vs"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   356
and "ml_list_size2 (map (subst\<^bsub>ML\<^esub> f) vs) = ml_list_size2 vs"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   357
and "ml_list_size3 (map (subst\<^bsub>ML\<^esub> f) vs) = ml_list_size3 vs"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   358
and "ml_list_size4 (map (subst\<^bsub>ML\<^esub> f) vs) = ml_list_size4 vs"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   359
by (induct rule: tm_ml.inducts) (simp_all add: A cons_ML_def split:nat.split)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   360
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   361
lemma [simp]:
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   362
 "\<forall>i j. size'(f i) = size'(V_ML j) \<Longrightarrow> size' (subst\<^bsub>ML\<^esub> f v) = size' v"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   363
sorry
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   364
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   365
lemma [simp]: "size' (lift i v) = size' v"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   366
sorry
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   367
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   368
(* the kernel function as in Section 4.1 of "Operational aspects\<dots>" *)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   369
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   370
function kernel  :: "ml \<Rightarrow> tm" ("_!" 300) where
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   371
"(C nm vs)! = foldl At (Ct nm) (map kernel vs)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   372
"(Lam_ML v)! = Lam (((lift 0 v)[V 0 []/0])!)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   373
"(Fun f vs n)! = foldl At (f!) (map kernel vs)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   374
"(A_ML v vs)! = foldl At (v!) (map kernel vs)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   375
"(apply v w)! = At (v!) (w!)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   376
"(CC nm)! = Ct nm" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   377
"(V x vs)! = foldl At (Vt x) (map kernel vs)" |
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   378
"(V_ML X)! = undefined"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   379
by pat_completeness auto
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   380
termination by(relation "measure size'") auto
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   381
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   382
consts kernelt :: "tm \<Rightarrow> tm" ("_!" 300)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   383
primrec 
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   384
"(Ct nm)! = Ct nm"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   385
"(term_of v)! = v!"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   386
"(Vt x)! = Vt x"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   387
"(At s t)! = At (s!) (t!)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   388
"(Lam t)! = Lam (t!)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   389
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   390
abbreviation
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   391
  kernels :: "ml list \<Rightarrow> tm list" ("_!" 300) where
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   392
  "vs ! == map kernel vs"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   393
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   394
(* soundness of the code generator *)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   395
axioms
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   396
compiler_correct:
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   397
"(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
   398
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   399
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   400
consts
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   401
  free_vars :: "tm \<Rightarrow> lam_var_name set"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   402
primrec
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   403
"free_vars (Ct nm) = {}"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   404
"free_vars (Vt x) = {x}"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   405
"free_vars (Lam t) = {i. EX j : free_vars t. j = i+1}"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   406
"free_vars (At s t) = free_vars s \<union> free_vars t"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   407
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   408
lemma [simp]: "t : Pure_tms \<Longrightarrow> lift\<^bsub>ML\<^esub> k t = t"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   409
by (erule Pure_tms.induct) simp_all
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   410
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   411
lemma kernel_pure: includes Vars assumes "t : Pure_tms" shows "t! = t"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   412
using assms by (induct) simp_all
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   413
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   414
lemma lift_eval:
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   415
 "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
   416
apply(induct set:Pure_tms)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   417
apply simp_all
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   418
apply clarsimp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   419
apply(erule_tac x = "V_ML 0 # map (lift\<^bsub>ML\<^esub> 0) e" in allE)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   420
apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   421
apply(erule impE)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   422
 apply clarsimp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   423
 apply(case_tac i)apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   424
 apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   425
apply (simp add: map_compose[symmetric])
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   426
apply (simp add: o_def lift_lift_ML_comm)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   427
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   428
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   429
lemma lift_ML_eval[rule_format]:
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   430
 "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
   431
apply(induct set:Pure_tms)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   432
apply simp_all
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   433
apply clarsimp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   434
apply(erule_tac x = "V_ML 0 # map (lift\<^bsub>ML\<^esub> 0) e" in allE)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   435
apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   436
apply(erule impE)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   437
 apply clarsimp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   438
 apply(case_tac i)apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   439
 apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   440
apply (simp add: map_compose[symmetric])
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   441
apply (simp add:o_def lift_lift_ML)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   442
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   443
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   444
lemma [simp]: includes Vars shows "(v ## f) 0 = v"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   445
by(simp add:cons_ML_def)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   446
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   447
lemma [simp]:  includes Vars shows "(v ## f) (Suc n) = lift\<^bsub>ML\<^esub> 0 (f n)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   448
by(simp add:cons_ML_def)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   449
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   450
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
   451
apply(rule ext)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   452
apply (simp add:cons_ML_def lift_lift_ML_comm split:nat.split)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   453
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   454
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   455
lemma lift_subst_ML: shows
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   456
 "lift_tm k (subst\<^bsub>ML\<^esub> f t) = subst\<^bsub>ML\<^esub> (lift_ml k o f) (lift_tm k t)" and
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   457
 "lift_ml k (subst\<^bsub>ML\<^esub> f v) = subst\<^bsub>ML\<^esub> (lift_ml k o f) (lift_ml k v)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   458
apply (induct t and v arbitrary: f k and f k rule: lift_tm_lift_ml.induct)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   459
apply (simp_all add:map_compose[symmetric] o_assoc lift_o_lift lift_o_shift)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   460
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   461
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   462
corollary lift_subst_ML1: "\<forall>v k. lift_ml 0 (u[v/k]) = (lift_ml 0 u)[lift 0 v/k]"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   463
apply(rule measure_induct[where f = "size" and a = u])
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   464
apply(case_tac x)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   465
apply(simp_all add:lift_lift map_compose[symmetric] lift_subst_ML)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   466
apply(subst lift_lift_ML_comm)apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   467
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   468
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   469
lemma lift_ML_lift_ML: includes Vars shows
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   470
    "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)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   471
and "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)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   472
apply (induct k t and k v arbitrary: i k and i k
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   473
       rule: lift_tm_ML_lift_ml_ML.induct)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   474
apply(simp_all add:map_compose[symmetric])
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   475
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   476
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   477
corollary lift_ML_o_lift_ML: shows
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   478
 "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
   479
 "i < k+1 \<Longrightarrow> lift_ml_ML (Suc k) o (lift_ml_ML i) = lift_ml_ML i o lift_ml_ML k"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   480
by(rule ext, simp add:lift_ML_lift_ML)+
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   481
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   482
abbreviation insrt where
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   483
"insrt k f == (%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)))"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   484
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   485
lemma subst_insrt_lift: includes Vars shows
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   486
 "subst\<^bsub>ML\<^esub> (insrt k f) (lift\<^bsub>ML\<^esub> k t) = lift\<^bsub>ML\<^esub> k (subst\<^bsub>ML\<^esub> f t)" and
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   487
 "subst\<^bsub>ML\<^esub> (insrt k f) (lift\<^bsub>ML\<^esub> k v) = lift\<^bsub>ML\<^esub> k (subst\<^bsub>ML\<^esub> f v)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   488
apply (induct k t and k v arbitrary: f k and f k rule: lift_tm_ML_lift_ml_ML.induct)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   489
apply (simp_all add:map_compose[symmetric] o_assoc lift_o_lift lift_o_shift)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   490
  apply(subgoal_tac "lift 0 \<circ> insrt k f = insrt k (lift 0 \<circ> f)")
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   491
  apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   492
 apply(rule ext)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   493
 apply (simp add:lift_lift_ML_comm)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   494
apply(subgoal_tac "V_ML 0 ## insrt k f = insrt (Suc k) (V_ML 0 ## f)")
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   495
 apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   496
 apply(rule ext)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   497
 apply (simp add:lift_ML_lift_ML cons_ML_def split:nat.split)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   498
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   499
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   500
corollary subst_cons_lift: includes Vars shows
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   501
 "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
   502
apply(rule ext)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   503
apply(simp add: cons_ML_def subst_insrt_lift[symmetric])
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   504
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
   505
 apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   506
apply(rule ext, simp split:nat.split)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   507
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   508
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   509
lemma subst_eval[rule_format]: "t : Pure_tms \<Longrightarrow>
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   510
 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
   511
apply(induct set:Pure_tms)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   512
apply simp_all
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   513
apply clarsimp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   514
apply(erule_tac x="V_ML 0 ## f" in allE)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   515
apply(erule_tac x= "(V_ML 0 # map (lift\<^bsub>ML\<^esub> 0) e)" in allE)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   516
apply(erule impE)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   517
 apply clarsimp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   518
 apply(case_tac i)apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   519
 apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   520
apply (simp add:subst_cons_lift map_compose[symmetric])
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   521
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   522
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   523
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   524
theorem kernel_eval[rule_format]: includes Vars shows
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   525
 "t : Pure_tms ==>
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   526
 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
   527
apply(induct set:Pure_tms)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   528
apply simp_all
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   529
apply clarsimp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   530
apply(subst lift_eval) apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   531
 apply clarsimp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   532
 apply(case_tac i)apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   533
 apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   534
apply(subst subst_eval) apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   535
 apply clarsimp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   536
 apply(case_tac i)apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   537
 apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   538
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
   539
                (map (lift 0) (V_ML 0 # map (lift\<^bsub>ML\<^esub> 0) e))" in allE)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   540
apply(erule impE)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   541
apply(clarsimp)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   542
 apply(case_tac i)apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   543
 apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   544
apply(erule impE)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   545
apply(clarsimp)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   546
 apply(case_tac i)apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   547
 apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   548
apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   549
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   550
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   551
(*
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   552
lemma subst_ML_compose:
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   553
  "subst_ml_ML f2 (subst_ml_ML f1 v) = subst_ml_ML (%i. subst_ml_ML f2 (f1 i)) v"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   554
sorry
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   555
*)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   556
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   557
lemma map_eq_iff_nth:
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   558
 "(map f xs = map g xs) = (!i<size xs. f(xs!i) = g(xs!i))"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   559
sorry
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   560
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   561
lemma [simp]: includes Vars shows "ML_closed k v \<Longrightarrow> lift\<^bsub>ML\<^esub> k v = v"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   562
sorry
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   563
lemma [simp]: includes Vars shows "ML_closed 0 v \<Longrightarrow> subst\<^bsub>ML\<^esub> f v = v"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   564
sorry
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   565
lemma [simp]: includes Vars shows "ML_closed k v \<Longrightarrow> ML_closed k (lift m v)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   566
sorry
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   567
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   568
lemma red_Lam[simp]: includes Vars shows "t \<rightarrow>* t' ==> Lam t \<rightarrow>* Lam t'"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   569
apply(induct rule:rtrancl_induct)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   570
apply(simp_all)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   571
apply(blast intro: rtrancl_into_rtrancl tRed.intros)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   572
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   573
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   574
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
   575
apply(induct rule:rtrancl_induct)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   576
apply(simp_all)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   577
apply(blast intro: rtrancl_into_rtrancl tRed.intros)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   578
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   579
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   580
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
   581
apply(induct rule:rtrancl_induct)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   582
apply(simp_all)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   583
apply(blast intro:rtrancl_into_rtrancl tRed.intros)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   584
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   585
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   586
lemma tRed_list_foldl_At:
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   587
 "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
   588
apply(induct arbitrary:s s' rule:tRed_list.induct)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   589
apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   590
apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   591
apply(blast dest: red_At1 red_At2 intro:rtrancl_trans)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   592
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   593
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   594
lemma [trans]: "s = t \<Longrightarrow> t \<rightarrow> t' \<Longrightarrow> s \<rightarrow> t'"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   595
by simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   596
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   597
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   598
lemma subst_foldl[simp]:
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   599
 "subst f (foldl At s ts) = foldl At (subst f s) (map (subst f) ts)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   600
by (induct ts arbitrary: s) auto
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   601
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   602
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   603
lemma foldl_At_size: "size ts = size ts' \<Longrightarrow>
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   604
 foldl At s ts = foldl At s' ts' \<longleftrightarrow> s = s' & ts = ts'"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   605
by (induct arbitrary: s s' rule:list_induct2) simp_all
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   606
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   607
consts depth_At :: "tm \<Rightarrow> nat"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   608
primrec
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   609
"depth_At(Ct cn) = 0"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   610
"depth_At(Vt x) = 0"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   611
"depth_At(Lam t) = 0"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   612
"depth_At(At s t) = depth_At s + 1"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   613
"depth_At(term_of v) = 0"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   614
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   615
lemma depth_At_foldl:
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   616
 "depth_At(foldl At s ts) = depth_At s + size ts"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   617
by (induct ts arbitrary: s) simp_all
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   618
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   619
lemma foldl_At_eq_length:
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   620
 "foldl At s ts = foldl At s ts' \<Longrightarrow> length ts = length ts'"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   621
apply(subgoal_tac "depth_At(foldl At s ts) = depth_At(foldl At s ts')")
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   622
apply(erule thin_rl)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   623
 apply (simp add:depth_At_foldl)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   624
apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   625
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   626
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   627
lemma foldl_At_eq[simp]: "foldl At s ts = foldl At s ts' \<longleftrightarrow> ts = ts'"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   628
apply(rule)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   629
 prefer 2 apply simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   630
apply(blast dest:foldl_At_size foldl_At_eq_length)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   631
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   632
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   633
lemma [simp]: "foldl At s ts ! = foldl At (s!) (map kernelt ts)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   634
by (induct ts arbitrary: s) simp_all
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   635
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   636
lemma [simp]: "(kernelt \<circ> term_of) = kernel"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   637
by(rule ext) simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   638
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   639
lemma shift_subst_decr:
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   640
 "Vt 0 ## subst_decr k t = subst_decr (Suc k) (lift 0 t)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   641
apply(rule ext)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   642
apply (simp add:cons_def split:nat.split)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   643
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   644
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   645
lemma [simp]: "lift k (foldl At s ts) = foldl At (lift k s) (map (lift k) ts)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   646
by(induct ts arbitrary:s) simp_all
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   647
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   648
subsection "Horrible detour"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   649
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   650
definition "liftn n == lift_ml 0 ^ n"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   651
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   652
lemma [simp]: "liftn n (C i vs) = C i (map (liftn n) vs)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   653
apply(unfold liftn_def)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   654
apply(induct n)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   655
apply (simp_all add: map_compose[symmetric])
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   656
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   657
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   658
lemma [simp]: "liftn n (CC nm) = CC nm"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   659
apply(unfold liftn_def)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   660
apply(induct n)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   661
apply (simp_all add: map_compose[symmetric])
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   662
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   663
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   664
lemma [simp]: "liftn n (apply v w) = apply (liftn n v) (liftn n w)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   665
apply(unfold liftn_def)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   666
apply(induct n)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   667
apply (simp_all add: map_compose[symmetric])
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   668
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   669
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   670
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
   671
apply(unfold liftn_def)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   672
apply(induct n)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   673
apply (simp_all add: map_compose[symmetric])
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   674
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   675
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   676
lemma [simp]:
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   677
 "liftn n (Fun v vs i) = Fun (liftn n v) (map (liftn n) vs) i"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   678
apply(unfold liftn_def)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   679
apply(induct n)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   680
apply (simp_all add: map_compose[symmetric] id_def)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   681
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   682
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   683
lemma [simp]: "liftn n (Lam_ML v) = Lam_ML (liftn n v)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   684
apply(unfold liftn_def)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   685
apply(induct n)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   686
apply (simp_all add: map_compose[symmetric] id_def)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   687
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   688
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   689
lemma liftn_liftn_add: "liftn m (liftn n v) = liftn (m+n) v"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   690
by(simp add:liftn_def funpow_add)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   691
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   692
lemma [simp]: "liftn n (V_ML k) = V_ML k"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   693
apply(unfold liftn_def)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   694
apply(induct n)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   695
apply (simp_all)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   696
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   697
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   698
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
   699
apply(unfold liftn_def)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   700
apply(induct n)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   701
apply (simp_all add:lift_lift_ML_comm)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   702
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   703
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   704
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
   705
apply(simp add:cons_ML_def liftn_lift_ML_comm split:nat.split)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   706
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   707
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   708
text{* End of horrible detour *}
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   709
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   710
lemma kernel_subst1:
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   711
"ML_closed 1 u \<Longrightarrow> ML_closed 0 v \<Longrightarrow> kernel( u[v/0]) = (kernel((lift 0 u)[V 0 []/0]))[kernel v/0]"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   712
sorry
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   713
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   714
lemma includes Vars shows foldl_Pure[simp]:
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   715
 "t : Pure_tms \<Longrightarrow> \<forall>t\<in>set ts. t : Pure_tms \<Longrightarrow> 
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   716
 (!!s t. s : Pure_tms \<Longrightarrow> t : Pure_tms \<Longrightarrow> f s t : Pure_tms) \<Longrightarrow>
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   717
 foldl f t ts \<in> Pure_tms"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   718
by(induct ts arbitrary: t) simp_all
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   719
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   720
declare Pure_tms.intros[simp]
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   721
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   722
lemma includes Vars shows "ML_closed 0 v \<Longrightarrow> kernel v : Pure_tms"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   723
apply(induct rule:kernel.induct)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   724
apply simp_all
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   725
apply(rule Pure_tms.intros);
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   726
(* "ML_closed (Suc k) v \<Longrightarrow> ML_closed k (lift 0 v)" *)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   727
sorry
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   728
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   729
lemma subst_Vt: includes Vars shows "subst Vt = id"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   730
sorry
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   731
(*
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   732
apply(rule ext)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   733
apply(induct_tac x)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   734
apply simp_all
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   735
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   736
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   737
*)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   738
(* klappt noch nicht ganz *)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   739
theorem Red_sound: includes Vars
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   740
 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
   741
    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
   742
    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
   743
proof(induct rule:Red_Redt_Redl.inducts)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   744
  fix u v
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   745
  let ?v = "A_ML (Lam_ML u) [v]"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   746
  assume cl: "ML_closed 0 (A_ML (Lam_ML u) [v])"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   747
  let ?u' = "(lift_ml 0 u)[V 0 []/0]"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   748
  have "?v! = At (Lam ((?u')!)) (v !)" by simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   749
  also have "\<dots> \<rightarrow> (?u' !)[v!/0]" (is "_ \<rightarrow> ?R") by(rule tRed.intros)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   750
  also have "?R = u[v/0]!" using cl
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   751
apply(cut_tac u = "u" and v = "v" in kernel_subst1)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   752
apply(simp_all)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   753
done
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   754
  finally have "kernel(A_ML (Lam_ML u) [v]) \<rightarrow>* kernel(u[v/0])" (is ?A) by(rule r_into_rtrancl)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   755
  moreover have "ML_closed 0 (u[v/0])" (is "?C") using cl apply simp sorry
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   756
  ultimately show "?A & ?C" ..
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   757
next
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   758
  case term_of_C thus ?case apply (auto simp:map_compose[symmetric])sorry
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   759
next
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   760
  fix f :: "nat \<Rightarrow> ml" and nm vs v
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   761
  assume f: "\<forall>i. ML_closed 0 (f i)"  and compR: "(nm, vs, v) \<in> compR"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   762
  note tRed.intros(2)[OF compiler_correct[OF compR f], of Vt,simplified map_compose[symmetric]]
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   763
  hence red: "foldl At (Ct nm) (map (kernel o subst\<^bsub>ML\<^esub> f) vs) \<rightarrow>
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   764
         (subst\<^bsub>ML\<^esub> f v)!" (is "_ \<rightarrow> ?R") apply(simp add:map_compose) sorry
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   765
  have "A_ML (CC nm) (map (subst\<^bsub>ML\<^esub> f) vs)! =
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   766
       foldl At (Ct nm) (map (kernel o subst\<^bsub>ML\<^esub> f) vs)" by (simp add:map_compose)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   767
  also(* have "map (kernel o subst\<^bsub>ML\<^esub> f) vs = map (subst (kernel o f)) (vs!)"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   768
    using closed_subst_kernel(2)[OF compiled_V_free1[OF compR]]
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   769
    by (simp add:map_compose[symmetric])
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   770
  also*) note red
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   771
  (*also have "?R = subst\<^bsub>ML\<^esub> f v!"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   772
    using closed_subst_kernel(2)[OF compiled_V_free2[OF compR]] by simp*)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   773
  finally have "A_ML (CC nm) (map (subst\<^bsub>ML\<^esub> f) vs)! \<rightarrow>* subst\<^bsub>ML\<^esub> f v!" (is "?A")
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   774
    by(rule r_into_rtrancl) (*
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   775
  also have "?l = (subst\<^bsub>ML\<^esub> fa (A_ML (CC nm) (map (subst\<^bsub>ML\<^esub> f) vs)))!" (is "_ = ?l'") sorry
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   776
  also have "?r = subst\<^bsub>ML\<^esub> fa (subst\<^bsub>ML\<^esub> f v)!"  (is "_ = ?r'") sorry 
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   777
  finally have "?l' \<rightarrow>* ?r'" (is ?A) . *)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   778
  moreover have "ML_closed 0 (subst\<^bsub>ML\<^esub> f v)" (is "?C") using prems sorry
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   779
  ultimately show "?A & ?C" ..
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   780
next
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   781
  case term_of_V thus ?case apply (auto simp:map_compose[symmetric]) sorry
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   782
next
23778
18f426a137a9 Adapted to new inductive definition package.
berghofe
parents: 23503
diff changeset
   783
  case (term_of_Fun vf vs n)
23503
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   784
  hence "term_of (Fun vf vs n)! \<rightarrow>*
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   785
       Lam (term_of (apply (lift 0 (Fun vf vs n)) (V_ML 0)[V 0 []/0]))!" sorry
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   786
  moreover
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   787
  have "ML_closed_t 0
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   788
        (Lam (term_of (apply (lift 0 (Fun vf vs n)) (V_ML 0)[V 0 []/0])))" sorry
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   789
  ultimately show ?case ..
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   790
next
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   791
  case apply_Fun1 thus ?case by simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   792
next
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   793
  case apply_Fun2 thus ?case by simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   794
next
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   795
  case apply_C thus ?case by simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   796
next
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   797
  case apply_V thus ?case by simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   798
next
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   799
  case ctxt_Lam thus ?case by(auto)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   800
next
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   801
  case ctxt_At1 thus ?case  by(auto)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   802
next
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   803
  case ctxt_At2 thus ?case by (auto)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   804
next
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   805
  case ctxt_term_of thus ?case by (auto)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   806
next
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   807
  case ctxt_C thus ?case by (fastsimp simp:tRed_list_foldl_At)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   808
next
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   809
  case ctxt_V thus ?case by (fastsimp simp:tRed_list_foldl_At)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   810
next
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   811
  case ctxt_Fun1 thus ?case by (fastsimp simp:tRed_list_foldl_At)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   812
next
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   813
  case ctxt_Fun3 thus ?case by (fastsimp simp:tRed_list_foldl_At)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   814
next
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   815
  case ctxt_apply1 thus ?case by auto
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   816
next
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   817
  case ctxt_apply2 thus ?case  by auto
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   818
next
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   819
  case ctxt_A_ML1 thus ?case by (fastsimp simp:tRed_list_foldl_At)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   820
next
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   821
  case ctxt_A_ML2 thus ?case by (fastsimp simp:tRed_list_foldl_At)
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   822
next
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   823
  case ctxt_list1 thus ?case by simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   824
next
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   825
  case ctxt_list2 thus ?case by simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   826
qed
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   827
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   828
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   829
inductive_cases tRedE: "Ct n \<rightarrow> u"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   830
thm tRedE
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   831
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   832
lemma [simp]: "Ct n = foldl At t ts \<longleftrightarrow> t = Ct n & ts = []"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   833
by (induct ts arbitrary:t) auto
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   834
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   835
corollary kernel_inv: includes Vars shows
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   836
 "(t :: tm) \<Rightarrow>* t' ==> ML_closed_t 0 t ==> t! \<rightarrow>* t'!"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   837
sorry
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   838
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   839
theorem includes Vars
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   840
assumes t: "t : Pure_tms" and t': "t' : Pure_tms" and
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   841
 closed: "free_vars t = {}" and reds: "term_of (eval t []) \<Rightarrow>* t'"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   842
 shows "t \<rightarrow>* t' "
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   843
proof -
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   844
  have ML_cl: "ML_closed_t 0 (term_of (eval t []))" sorry
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   845
  have "(eval t [])! = t!"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   846
    using kernel_eval[OF t, where e="[]"] closed by simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   847
  hence "(term_of (eval t []))! = t!" by simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   848
  moreover have "term_of (eval t [])! \<rightarrow>* t'!"
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   849
    using kernel_inv[OF reds ML_cl] by auto
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   850
  ultimately have "t! \<rightarrow>* t'!" by simp
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   851
  thus  ?thesis using kernel_pure t t' by auto
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   852
qed
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   853
234b83011a9b *** empty log message ***
nipkow
parents:
diff changeset
   854
end