src/HOL/Nominal/Examples/CK_Machine.thy
author haftmann
Fri, 27 Jun 2025 08:09:26 +0200
changeset 82775 61c39a9e5415
parent 81127 12990a6dddcb
permissions -rw-r--r--
typo
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
     1
theory CK_Machine 
66453
cc19f7ca2ed6 session-qualified theory imports: isabelle imports -U -i -d '~~/src/Benchmarks' -a;
wenzelm
parents: 63680
diff changeset
     2
  imports "HOL-Nominal.Nominal" 
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
     3
begin
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
     4
63167
0909deb8059b isabelle update_cartouches -c -t;
wenzelm
parents: 58310
diff changeset
     5
text \<open>
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
     6
  
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
     7
  This theory establishes soundness and completeness for a CK-machine
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
     8
  with respect to a cbv-big-step semantics. The language includes 
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
     9
  functions, recursion, booleans and numbers. In the soundness proof 
27247
e5787c5be196 added a progress lemma and tuned some comments
urbanc
parents: 27162
diff changeset
    10
  the small-step cbv-reduction relation is used in order to get the 
e5787c5be196 added a progress lemma and tuned some comments
urbanc
parents: 27162
diff changeset
    11
  induction through. The type-preservation property is proved for the 
e5787c5be196 added a progress lemma and tuned some comments
urbanc
parents: 27162
diff changeset
    12
  machine and  also for the small- and big-step semantics. Finally, 
e5787c5be196 added a progress lemma and tuned some comments
urbanc
parents: 27162
diff changeset
    13
  the progress property is proved for the small-step semantics.
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    14
27247
e5787c5be196 added a progress lemma and tuned some comments
urbanc
parents: 27162
diff changeset
    15
  The development is inspired by notes about context machines written
e5787c5be196 added a progress lemma and tuned some comments
urbanc
parents: 27162
diff changeset
    16
  by Roshan James (Indiana University) and also by the lecture notes 
e5787c5be196 added a progress lemma and tuned some comments
urbanc
parents: 27162
diff changeset
    17
  written by Andy Pitts for his semantics course. See
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    18
  
63680
6e1e8b5abbfa more symbols;
wenzelm
parents: 63167
diff changeset
    19
     \<^url>\<open>http://www.cs.indiana.edu/~rpjames/lm.pdf\<close>
68224
1f7308050349 prefer HTTPS;
wenzelm
parents: 66453
diff changeset
    20
     \<^url>\<open>https://www.cl.cam.ac.uk/teaching/2001/Semantics\<close>
63167
0909deb8059b isabelle update_cartouches -c -t;
wenzelm
parents: 58310
diff changeset
    21
\<close>
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    22
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    23
atom_decl name
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    24
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    25
nominal_datatype lam =
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    26
  VAR "name"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    27
| APP "lam" "lam" 
80914
d97fdabd9e2b standardize mixfix annotations via "isabelle update -a -u mixfix_cartouches" --- to simplify systematic editing;
wenzelm
parents: 68224
diff changeset
    28
| LAM "\<guillemotleft>name\<guillemotright>lam" (\<open>LAM [_]._\<close>)
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    29
| NUM "nat"
80914
d97fdabd9e2b standardize mixfix annotations via "isabelle update -a -u mixfix_cartouches" --- to simplify systematic editing;
wenzelm
parents: 68224
diff changeset
    30
| DIFF "lam" "lam" (\<open>_ -- _\<close>)    (* subtraction *) 
d97fdabd9e2b standardize mixfix annotations via "isabelle update -a -u mixfix_cartouches" --- to simplify systematic editing;
wenzelm
parents: 68224
diff changeset
    31
| PLUS "lam" "lam" (\<open>_ ++ _\<close>)    (* addition *)
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    32
| TRUE
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    33
| FALSE
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    34
| IF "lam" "lam" "lam"
80914
d97fdabd9e2b standardize mixfix annotations via "isabelle update -a -u mixfix_cartouches" --- to simplify systematic editing;
wenzelm
parents: 68224
diff changeset
    35
| FIX "\<guillemotleft>name\<guillemotright>lam" (\<open>FIX [_]._\<close>)  (* recursion *)
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    36
| ZET "lam"                      (* zero test *)
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    37
| EQI "lam" "lam"                (* equality test on numbers *)
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    38
63167
0909deb8059b isabelle update_cartouches -c -t;
wenzelm
parents: 58310
diff changeset
    39
section \<open>Capture-Avoiding Substitution\<close>
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    40
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    41
nominal_primrec
80914
d97fdabd9e2b standardize mixfix annotations via "isabelle update -a -u mixfix_cartouches" --- to simplify systematic editing;
wenzelm
parents: 68224
diff changeset
    42
  subst :: "lam \<Rightarrow> name \<Rightarrow> lam \<Rightarrow> lam"  (\<open>_[_::=_]\<close> [100,100,100] 100)
29097
68245155eb58 Modified nominal_primrec to make it work with local theories, unified syntax
berghofe
parents: 27247
diff changeset
    43
where
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    44
  "(VAR x)[y::=s] = (if x=y then s else (VAR x))"
53015
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 41798
diff changeset
    45
| "(APP t\<^sub>1 t\<^sub>2)[y::=s] = APP (t\<^sub>1[y::=s]) (t\<^sub>2[y::=s])"
29097
68245155eb58 Modified nominal_primrec to make it work with local theories, unified syntax
berghofe
parents: 27247
diff changeset
    46
| "x\<sharp>(y,s) \<Longrightarrow> (LAM [x].t)[y::=s] = LAM [x].(t[y::=s])"
68245155eb58 Modified nominal_primrec to make it work with local theories, unified syntax
berghofe
parents: 27247
diff changeset
    47
| "(NUM n)[y::=s] = NUM n"
53015
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 41798
diff changeset
    48
| "(t\<^sub>1 -- t\<^sub>2)[y::=s] = (t\<^sub>1[y::=s]) -- (t\<^sub>2[y::=s])"
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 41798
diff changeset
    49
| "(t\<^sub>1 ++ t\<^sub>2)[y::=s] = (t\<^sub>1[y::=s]) ++ (t\<^sub>2[y::=s])"
29097
68245155eb58 Modified nominal_primrec to make it work with local theories, unified syntax
berghofe
parents: 27247
diff changeset
    50
| "x\<sharp>(y,s) \<Longrightarrow> (FIX [x].t)[y::=s] = FIX [x].(t[y::=s])"
68245155eb58 Modified nominal_primrec to make it work with local theories, unified syntax
berghofe
parents: 27247
diff changeset
    51
| "TRUE[y::=s] = TRUE"
68245155eb58 Modified nominal_primrec to make it work with local theories, unified syntax
berghofe
parents: 27247
diff changeset
    52
| "FALSE[y::=s] = FALSE"
68245155eb58 Modified nominal_primrec to make it work with local theories, unified syntax
berghofe
parents: 27247
diff changeset
    53
| "(IF t1 t2 t3)[y::=s] = IF (t1[y::=s]) (t2[y::=s]) (t3[y::=s])"
68245155eb58 Modified nominal_primrec to make it work with local theories, unified syntax
berghofe
parents: 27247
diff changeset
    54
| "(ZET t)[y::=s] = ZET (t[y::=s])"
68245155eb58 Modified nominal_primrec to make it work with local theories, unified syntax
berghofe
parents: 27247
diff changeset
    55
| "(EQI t1 t2)[y::=s] = EQI (t1[y::=s]) (t2[y::=s])"
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    56
apply(finite_guess)+
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    57
apply(rule TrueI)+
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    58
apply(simp add: abs_fresh)+
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    59
apply(fresh_guess)+
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    60
done
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    61
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    62
lemma  subst_eqvt[eqvt]:
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    63
  fixes pi::"name prm"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    64
  shows "pi\<bullet>(t1[x::=t2]) = (pi\<bullet>t1)[(pi\<bullet>x)::=(pi\<bullet>t2)]"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    65
by (nominal_induct t1 avoiding: x t2 rule: lam.strong_induct)
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    66
   (auto simp add: perm_bij fresh_atm fresh_bij)
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    67
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    68
lemma fresh_fact:
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    69
  fixes z::"name"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    70
  shows "\<lbrakk>z\<sharp>s; (z=y \<or> z\<sharp>t)\<rbrakk> \<Longrightarrow> z\<sharp>t[y::=s]"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    71
by (nominal_induct t avoiding: z y s rule: lam.strong_induct)
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    72
   (auto simp add: abs_fresh fresh_prod fresh_atm fresh_nat)
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    73
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    74
lemma subst_rename: 
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    75
  assumes a: "y\<sharp>t"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    76
  shows "t[x::=s] = ([(y,x)]\<bullet>t)[y::=s]"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    77
using a 
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    78
by (nominal_induct t avoiding: x y s rule: lam.strong_induct)
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    79
   (auto simp add: calc_atm fresh_atm abs_fresh perm_nat_def)
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    80
63167
0909deb8059b isabelle update_cartouches -c -t;
wenzelm
parents: 58310
diff changeset
    81
section \<open>Evaluation Contexts\<close>
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    82
58310
91ea607a34d8 updated news
blanchet
parents: 58249
diff changeset
    83
datatype ctx = 
80914
d97fdabd9e2b standardize mixfix annotations via "isabelle update -a -u mixfix_cartouches" --- to simplify systematic editing;
wenzelm
parents: 68224
diff changeset
    84
    Hole (\<open>\<box>\<close>)  
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    85
  | CAPPL "ctx" "lam"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    86
  | CAPPR "lam" "ctx"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    87
  | CDIFFL "ctx" "lam"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    88
  | CDIFFR "lam" "ctx"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    89
  | CPLUSL "ctx" "lam"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    90
  | CPLUSR "lam" "ctx"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    91
  | CIF "ctx" "lam" "lam"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    92
  | CZET "ctx"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    93
  | CEQIL "ctx" "lam"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    94
  | CEQIR "lam" "ctx"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    95
63167
0909deb8059b isabelle update_cartouches -c -t;
wenzelm
parents: 58310
diff changeset
    96
text \<open>The operation of filling a term into a context:\<close> 
27247
e5787c5be196 added a progress lemma and tuned some comments
urbanc
parents: 27162
diff changeset
    97
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
    98
fun
80914
d97fdabd9e2b standardize mixfix annotations via "isabelle update -a -u mixfix_cartouches" --- to simplify systematic editing;
wenzelm
parents: 68224
diff changeset
    99
  filling :: "ctx \<Rightarrow> lam \<Rightarrow> lam" (\<open>_\<lbrakk>_\<rbrakk>\<close>)
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   100
where
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   101
  "\<box>\<lbrakk>t\<rbrakk> = t"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   102
| "(CAPPL E t')\<lbrakk>t\<rbrakk> = APP (E\<lbrakk>t\<rbrakk>) t'"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   103
| "(CAPPR t' E)\<lbrakk>t\<rbrakk> = APP t' (E\<lbrakk>t\<rbrakk>)"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   104
| "(CDIFFL E t')\<lbrakk>t\<rbrakk> = (E\<lbrakk>t\<rbrakk>) -- t'"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   105
| "(CDIFFR t' E)\<lbrakk>t\<rbrakk> = t' -- (E\<lbrakk>t\<rbrakk>)"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   106
| "(CPLUSL E t')\<lbrakk>t\<rbrakk> = (E\<lbrakk>t\<rbrakk>) ++ t'"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   107
| "(CPLUSR t' E)\<lbrakk>t\<rbrakk> = t' ++ (E\<lbrakk>t\<rbrakk>)"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   108
| "(CIF E t1 t2)\<lbrakk>t\<rbrakk> = IF (E\<lbrakk>t\<rbrakk>) t1 t2"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   109
| "(CZET E)\<lbrakk>t\<rbrakk> = ZET (E\<lbrakk>t\<rbrakk>)"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   110
| "(CEQIL E t')\<lbrakk>t\<rbrakk> = EQI (E\<lbrakk>t\<rbrakk>) t'"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   111
| "(CEQIR t' E)\<lbrakk>t\<rbrakk> = EQI t' (E\<lbrakk>t\<rbrakk>)"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   112
63167
0909deb8059b isabelle update_cartouches -c -t;
wenzelm
parents: 58310
diff changeset
   113
text \<open>The operation of composing two contexts:\<close>
27247
e5787c5be196 added a progress lemma and tuned some comments
urbanc
parents: 27162
diff changeset
   114
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   115
fun 
80914
d97fdabd9e2b standardize mixfix annotations via "isabelle update -a -u mixfix_cartouches" --- to simplify systematic editing;
wenzelm
parents: 68224
diff changeset
   116
 ctx_compose :: "ctx \<Rightarrow> ctx \<Rightarrow> ctx" (\<open>_ \<circ> _\<close>)
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   117
where
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   118
  "\<box> \<circ> E' = E'"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   119
| "(CAPPL E t') \<circ> E' = CAPPL (E \<circ> E') t'"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   120
| "(CAPPR t' E) \<circ> E' = CAPPR t' (E \<circ> E')"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   121
| "(CDIFFL E t') \<circ> E' = CDIFFL (E \<circ> E') t'"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   122
| "(CDIFFR t' E) \<circ> E' = CDIFFR t' (E \<circ> E')"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   123
| "(CPLUSL E t') \<circ> E' = CPLUSL (E \<circ> E') t'"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   124
| "(CPLUSR t' E) \<circ> E' = CPLUSR t' (E \<circ> E')"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   125
| "(CIF E t1 t2) \<circ> E' = CIF (E \<circ> E') t1 t2"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   126
| "(CZET E) \<circ> E' = CZET (E \<circ> E')"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   127
| "(CEQIL E t') \<circ> E' = CEQIL (E \<circ> E') t'"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   128
| "(CEQIR t' E) \<circ> E' = CEQIR t' (E \<circ> E')"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   129
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   130
lemma ctx_compose:
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   131
  shows "(E1 \<circ> E2)\<lbrakk>t\<rbrakk> = E1\<lbrakk>E2\<lbrakk>t\<rbrakk>\<rbrakk>"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   132
by (induct E1 rule: ctx.induct) (auto)
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   133
63167
0909deb8059b isabelle update_cartouches -c -t;
wenzelm
parents: 58310
diff changeset
   134
text \<open>Composing a list (stack) of contexts.\<close>
27247
e5787c5be196 added a progress lemma and tuned some comments
urbanc
parents: 27162
diff changeset
   135
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   136
fun
80914
d97fdabd9e2b standardize mixfix annotations via "isabelle update -a -u mixfix_cartouches" --- to simplify systematic editing;
wenzelm
parents: 68224
diff changeset
   137
  ctx_composes :: "ctx list \<Rightarrow> ctx" (\<open>_\<down>\<close>)
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   138
where
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   139
    "[]\<down> = \<box>"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   140
  | "(E#Es)\<down> = (Es\<down>) \<circ> E"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   141
63167
0909deb8059b isabelle update_cartouches -c -t;
wenzelm
parents: 58310
diff changeset
   142
section \<open>The CK-Machine\<close>
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   143
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   144
inductive
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   145
  val :: "lam\<Rightarrow>bool" 
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   146
where
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   147
  v_LAM[intro]:   "val (LAM [x].e)"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   148
| v_NUM[intro]:   "val (NUM n)"  
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   149
| v_FALSE[intro]: "val FALSE"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   150
| v_TRUE[intro]:  "val TRUE"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   151
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   152
equivariance val 
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   153
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   154
inductive
81127
12990a6dddcb avoid syntax clashes;
wenzelm
parents: 80914
diff changeset
   155
  machine :: "lam\<Rightarrow>ctx list\<Rightarrow>lam\<Rightarrow>ctx list\<Rightarrow>bool" (\<open><_,_> \<leadsto> <_,_>\<close>)
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   156
where
81127
12990a6dddcb avoid syntax clashes;
wenzelm
parents: 80914
diff changeset
   157
  m1[intro]: "<APP e1 e2,Es> \<leadsto> <e1,(CAPPL \<box> e2)#Es>"
12990a6dddcb avoid syntax clashes;
wenzelm
parents: 80914
diff changeset
   158
| m2[intro]: "val v \<Longrightarrow> <v,(CAPPL \<box> e2)#Es> \<leadsto> <e2,(CAPPR v \<box>)#Es>"
12990a6dddcb avoid syntax clashes;
wenzelm
parents: 80914
diff changeset
   159
| m3[intro]: "val v \<Longrightarrow> <v,(CAPPR (LAM [y].e) \<box>)#Es> \<leadsto> <e[y::=v],Es>"
12990a6dddcb avoid syntax clashes;
wenzelm
parents: 80914
diff changeset
   160
| m4[intro]: "<e1 -- e2, Es> \<leadsto> <e1,(CDIFFL \<box> e2)#Es>"
12990a6dddcb avoid syntax clashes;
wenzelm
parents: 80914
diff changeset
   161
| m5[intro]: "<NUM n1,(CDIFFL \<box> e2)#Es> \<leadsto> <e2,(CDIFFR (NUM n1) \<box>)#Es>"
12990a6dddcb avoid syntax clashes;
wenzelm
parents: 80914
diff changeset
   162
| m6[intro]: "<NUM n2,(CDIFFR (NUM n1) \<box>)#Es> \<leadsto> <NUM (n1 - n2),Es>"
12990a6dddcb avoid syntax clashes;
wenzelm
parents: 80914
diff changeset
   163
| m4'[intro]:"<e1 ++ e2, Es> \<leadsto> <e1,(CPLUSL \<box> e2)#Es>"
12990a6dddcb avoid syntax clashes;
wenzelm
parents: 80914
diff changeset
   164
| m5'[intro]:"<NUM n1,(CPLUSL \<box> e2)#Es> \<leadsto> <e2,(CPLUSR (NUM n1) \<box>)#Es>"
12990a6dddcb avoid syntax clashes;
wenzelm
parents: 80914
diff changeset
   165
| m6'[intro]:"<NUM n2,(CPLUSR (NUM n1) \<box>)#Es> \<leadsto> <NUM (n1+n2),Es>"
12990a6dddcb avoid syntax clashes;
wenzelm
parents: 80914
diff changeset
   166
| m7[intro]: "<IF e1 e2 e3,Es> \<leadsto> <e1,(CIF \<box> e2 e3)#Es>"
12990a6dddcb avoid syntax clashes;
wenzelm
parents: 80914
diff changeset
   167
| m8[intro]: "<TRUE,(CIF \<box> e1 e2)#Es> \<leadsto> <e1,Es>"
12990a6dddcb avoid syntax clashes;
wenzelm
parents: 80914
diff changeset
   168
| m9[intro]: "<FALSE,(CIF \<box> e1 e2)#Es> \<leadsto> <e2,Es>"
12990a6dddcb avoid syntax clashes;
wenzelm
parents: 80914
diff changeset
   169
| mA[intro]: "<FIX [x].t,Es> \<leadsto> <t[x::=FIX [x].t],Es>"
12990a6dddcb avoid syntax clashes;
wenzelm
parents: 80914
diff changeset
   170
| mB[intro]: "<ZET e,Es> \<leadsto> <e,(CZET \<box>)#Es>"
12990a6dddcb avoid syntax clashes;
wenzelm
parents: 80914
diff changeset
   171
| mC[intro]: "<NUM 0,(CZET \<box>)#Es> \<leadsto> <TRUE,Es>"
12990a6dddcb avoid syntax clashes;
wenzelm
parents: 80914
diff changeset
   172
| mD[intro]: "0 < n \<Longrightarrow> <NUM n,(CZET \<box>)#Es> \<leadsto> <FALSE,Es>"
12990a6dddcb avoid syntax clashes;
wenzelm
parents: 80914
diff changeset
   173
| mE[intro]: "<EQI e1 e2,Es> \<leadsto> <e1,(CEQIL \<box> e2)#Es>"
12990a6dddcb avoid syntax clashes;
wenzelm
parents: 80914
diff changeset
   174
| mF[intro]: "<NUM n1,(CEQIL \<box> e2)#Es> \<leadsto> <e2,(CEQIR (NUM n1) \<box>)#Es>"
12990a6dddcb avoid syntax clashes;
wenzelm
parents: 80914
diff changeset
   175
| mG[intro]: "<NUM n,(CEQIR (NUM n) \<box>)#Es> \<leadsto> <TRUE,Es>"
12990a6dddcb avoid syntax clashes;
wenzelm
parents: 80914
diff changeset
   176
| mH[intro]: "n1\<noteq>n2 \<Longrightarrow> <NUM n1,(CEQIR (NUM n2) \<box>)#Es> \<leadsto> <FALSE,Es>"
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   177
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   178
inductive 
81127
12990a6dddcb avoid syntax clashes;
wenzelm
parents: 80914
diff changeset
   179
  "machine_star" :: "lam\<Rightarrow>ctx list\<Rightarrow>lam\<Rightarrow>ctx list\<Rightarrow>bool" (\<open><_,_> \<leadsto>* <_,_>\<close>)
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   180
where
81127
12990a6dddcb avoid syntax clashes;
wenzelm
parents: 80914
diff changeset
   181
  ms1[intro]: "<e,Es> \<leadsto>* <e,Es>"
12990a6dddcb avoid syntax clashes;
wenzelm
parents: 80914
diff changeset
   182
| ms2[intro]: "\<lbrakk><e1,Es1> \<leadsto> <e2,Es2>; <e2,Es2> \<leadsto>* <e3,Es3>\<rbrakk> \<Longrightarrow> <e1,Es1> \<leadsto>* <e3,Es3>"
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   183
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   184
lemma ms3[intro,trans]:
81127
12990a6dddcb avoid syntax clashes;
wenzelm
parents: 80914
diff changeset
   185
  assumes a: "<e1,Es1> \<leadsto>* <e2,Es2>" "<e2,Es2> \<leadsto>* <e3,Es3>"
12990a6dddcb avoid syntax clashes;
wenzelm
parents: 80914
diff changeset
   186
  shows "<e1,Es1> \<leadsto>* <e3,Es3>"
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   187
using a by (induct) (auto) 
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   188
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   189
lemma ms4[intro]:
81127
12990a6dddcb avoid syntax clashes;
wenzelm
parents: 80914
diff changeset
   190
  assumes a: "<e1,Es1> \<leadsto> <e2,Es2>" 
12990a6dddcb avoid syntax clashes;
wenzelm
parents: 80914
diff changeset
   191
  shows "<e1,Es1> \<leadsto>* <e2,Es2>"
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   192
using a by (rule ms2) (rule ms1)
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   193
63167
0909deb8059b isabelle update_cartouches -c -t;
wenzelm
parents: 58310
diff changeset
   194
section \<open>The Evaluation Relation (Big-Step Semantics)\<close>
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   195
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   196
inductive
80914
d97fdabd9e2b standardize mixfix annotations via "isabelle update -a -u mixfix_cartouches" --- to simplify systematic editing;
wenzelm
parents: 68224
diff changeset
   197
  eval :: "lam\<Rightarrow>lam\<Rightarrow>bool" (\<open>_ \<Down> _\<close>) 
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   198
where
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   199
  eval_NUM[intro]:  "NUM n \<Down> NUM n" 
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   200
| eval_DIFF[intro]: "\<lbrakk>t1 \<Down> (NUM n1); t2 \<Down> (NUM n2)\<rbrakk> \<Longrightarrow> t1 -- t2 \<Down> NUM (n1 - n2)"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   201
| eval_PLUS[intro]: "\<lbrakk>t1 \<Down> (NUM n1); t2 \<Down> (NUM n2)\<rbrakk> \<Longrightarrow> t1 ++ t2 \<Down> NUM (n1 + n2)"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   202
| eval_LAM[intro]:  "LAM [x].t \<Down> LAM [x].t"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   203
| eval_APP[intro]:  "\<lbrakk>t1\<Down> LAM [x].t; t2\<Down> t2'; t[x::=t2']\<Down> t'\<rbrakk> \<Longrightarrow> APP t1 t2 \<Down> t'"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   204
| eval_FIX[intro]:  "t[x::= FIX [x].t] \<Down> t' \<Longrightarrow> FIX [x].t \<Down> t'"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   205
| eval_IF1[intro]:  "\<lbrakk>t1 \<Down> TRUE; t2 \<Down> t'\<rbrakk> \<Longrightarrow> IF t1 t2 t3 \<Down> t'"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   206
| eval_IF2[intro]:  "\<lbrakk>t1 \<Down> FALSE; t3 \<Down> t'\<rbrakk> \<Longrightarrow> IF t1 t2 t3 \<Down> t'"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   207
| eval_TRUE[intro]: "TRUE \<Down> TRUE"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   208
| eval_FALSE[intro]:"FALSE \<Down> FALSE"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   209
| eval_ZET1[intro]: "t \<Down> NUM 0 \<Longrightarrow> ZET t \<Down> TRUE"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   210
| eval_ZET2[intro]: "\<lbrakk>t \<Down> NUM n; 0 < n\<rbrakk> \<Longrightarrow> ZET t \<Down> FALSE"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   211
| eval_EQ1[intro]:  "\<lbrakk>t1 \<Down> NUM n; t2 \<Down> NUM n\<rbrakk> \<Longrightarrow> EQI t1 t2 \<Down> TRUE"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   212
| eval_EQ2[intro]:  "\<lbrakk>t1 \<Down> NUM n1; t2 \<Down> NUM n2; n1\<noteq>n2\<rbrakk> \<Longrightarrow> EQI t1 t2 \<Down> FALSE"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   213
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   214
declare lam.inject[simp]
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   215
inductive_cases eval_elim:
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   216
  "APP t1 t2 \<Down> t'"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   217
  "IF t1 t2 t3 \<Down> t'"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   218
  "ZET t \<Down> t'"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   219
  "EQI t1 t2 \<Down> t'"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   220
  "t1 ++ t2 \<Down> t'"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   221
  "t1 -- t2 \<Down> t'"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   222
  "(NUM n) \<Down> t"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   223
  "TRUE \<Down> t"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   224
  "FALSE \<Down> t"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   225
declare lam.inject[simp del]
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   226
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   227
lemma eval_to:
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   228
  assumes a: "t \<Down> t'"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   229
  shows "val t'"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   230
using a by (induct) (auto)
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   231
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   232
lemma eval_val:
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   233
  assumes a: "val t"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   234
  shows "t \<Down> t"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   235
using a by (induct) (auto)
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   236
63167
0909deb8059b isabelle update_cartouches -c -t;
wenzelm
parents: 58310
diff changeset
   237
text \<open>The Completeness Property:\<close>
27247
e5787c5be196 added a progress lemma and tuned some comments
urbanc
parents: 27162
diff changeset
   238
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   239
theorem eval_implies_machine_star_ctx:
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   240
  assumes a: "t \<Down> t'"
81127
12990a6dddcb avoid syntax clashes;
wenzelm
parents: 80914
diff changeset
   241
  shows "<t,Es> \<leadsto>* <t',Es>"
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   242
using a
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   243
by (induct arbitrary: Es)
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   244
   (metis eval_to machine.intros ms1 ms2 ms3 ms4 v_LAM)+
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   245
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   246
corollary eval_implies_machine_star:
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   247
  assumes a: "t \<Down> t'"
81127
12990a6dddcb avoid syntax clashes;
wenzelm
parents: 80914
diff changeset
   248
  shows "<t,[]> \<leadsto>* <t',[]>"
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   249
using a by (auto dest: eval_implies_machine_star_ctx)
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   250
63167
0909deb8059b isabelle update_cartouches -c -t;
wenzelm
parents: 58310
diff changeset
   251
section \<open>The CBV Reduction Relation (Small-Step Semantics)\<close>
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   252
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   253
lemma less_eqvt[eqvt]:
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   254
  fixes pi::"name prm"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   255
  and   n1 n2::"nat"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   256
  shows "(pi\<bullet>(n1 < n2)) = ((pi\<bullet>n1) < (pi\<bullet>n2))"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   257
by (simp add: perm_nat_def perm_bool)
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   258
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   259
inductive
80914
d97fdabd9e2b standardize mixfix annotations via "isabelle update -a -u mixfix_cartouches" --- to simplify systematic editing;
wenzelm
parents: 68224
diff changeset
   260
  cbv :: "lam\<Rightarrow>lam\<Rightarrow>bool" (\<open>_ \<longrightarrow>cbv _\<close>) 
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   261
where
27247
e5787c5be196 added a progress lemma and tuned some comments
urbanc
parents: 27162
diff changeset
   262
  cbv1: "\<lbrakk>val v; x\<sharp>v\<rbrakk> \<Longrightarrow> APP (LAM [x].t) v \<longrightarrow>cbv t[x::=v]"
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   263
| cbv2[intro]: "t \<longrightarrow>cbv t' \<Longrightarrow> APP t t2 \<longrightarrow>cbv APP t' t2"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   264
| cbv3[intro]: "t \<longrightarrow>cbv t' \<Longrightarrow> APP t2 t \<longrightarrow>cbv APP t2 t'"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   265
| cbv4[intro]: "t \<longrightarrow>cbv t' \<Longrightarrow> t -- t2 \<longrightarrow>cbv t' -- t2"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   266
| cbv5[intro]: "t \<longrightarrow>cbv t' \<Longrightarrow> t2 -- t \<longrightarrow>cbv t2 -- t'"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   267
| cbv6[intro]: "(NUM n1) -- (NUM n2) \<longrightarrow>cbv NUM (n1 - n2)"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   268
| cbv4'[intro]: "t \<longrightarrow>cbv t' \<Longrightarrow> t ++ t2 \<longrightarrow>cbv t' ++ t2"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   269
| cbv5'[intro]: "t \<longrightarrow>cbv t' \<Longrightarrow> t2 ++ t \<longrightarrow>cbv t2 ++ t'"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   270
| cbv6'[intro]:"(NUM n1) ++ (NUM n2) \<longrightarrow>cbv NUM (n1 + n2)"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   271
| cbv7[intro]: "t \<longrightarrow>cbv t' \<Longrightarrow> IF t t1 t2 \<longrightarrow>cbv IF t' t1 t2"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   272
| cbv8[intro]: "IF TRUE t1 t2 \<longrightarrow>cbv t1"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   273
| cbv9[intro]: "IF FALSE t1 t2 \<longrightarrow>cbv t2"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   274
| cbvA[intro]: "FIX [x].t \<longrightarrow>cbv t[x::=FIX [x].t]"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   275
| cbvB[intro]: "t \<longrightarrow>cbv t' \<Longrightarrow> ZET t \<longrightarrow>cbv ZET t'"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   276
| cbvC[intro]: "ZET (NUM 0) \<longrightarrow>cbv TRUE"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   277
| cbvD[intro]: "0 < n \<Longrightarrow> ZET (NUM n) \<longrightarrow>cbv FALSE"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   278
| cbvE[intro]: "t \<longrightarrow>cbv t' \<Longrightarrow> EQI t t2 \<longrightarrow>cbv EQI t' t2"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   279
| cbvF[intro]: "t \<longrightarrow>cbv t' \<Longrightarrow> EQI t2 t \<longrightarrow>cbv EQI t2 t'"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   280
| cbvG[intro]: "EQI (NUM n) (NUM n) \<longrightarrow>cbv TRUE"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   281
| cbvH[intro]: "n1\<noteq>n2 \<Longrightarrow> EQI (NUM n1) (NUM n2) \<longrightarrow>cbv FALSE"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   282
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   283
equivariance cbv
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   284
nominal_inductive cbv
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   285
 by (simp_all add: abs_fresh fresh_fact)
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   286
27247
e5787c5be196 added a progress lemma and tuned some comments
urbanc
parents: 27162
diff changeset
   287
lemma better_cbv1[intro]: 
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   288
  assumes a: "val v" 
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   289
  shows "APP (LAM [x].t) v \<longrightarrow>cbv t[x::=v]"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   290
proof -
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   291
  obtain y::"name" where fs: "y\<sharp>(x,t,v)" by (rule exists_fresh, rule fin_supp, blast)
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   292
  have "APP (LAM [x].t) v = APP (LAM [y].([(y,x)]\<bullet>t)) v" using fs
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   293
    by (auto simp add: lam.inject alpha' fresh_prod fresh_atm)
27247
e5787c5be196 added a progress lemma and tuned some comments
urbanc
parents: 27162
diff changeset
   294
  also have "\<dots> \<longrightarrow>cbv  ([(y,x)]\<bullet>t)[y::=v]" using fs a by (auto simp add: cbv.eqvt cbv1)
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   295
  also have "\<dots> = t[x::=v]" using fs by (simp add: subst_rename[symmetric])
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   296
  finally show "APP (LAM [x].t) v \<longrightarrow>cbv t[x::=v]" by simp
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   297
qed
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   298
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   299
inductive 
80914
d97fdabd9e2b standardize mixfix annotations via "isabelle update -a -u mixfix_cartouches" --- to simplify systematic editing;
wenzelm
parents: 68224
diff changeset
   300
  "cbv_star" :: "lam\<Rightarrow>lam\<Rightarrow>bool" (\<open> _ \<longrightarrow>cbv* _\<close>)
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   301
where
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   302
  cbvs1[intro]: "e \<longrightarrow>cbv* e"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   303
| cbvs2[intro]: "\<lbrakk>e1\<longrightarrow>cbv e2; e2 \<longrightarrow>cbv* e3\<rbrakk> \<Longrightarrow> e1 \<longrightarrow>cbv* e3"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   304
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   305
lemma cbvs3[intro,trans]:
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   306
  assumes a: "e1 \<longrightarrow>cbv* e2" "e2 \<longrightarrow>cbv* e3"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   307
  shows "e1 \<longrightarrow>cbv* e3"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   308
using a by (induct) (auto) 
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   309
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   310
lemma cbv_in_ctx:
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   311
  assumes a: "t \<longrightarrow>cbv t'"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   312
  shows "E\<lbrakk>t\<rbrakk> \<longrightarrow>cbv E\<lbrakk>t'\<rbrakk>"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   313
using a by (induct E) (auto)
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   314
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   315
lemma machine_implies_cbv_star_ctx:
81127
12990a6dddcb avoid syntax clashes;
wenzelm
parents: 80914
diff changeset
   316
  assumes a: "<e,Es> \<leadsto> <e',Es'>"
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   317
  shows "(Es\<down>)\<lbrakk>e\<rbrakk> \<longrightarrow>cbv* (Es'\<down>)\<lbrakk>e'\<rbrakk>"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   318
using a by (induct) (auto simp add: ctx_compose intro: cbv_in_ctx)
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   319
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   320
lemma machine_star_implies_cbv_star_ctx:
81127
12990a6dddcb avoid syntax clashes;
wenzelm
parents: 80914
diff changeset
   321
  assumes a: "<e,Es> \<leadsto>* <e',Es'>"
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   322
  shows "(Es\<down>)\<lbrakk>e\<rbrakk> \<longrightarrow>cbv* (Es'\<down>)\<lbrakk>e'\<rbrakk>"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   323
using a 
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   324
by (induct) (auto dest: machine_implies_cbv_star_ctx)
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   325
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   326
lemma machine_star_implies_cbv_star:
81127
12990a6dddcb avoid syntax clashes;
wenzelm
parents: 80914
diff changeset
   327
  assumes a: "<e,[]> \<leadsto>* <e',[]>"
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   328
  shows "e \<longrightarrow>cbv* e'"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   329
using a by (auto dest: machine_star_implies_cbv_star_ctx)
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   330
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   331
lemma cbv_eval:
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   332
  assumes a: "t1 \<longrightarrow>cbv t2" "t2 \<Down> t3"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   333
  shows "t1 \<Down> t3"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   334
using a
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   335
by (induct arbitrary: t3)
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   336
   (auto elim!: eval_elim intro: eval_val)
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   337
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   338
lemma cbv_star_eval:
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   339
  assumes a: "t1 \<longrightarrow>cbv* t2" "t2 \<Down> t3"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   340
  shows "t1 \<Down> t3"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   341
using a by (induct) (auto simp add: cbv_eval)
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   342
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   343
lemma cbv_star_implies_eval:
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   344
  assumes a: "t \<longrightarrow>cbv* v" "val v"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   345
  shows "t \<Down> v"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   346
using a
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   347
by (induct)
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   348
   (auto simp add: eval_val cbv_star_eval dest: cbvs2)
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   349
63167
0909deb8059b isabelle update_cartouches -c -t;
wenzelm
parents: 58310
diff changeset
   350
text \<open>The Soundness Property\<close>
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   351
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   352
theorem machine_star_implies_eval:
81127
12990a6dddcb avoid syntax clashes;
wenzelm
parents: 80914
diff changeset
   353
  assumes a: "<t1,[]> \<leadsto>* <t2,[]>" 
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   354
  and     b: "val t2" 
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   355
  shows "t1 \<Down> t2"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   356
proof -
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   357
  from a have "t1 \<longrightarrow>cbv* t2" by (simp add: machine_star_implies_cbv_star)
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   358
  then show "t1 \<Down> t2" using b by (simp add: cbv_star_implies_eval)
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   359
qed
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   360
63167
0909deb8059b isabelle update_cartouches -c -t;
wenzelm
parents: 58310
diff changeset
   361
section \<open>Typing\<close>
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   362
63167
0909deb8059b isabelle update_cartouches -c -t;
wenzelm
parents: 58310
diff changeset
   363
text \<open>Types\<close>
27247
e5787c5be196 added a progress lemma and tuned some comments
urbanc
parents: 27162
diff changeset
   364
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   365
nominal_datatype ty =
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   366
  tVAR "string"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   367
| tBOOL 
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   368
| tINT
80914
d97fdabd9e2b standardize mixfix annotations via "isabelle update -a -u mixfix_cartouches" --- to simplify systematic editing;
wenzelm
parents: 68224
diff changeset
   369
| tARR "ty" "ty" (\<open>_ \<rightarrow> _\<close>)
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   370
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   371
declare ty.inject[simp]
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   372
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   373
lemma ty_fresh:
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   374
  fixes x::"name"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   375
  and   T::"ty"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   376
  shows "x\<sharp>T"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   377
by (induct T rule: ty.induct)
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   378
   (auto simp add: fresh_string)
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   379
63167
0909deb8059b isabelle update_cartouches -c -t;
wenzelm
parents: 58310
diff changeset
   380
text \<open>Typing Contexts\<close>
27247
e5787c5be196 added a progress lemma and tuned some comments
urbanc
parents: 27162
diff changeset
   381
41798
c3aa3c87ef21 modernized specifications;
wenzelm
parents: 37362
diff changeset
   382
type_synonym tctx = "(name\<times>ty) list"
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   383
63167
0909deb8059b isabelle update_cartouches -c -t;
wenzelm
parents: 58310
diff changeset
   384
text \<open>Sub-Typing Contexts\<close>
27247
e5787c5be196 added a progress lemma and tuned some comments
urbanc
parents: 27162
diff changeset
   385
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   386
abbreviation
80914
d97fdabd9e2b standardize mixfix annotations via "isabelle update -a -u mixfix_cartouches" --- to simplify systematic editing;
wenzelm
parents: 68224
diff changeset
   387
  "sub_tctx" :: "tctx \<Rightarrow> tctx \<Rightarrow> bool" (\<open>_ \<subseteq> _\<close>) 
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   388
where
53015
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 41798
diff changeset
   389
  "\<Gamma>\<^sub>1 \<subseteq> \<Gamma>\<^sub>2 \<equiv> \<forall>x. x \<in> set \<Gamma>\<^sub>1 \<longrightarrow> x \<in> set \<Gamma>\<^sub>2"
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   390
63167
0909deb8059b isabelle update_cartouches -c -t;
wenzelm
parents: 58310
diff changeset
   391
text \<open>Valid Typing Contexts\<close>
27247
e5787c5be196 added a progress lemma and tuned some comments
urbanc
parents: 27162
diff changeset
   392
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   393
inductive
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   394
  valid :: "tctx \<Rightarrow> bool"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   395
where
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   396
  v1[intro]: "valid []"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   397
| v2[intro]: "\<lbrakk>valid \<Gamma>; x\<sharp>\<Gamma>\<rbrakk>\<Longrightarrow> valid ((x,T)#\<Gamma>)"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   398
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   399
equivariance valid
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   400
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   401
lemma valid_elim[dest]:
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   402
  assumes a: "valid ((x,T)#\<Gamma>)"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   403
  shows "x\<sharp>\<Gamma> \<and> valid \<Gamma>"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   404
using a by (cases) (auto)
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   405
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   406
lemma valid_insert:
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   407
  assumes a: "valid (\<Delta>@[(x,T)]@\<Gamma>)"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   408
  shows "valid (\<Delta> @ \<Gamma>)" 
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   409
using a
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   410
by (induct \<Delta>)
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   411
   (auto simp add:  fresh_list_append fresh_list_cons dest!: valid_elim)
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   412
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   413
lemma fresh_set: 
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   414
  shows "y\<sharp>xs = (\<forall>x\<in>set xs. y\<sharp>x)"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   415
by (induct xs) (simp_all add: fresh_list_nil fresh_list_cons)
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   416
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   417
lemma context_unique:
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   418
  assumes a1: "valid \<Gamma>"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   419
  and     a2: "(x,T) \<in> set \<Gamma>"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   420
  and     a3: "(x,U) \<in> set \<Gamma>"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   421
  shows "T = U" 
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   422
using a1 a2 a3
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   423
by (induct) (auto simp add: fresh_set fresh_prod fresh_atm)
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   424
63167
0909deb8059b isabelle update_cartouches -c -t;
wenzelm
parents: 58310
diff changeset
   425
section \<open>The Typing Relation\<close>
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   426
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   427
inductive
80914
d97fdabd9e2b standardize mixfix annotations via "isabelle update -a -u mixfix_cartouches" --- to simplify systematic editing;
wenzelm
parents: 68224
diff changeset
   428
  typing :: "tctx \<Rightarrow> lam \<Rightarrow> ty \<Rightarrow> bool" (\<open>_ \<turnstile> _ : _\<close>) 
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   429
where
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   430
  t_VAR[intro]:  "\<lbrakk>valid \<Gamma>; (x,T)\<in>set \<Gamma>\<rbrakk> \<Longrightarrow> \<Gamma> \<turnstile> VAR x : T"
53015
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 41798
diff changeset
   431
| t_APP[intro]:  "\<lbrakk>\<Gamma> \<turnstile> t\<^sub>1 : T\<^sub>1\<rightarrow>T\<^sub>2; \<Gamma> \<turnstile> t\<^sub>2 : T\<^sub>1\<rbrakk> \<Longrightarrow> \<Gamma> \<turnstile> APP t\<^sub>1 t\<^sub>2 : T\<^sub>2"
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 41798
diff changeset
   432
| t_LAM[intro]:  "\<lbrakk>x\<sharp>\<Gamma>; (x,T\<^sub>1)#\<Gamma> \<turnstile> t : T\<^sub>2\<rbrakk> \<Longrightarrow> \<Gamma> \<turnstile> LAM [x].t : T\<^sub>1 \<rightarrow> T\<^sub>2"
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   433
| t_NUM[intro]:  "\<Gamma> \<turnstile> (NUM n) : tINT"
53015
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 41798
diff changeset
   434
| t_DIFF[intro]: "\<lbrakk>\<Gamma> \<turnstile> t\<^sub>1 : tINT; \<Gamma> \<turnstile> t\<^sub>2 : tINT\<rbrakk> \<Longrightarrow> \<Gamma> \<turnstile> t\<^sub>1 -- t\<^sub>2 : tINT"
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 41798
diff changeset
   435
| t_PLUS[intro]: "\<lbrakk>\<Gamma> \<turnstile> t\<^sub>1 : tINT; \<Gamma> \<turnstile> t\<^sub>2 : tINT\<rbrakk> \<Longrightarrow> \<Gamma> \<turnstile> t\<^sub>1 ++ t\<^sub>2 : tINT"
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   436
| t_TRUE[intro]:  "\<Gamma> \<turnstile> TRUE : tBOOL"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   437
| t_FALSE[intro]: "\<Gamma> \<turnstile> FALSE : tBOOL"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   438
| t_IF[intro]:    "\<lbrakk>\<Gamma> \<turnstile> t1 : tBOOL; \<Gamma> \<turnstile> t2 : T; \<Gamma> \<turnstile> t3 : T\<rbrakk> \<Longrightarrow> \<Gamma> \<turnstile> IF t1 t2 t3 : T"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   439
| t_ZET[intro]:   "\<Gamma> \<turnstile> t : tINT \<Longrightarrow> \<Gamma> \<turnstile> ZET t : tBOOL"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   440
| t_EQI[intro]:   "\<lbrakk>\<Gamma> \<turnstile> t1 : tINT; \<Gamma> \<turnstile> t2 : tINT\<rbrakk> \<Longrightarrow> \<Gamma> \<turnstile> EQI t1 t2 : tBOOL"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   441
| t_FIX[intro]:   "\<lbrakk>x\<sharp>\<Gamma>; (x,T)#\<Gamma> \<turnstile> t : T\<rbrakk> \<Longrightarrow> \<Gamma> \<turnstile> FIX [x].t : T"  
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   442
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   443
declare lam.inject[simp]
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   444
inductive_cases typing_inversion[elim]:
53015
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 41798
diff changeset
   445
  "\<Gamma> \<turnstile> t\<^sub>1 -- t\<^sub>2 : T"
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 41798
diff changeset
   446
  "\<Gamma> \<turnstile> t\<^sub>1 ++ t\<^sub>2 : T"
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   447
  "\<Gamma> \<turnstile> IF t1 t2 t3 : T"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   448
  "\<Gamma> \<turnstile> ZET t : T"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   449
  "\<Gamma> \<turnstile> EQI t1 t2 : T"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   450
  "\<Gamma> \<turnstile> APP t1 t2 : T"
27247
e5787c5be196 added a progress lemma and tuned some comments
urbanc
parents: 27162
diff changeset
   451
  "\<Gamma> \<turnstile> TRUE : T"
e5787c5be196 added a progress lemma and tuned some comments
urbanc
parents: 27162
diff changeset
   452
  "\<Gamma> \<turnstile> FALSE : T"
e5787c5be196 added a progress lemma and tuned some comments
urbanc
parents: 27162
diff changeset
   453
  "\<Gamma> \<turnstile> NUM n : T"
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   454
declare lam.inject[simp del]
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   455
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   456
equivariance typing
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   457
nominal_inductive typing
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   458
  by (simp_all add: abs_fresh ty_fresh)
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   459
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   460
lemma t_LAM_inversion[dest]:
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   461
  assumes ty: "\<Gamma> \<turnstile> LAM [x].t : T" 
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   462
  and     fc: "x\<sharp>\<Gamma>" 
53015
a1119cf551e8 standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
wenzelm
parents: 41798
diff changeset
   463
  shows "\<exists>T\<^sub>1 T\<^sub>2. T = T\<^sub>1 \<rightarrow> T\<^sub>2 \<and> (x,T\<^sub>1)#\<Gamma> \<turnstile> t : T\<^sub>2"
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   464
using ty fc 
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   465
by (cases rule: typing.strong_cases) 
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   466
   (auto simp add: alpha lam.inject abs_fresh ty_fresh)
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   467
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   468
lemma t_FIX_inversion[dest]:
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   469
  assumes ty: "\<Gamma> \<turnstile> FIX [x].t : T" 
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   470
  and     fc: "x\<sharp>\<Gamma>" 
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   471
  shows "(x,T)#\<Gamma> \<turnstile> t : T"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   472
using ty fc 
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   473
by (cases rule: typing.strong_cases) 
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   474
   (auto simp add: alpha lam.inject abs_fresh ty_fresh)
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   475
63167
0909deb8059b isabelle update_cartouches -c -t;
wenzelm
parents: 58310
diff changeset
   476
section \<open>The Type-Preservation Property for the CBV Reduction Relation\<close>
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   477
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   478
lemma weakening: 
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   479
  fixes \<Gamma>1 \<Gamma>2::"tctx"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   480
  assumes a: "\<Gamma>1 \<turnstile> t : T" 
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   481
  and     b: "valid \<Gamma>2" 
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   482
  and     c: "\<Gamma>1 \<subseteq> \<Gamma>2"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   483
  shows "\<Gamma>2 \<turnstile> t : T"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   484
using a b c
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   485
by (nominal_induct \<Gamma>1 t T avoiding: \<Gamma>2 rule: typing.strong_induct)
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   486
   (auto | atomize)+
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   487
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   488
lemma type_substitution_aux:
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   489
  assumes a: "(\<Delta>@[(x,T')]@\<Gamma>) \<turnstile> e : T"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   490
  and     b: "\<Gamma> \<turnstile> e' : T'"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   491
  shows "(\<Delta>@\<Gamma>) \<turnstile> e[x::=e'] : T" 
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   492
using a b 
37362
berghofe
parents: 37358
diff changeset
   493
proof (nominal_induct "\<Delta>@[(x,T')]@\<Gamma>" e T avoiding: x e' \<Delta> rule: typing.strong_induct)
37358
74fb4f03bb51 recovered some untested theories;
wenzelm
parents: 29097
diff changeset
   494
  case (t_VAR y T x e' \<Delta>)
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   495
  then have a1: "valid (\<Delta>@[(x,T')]@\<Gamma>)" 
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   496
       and  a2: "(y,T) \<in> set (\<Delta>@[(x,T')]@\<Gamma>)" 
37362
berghofe
parents: 37358
diff changeset
   497
       and  a3: "\<Gamma> \<turnstile> e' : T'" .
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   498
  from a1 have a4: "valid (\<Delta>@\<Gamma>)" by (rule valid_insert)
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   499
  { assume eq: "x=y"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   500
    from a1 a2 have "T=T'" using eq by (auto intro: context_unique)
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   501
    with a3 have "\<Delta>@\<Gamma> \<turnstile> VAR y[x::=e'] : T" using eq a4 by (auto intro: weakening)
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   502
  }
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   503
  moreover
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   504
  { assume ineq: "x\<noteq>y"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   505
    from a2 have "(y,T) \<in> set (\<Delta>@\<Gamma>)" using ineq by simp
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   506
    then have "\<Delta>@\<Gamma> \<turnstile> VAR y[x::=e'] : T" using ineq a4 by auto
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   507
  }
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   508
  ultimately show "\<Delta>@\<Gamma> \<turnstile> VAR y[x::=e'] : T" by blast
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   509
qed (auto | force simp add: fresh_list_append fresh_list_cons)+
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   510
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   511
corollary type_substitution:
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   512
  assumes a: "(x,T')#\<Gamma> \<turnstile> e : T"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   513
  and     b: "\<Gamma> \<turnstile> e' : T'"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   514
  shows "\<Gamma> \<turnstile> e[x::=e'] : T"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   515
using a b
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   516
by (auto intro: type_substitution_aux[where \<Delta>="[]",simplified])
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   517
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   518
theorem cbv_type_preservation:
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   519
  assumes a: "t \<longrightarrow>cbv t'"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   520
  and     b: "\<Gamma> \<turnstile> t : T" 
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   521
  shows "\<Gamma> \<turnstile> t' : T"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   522
using a b
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   523
apply(nominal_induct avoiding: \<Gamma> T rule: cbv.strong_induct)
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   524
apply(auto elim!: typing_inversion dest: t_LAM_inversion simp add: type_substitution)
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   525
apply(frule t_FIX_inversion)
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   526
apply(auto simp add: type_substitution)
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   527
done
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   528
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   529
corollary cbv_star_type_preservation:
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   530
  assumes a: "t \<longrightarrow>cbv* t'"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   531
  and     b: "\<Gamma> \<turnstile> t : T" 
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   532
  shows "\<Gamma> \<turnstile> t' : T"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   533
using a b
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   534
by (induct) (auto intro: cbv_type_preservation)
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   535
63167
0909deb8059b isabelle update_cartouches -c -t;
wenzelm
parents: 58310
diff changeset
   536
section \<open>The Type-Preservation Property for the Machine and Evaluation Relation\<close>
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   537
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   538
theorem machine_type_preservation:
81127
12990a6dddcb avoid syntax clashes;
wenzelm
parents: 80914
diff changeset
   539
  assumes a: "<t,[]> \<leadsto>* <t',[]>"
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   540
  and     b: "\<Gamma> \<turnstile> t : T" 
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   541
  shows "\<Gamma> \<turnstile> t' : T"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   542
proof -
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   543
  from a have "t \<longrightarrow>cbv* t'" by (simp add: machine_star_implies_cbv_star)
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   544
  then show "\<Gamma> \<turnstile> t' : T" using b by (simp add: cbv_star_type_preservation)
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   545
qed
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   546
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   547
theorem eval_type_preservation:
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   548
  assumes a: "t \<Down> t'"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   549
  and     b: "\<Gamma> \<turnstile> t : T" 
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   550
  shows "\<Gamma> \<turnstile> t' : T"
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   551
proof -
81127
12990a6dddcb avoid syntax clashes;
wenzelm
parents: 80914
diff changeset
   552
  from a have "<t,[]> \<leadsto>* <t',[]>" by (simp add: eval_implies_machine_star)
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   553
  then show "\<Gamma> \<turnstile> t' : T" using b by (simp add: machine_type_preservation)
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   554
qed
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   555
63167
0909deb8059b isabelle update_cartouches -c -t;
wenzelm
parents: 58310
diff changeset
   556
text \<open>The Progress Property\<close>
27247
e5787c5be196 added a progress lemma and tuned some comments
urbanc
parents: 27162
diff changeset
   557
e5787c5be196 added a progress lemma and tuned some comments
urbanc
parents: 27162
diff changeset
   558
lemma canonical_tARR[dest]:
e5787c5be196 added a progress lemma and tuned some comments
urbanc
parents: 27162
diff changeset
   559
  assumes a: "[] \<turnstile> t : T1 \<rightarrow> T2"
e5787c5be196 added a progress lemma and tuned some comments
urbanc
parents: 27162
diff changeset
   560
  and     b: "val t"
e5787c5be196 added a progress lemma and tuned some comments
urbanc
parents: 27162
diff changeset
   561
  shows "\<exists>x t'. t = LAM [x].t'"
e5787c5be196 added a progress lemma and tuned some comments
urbanc
parents: 27162
diff changeset
   562
using b a by (induct) (auto) 
e5787c5be196 added a progress lemma and tuned some comments
urbanc
parents: 27162
diff changeset
   563
e5787c5be196 added a progress lemma and tuned some comments
urbanc
parents: 27162
diff changeset
   564
lemma canonical_tINT[dest]:
e5787c5be196 added a progress lemma and tuned some comments
urbanc
parents: 27162
diff changeset
   565
  assumes a: "[] \<turnstile> t : tINT"
e5787c5be196 added a progress lemma and tuned some comments
urbanc
parents: 27162
diff changeset
   566
  and     b: "val t"
e5787c5be196 added a progress lemma and tuned some comments
urbanc
parents: 27162
diff changeset
   567
  shows "\<exists>n. t = NUM n"
e5787c5be196 added a progress lemma and tuned some comments
urbanc
parents: 27162
diff changeset
   568
using b a 
e5787c5be196 added a progress lemma and tuned some comments
urbanc
parents: 27162
diff changeset
   569
by (induct) (auto simp add: fresh_list_nil)
e5787c5be196 added a progress lemma and tuned some comments
urbanc
parents: 27162
diff changeset
   570
e5787c5be196 added a progress lemma and tuned some comments
urbanc
parents: 27162
diff changeset
   571
lemma canonical_tBOOL[dest]:
e5787c5be196 added a progress lemma and tuned some comments
urbanc
parents: 27162
diff changeset
   572
  assumes a: "[] \<turnstile> t : tBOOL"
e5787c5be196 added a progress lemma and tuned some comments
urbanc
parents: 27162
diff changeset
   573
  and     b: "val t"
e5787c5be196 added a progress lemma and tuned some comments
urbanc
parents: 27162
diff changeset
   574
  shows "t = TRUE \<or> t = FALSE"
e5787c5be196 added a progress lemma and tuned some comments
urbanc
parents: 27162
diff changeset
   575
using b a 
e5787c5be196 added a progress lemma and tuned some comments
urbanc
parents: 27162
diff changeset
   576
by (induct) (auto simp add: fresh_list_nil)
e5787c5be196 added a progress lemma and tuned some comments
urbanc
parents: 27162
diff changeset
   577
e5787c5be196 added a progress lemma and tuned some comments
urbanc
parents: 27162
diff changeset
   578
theorem progress:
e5787c5be196 added a progress lemma and tuned some comments
urbanc
parents: 27162
diff changeset
   579
  assumes a: "[] \<turnstile> t : T"
e5787c5be196 added a progress lemma and tuned some comments
urbanc
parents: 27162
diff changeset
   580
  shows "(\<exists>t'. t \<longrightarrow>cbv t') \<or> (val t)"
e5787c5be196 added a progress lemma and tuned some comments
urbanc
parents: 27162
diff changeset
   581
using a
e5787c5be196 added a progress lemma and tuned some comments
urbanc
parents: 27162
diff changeset
   582
by (induct \<Gamma>\<equiv>"[]::tctx" t T)
e5787c5be196 added a progress lemma and tuned some comments
urbanc
parents: 27162
diff changeset
   583
   (auto dest!: canonical_tINT intro!: cbv.intros gr0I)
e5787c5be196 added a progress lemma and tuned some comments
urbanc
parents: 27162
diff changeset
   584
58219
61b852f90161 improved 'datatype_compat' further for recursion through functions
blanchet
parents: 54703
diff changeset
   585
end
27162
8d747de5c73e soundness and completeness proofs for a CK machine as
urbanc
parents:
diff changeset
   586