src/HOL/Nominal/Examples/Contexts.thy
author urbanc
Tue, 08 Jan 2008 23:11:08 +0100
changeset 25867 c24395ea4e71
parent 25858 6704045112a8
child 26763 fba4995cb0f9
permissions -rw-r--r--
tuned proofs
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
25722
0a104ddb72d9 polishing of some proofs
urbanc
parents: 25499
diff changeset
     1
(* $Id$ *)
25499
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
     2
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
     3
theory Contexts
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
     4
imports "../Nominal"
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
     5
begin
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
     6
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
     7
text {* 
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
     8
  
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
     9
  We show here that the Plotkin-style of defining
25751
a4e69ce247e0 tuned proofs and comments
urbanc
parents: 25722
diff changeset
    10
  reduction relations (based on congruence rules) is
25499
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    11
  equivalent to the Felleisen-Hieb-style representation 
25858
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
    12
  (based on contexts), and show cbv-evaluation via a 
25867
c24395ea4e71 tuned proofs
urbanc
parents: 25858
diff changeset
    13
  CK-machine described by Roshan James.
25499
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    14
  
25751
a4e69ce247e0 tuned proofs and comments
urbanc
parents: 25722
diff changeset
    15
  The interesting point is that contexts do not contain 
a4e69ce247e0 tuned proofs and comments
urbanc
parents: 25722
diff changeset
    16
  any binders. On the other hand the operation of filling 
25499
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    17
  a term into a context produces an alpha-equivalent term. 
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    18
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    19
*}
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    20
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    21
atom_decl name
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    22
25867
c24395ea4e71 tuned proofs
urbanc
parents: 25858
diff changeset
    23
text {* 
c24395ea4e71 tuned proofs
urbanc
parents: 25858
diff changeset
    24
  Lambda-Terms - the Lam-term constructor binds a name
c24395ea4e71 tuned proofs
urbanc
parents: 25858
diff changeset
    25
*}
25499
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    26
nominal_datatype lam = 
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    27
    Var "name"
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    28
  | App "lam" "lam"
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    29
  | Lam "\<guillemotleft>name\<guillemotright>lam" ("Lam [_]._" [100,100] 100)
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    30
25751
a4e69ce247e0 tuned proofs and comments
urbanc
parents: 25722
diff changeset
    31
text {* 
25867
c24395ea4e71 tuned proofs
urbanc
parents: 25858
diff changeset
    32
  Contexts - the lambda case in contexts does not bind a name, 
c24395ea4e71 tuned proofs
urbanc
parents: 25858
diff changeset
    33
  even if we introduce the notation [_]._ for CLam.
25751
a4e69ce247e0 tuned proofs and comments
urbanc
parents: 25722
diff changeset
    34
*}
25499
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    35
nominal_datatype ctx = 
25858
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
    36
    Hole ("\<box>" 1000)  
25499
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    37
  | CAppL "ctx" "lam"
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    38
  | CAppR "lam" "ctx" 
25722
0a104ddb72d9 polishing of some proofs
urbanc
parents: 25499
diff changeset
    39
  | CLam "name" "ctx"  ("CLam [_]._" [100,100] 100) 
25499
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    40
25867
c24395ea4e71 tuned proofs
urbanc
parents: 25858
diff changeset
    41
text {* Capture-avoiding substitution *}
25499
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    42
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    43
consts subst :: "lam \<Rightarrow> name \<Rightarrow> lam \<Rightarrow> lam"  ("_[_::=_]" [100,100,100] 100)
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    44
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    45
nominal_primrec
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    46
  "(Var x)[y::=s] = (if x=y then s else (Var x))"
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    47
  "(App t\<^isub>1 t\<^isub>2)[y::=s] = App (t\<^isub>1[y::=s]) (t\<^isub>2[y::=s])"
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    48
  "x\<sharp>(y,s) \<Longrightarrow> (Lam [x].t)[y::=s] = Lam [x].(t[y::=s])"
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    49
apply(finite_guess)+
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    50
apply(rule TrueI)+
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    51
apply(simp add: abs_fresh)
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    52
apply(fresh_guess)+
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    53
done
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    54
25867
c24395ea4e71 tuned proofs
urbanc
parents: 25858
diff changeset
    55
text {*
c24395ea4e71 tuned proofs
urbanc
parents: 25858
diff changeset
    56
  Filling is the operation that fills a term into a hole. 
c24395ea4e71 tuned proofs
urbanc
parents: 25858
diff changeset
    57
  This operation is possibly capturing.
c24395ea4e71 tuned proofs
urbanc
parents: 25858
diff changeset
    58
*}
25499
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    59
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    60
consts 
25751
a4e69ce247e0 tuned proofs and comments
urbanc
parents: 25722
diff changeset
    61
  filling :: "ctx \<Rightarrow> lam \<Rightarrow> lam" ("_<_>" [100,100] 100)
25499
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    62
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    63
nominal_primrec
25858
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
    64
  "\<box><t> = t"
25499
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    65
  "(CAppL E t')<t> = App (E<t>) t'"
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    66
  "(CAppR t' E)<t> = App t' (E<t>)"
25722
0a104ddb72d9 polishing of some proofs
urbanc
parents: 25499
diff changeset
    67
  "(CLam [x].E)<t> = Lam [x].(E<t>)" 
25499
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    68
by (rule TrueI)+
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    69
25858
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
    70
text {* 
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
    71
  While contexts themselves are not alpha-equivalence classes, the 
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
    72
  filling operation produces an alpha-equivalent lambda-term. 
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
    73
*}
25499
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    74
lemma alpha_test: 
25858
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
    75
  shows "x\<noteq>y \<Longrightarrow> (CLam [x].\<box>) \<noteq> (CLam [y].\<box>)"
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
    76
  and   "(CLam [x].\<box>)<Var x> = (CLam [y].\<box>)<Var y>"
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
    77
by (auto simp add: alpha ctx.inject lam.inject calc_atm fresh_atm) 
25722
0a104ddb72d9 polishing of some proofs
urbanc
parents: 25499
diff changeset
    78
25867
c24395ea4e71 tuned proofs
urbanc
parents: 25858
diff changeset
    79
text {* The composition of two contexts. *}
25499
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    80
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    81
consts 
25867
c24395ea4e71 tuned proofs
urbanc
parents: 25858
diff changeset
    82
 ctx_compose :: "ctx \<Rightarrow> ctx \<Rightarrow> ctx" ("_ \<circ> _" [100,100] 100)
25499
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    83
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    84
nominal_primrec
25858
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
    85
  "\<box> \<circ> E' = E'"
25499
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    86
  "(CAppL E t') \<circ> E' = CAppL (E \<circ> E') t'"
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    87
  "(CAppR t' E) \<circ> E' = CAppR t' (E \<circ> E')"
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    88
  "(CLam [x].E) \<circ> E' = CLam [x].(E \<circ> E')"
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    89
by (rule TrueI)+
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    90
  
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    91
lemma ctx_compose:
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    92
  shows "E1<E2<t>> = (E1 \<circ> E2)<t>"
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    93
by (induct E1 rule: ctx.weak_induct) (auto)
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    94
25751
a4e69ce247e0 tuned proofs and comments
urbanc
parents: 25722
diff changeset
    95
text {* Beta-reduction via contexts in the Felleisen-Hieb style. *}
25499
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    96
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    97
inductive
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    98
  ctx_red :: "lam\<Rightarrow>lam\<Rightarrow>bool" ("_ \<longrightarrow>x _" [80,80] 80) 
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
    99
where
25858
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   100
  xbeta[intro]: "E<App (Lam [x].t) t'> \<longrightarrow>x E<t[x::=t']>" 
25499
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
   101
25751
a4e69ce247e0 tuned proofs and comments
urbanc
parents: 25722
diff changeset
   102
text {* Beta-reduction via congruence rules in the Plotkin style. *}
25499
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
   103
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
   104
inductive
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
   105
  cong_red :: "lam\<Rightarrow>lam\<Rightarrow>bool" ("_ \<longrightarrow>o _" [80,80] 80) 
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
   106
where
25858
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   107
  obeta[intro]: "App (Lam [x].t) t' \<longrightarrow>o t[x::=t']"
25499
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
   108
| oapp1[intro]: "t \<longrightarrow>o t' \<Longrightarrow> App t t2 \<longrightarrow>o App t' t2"
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
   109
| oapp2[intro]: "t \<longrightarrow>o t' \<Longrightarrow> App t2 t \<longrightarrow>o App t2 t'"
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
   110
| olam[intro]:  "t \<longrightarrow>o t' \<Longrightarrow> Lam [x].t \<longrightarrow>o Lam [x].t'"
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
   111
25751
a4e69ce247e0 tuned proofs and comments
urbanc
parents: 25722
diff changeset
   112
text {* The proof that shows both relations are equal. *}
25499
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
   113
25858
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   114
lemma cong_red_in_ctx:
25499
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
   115
  assumes a: "t \<longrightarrow>o t'"
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
   116
  shows "E<t> \<longrightarrow>o E<t'>"
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
   117
using a
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
   118
by (induct E rule: ctx.weak_induct) (auto)
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
   119
25858
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   120
lemma ctx_red_in_ctx:
25499
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
   121
  assumes a: "t \<longrightarrow>x t'"
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
   122
  shows "E<t> \<longrightarrow>x E<t'>"
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
   123
using a 
25858
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   124
by (induct) (auto simp add: ctx_compose)
25499
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
   125
25858
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   126
theorem ctx_red_implies_cong_red:
25499
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
   127
  assumes a: "t \<longrightarrow>x t'"
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
   128
  shows "t \<longrightarrow>o t'"
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
   129
using a 
25858
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   130
by (induct) (auto intro!: cong_red_in_ctx)
25499
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
   131
25858
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   132
theorem cong_red_implies_ctx_red:
25499
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
   133
  assumes a: "t \<longrightarrow>o t'"
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
   134
  shows "t \<longrightarrow>x t'"
25858
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   135
using a
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   136
proof (induct)
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   137
  case (obeta x t' t)
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   138
  have "\<box><App (Lam [x].t) t'> \<longrightarrow>x \<box><t[x::=t']>" by (rule xbeta) 
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   139
  then show  "App (Lam [x].t) t' \<longrightarrow>x t[x::=t']" by simp
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   140
qed (metis ctx_red_in_ctx filling.simps)+ (* found by SledgeHammer *)
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   141
25867
c24395ea4e71 tuned proofs
urbanc
parents: 25858
diff changeset
   142
section {* We now use context in a CBV list machine *}
25858
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   143
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   144
text {* First the function that composes a list of contexts *}
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   145
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   146
primrec
25867
c24395ea4e71 tuned proofs
urbanc
parents: 25858
diff changeset
   147
  ctx_composes :: "ctx list \<Rightarrow> ctx" ("_\<down>" [80] 80)
c24395ea4e71 tuned proofs
urbanc
parents: 25858
diff changeset
   148
where
c24395ea4e71 tuned proofs
urbanc
parents: 25858
diff changeset
   149
    "[]\<down> = \<box>"
c24395ea4e71 tuned proofs
urbanc
parents: 25858
diff changeset
   150
  | "(E#Es)\<down> = (Es\<down>) \<circ> E"    
25858
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   151
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   152
text {* Values *}
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   153
inductive
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   154
  val :: "lam\<Rightarrow>bool" 
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   155
where
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   156
   v_Lam[intro]: "val (Lam [x].e)"
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   157
 | v_Var[intro]: "val (Var x)"
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   158
25867
c24395ea4e71 tuned proofs
urbanc
parents: 25858
diff changeset
   159
text {* CBV-reduction using contexts *}
25858
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   160
inductive
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   161
  cbv :: "lam\<Rightarrow>lam\<Rightarrow>bool" ("_ \<longrightarrow>cbv _" [80,80] 80) 
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   162
where
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   163
  cbv_beta[intro]: "val v \<Longrightarrow> E<App (Lam [x].e) v> \<longrightarrow>cbv E<e[x::=v]>"
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   164
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   165
text {* reflexive, transitive closure of CBV reduction *}
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   166
inductive 
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   167
  "cbv_star" :: "lam\<Rightarrow>lam\<Rightarrow>bool" (" _ \<longrightarrow>cbv* _" [80,80] 80)
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   168
where
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   169
  cbvs1[intro]: "e \<longrightarrow>cbv* e"
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   170
| cbvs2[intro]: "e \<longrightarrow>cbv e' \<Longrightarrow> e \<longrightarrow>cbv* e'"
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   171
| cbvs3[intro,trans]: "\<lbrakk>e1\<longrightarrow>cbv* e2; e2 \<longrightarrow>cbv* e3\<rbrakk> \<Longrightarrow> e1 \<longrightarrow>cbv* e3"
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   172
25867
c24395ea4e71 tuned proofs
urbanc
parents: 25858
diff changeset
   173
text {* A little CK-machine, which builds up a list of evaluation contexts. *}
25858
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   174
inductive
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   175
  machine :: "lam\<Rightarrow>ctx list\<Rightarrow>lam\<Rightarrow>ctx list\<Rightarrow>bool" ("<_,_> \<mapsto> <_,_>" [60,60,60,60] 60)
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   176
where
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   177
  m1[intro]: "<App e1 e2, Es> \<mapsto> <e1,(CAppL \<box> e2)#Es>"
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   178
| m2[intro]: "val v \<Longrightarrow> <v,(CAppL \<box> e2)#Es> \<mapsto> <e2,(CAppR v \<box>)#Es>"
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   179
| m3[intro]: "val v \<Longrightarrow> <v,(CAppR (Lam [x].e) \<box>)#Es> \<mapsto> <e[x::=v],Es>"
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   180
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   181
lemma machine_red_implies_cbv_reds_aux:
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   182
  assumes a: "<e,Es> \<mapsto> <e',Es'>"
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   183
  shows "(Es\<down>)<e> \<longrightarrow>cbv* (Es'\<down>)<e'>"
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   184
using a
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   185
by (induct) (auto simp add: ctx_compose[symmetric])
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   186
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   187
lemma machine_execution_implies_cbv_reds:
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   188
  assumes a: "<e,[]> \<mapsto> <e',[]>"
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   189
  shows "e \<longrightarrow>cbv* e'"
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   190
using a
6704045112a8 some pre-release tunings
urbanc
parents: 25751
diff changeset
   191
by (auto dest: machine_red_implies_cbv_reds_aux)
25499
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
   192
25867
c24395ea4e71 tuned proofs
urbanc
parents: 25858
diff changeset
   193
text {*
c24395ea4e71 tuned proofs
urbanc
parents: 25858
diff changeset
   194
  One would now like to show something about the opposite
c24395ea4e71 tuned proofs
urbanc
parents: 25858
diff changeset
   195
  direction, by according to Amr Sabry this amounts to
c24395ea4e71 tuned proofs
urbanc
parents: 25858
diff changeset
   196
  showing a standardisation lemma, which is hard.
c24395ea4e71 tuned proofs
urbanc
parents: 25858
diff changeset
   197
  *}
c24395ea4e71 tuned proofs
urbanc
parents: 25858
diff changeset
   198
25499
7e0ad4838ce9 an example file for how to treat Felleisen-Hieb-style contexts
urbanc
parents:
diff changeset
   199
end