src/HOL/Nominal/Examples/Lam_substs.thy
author wenzelm
Sat, 17 Jun 2006 19:37:53 +0200
changeset 19912 4a3e35fd6e02
parent 19496 79dbe35c6cba
permissions -rw-r--r--
added singleton;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
18269
3f36e2165e51 some small tuning
urbanc
parents: 18263
diff changeset
     1
(* $Id$ *)
18106
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
     2
19496
79dbe35c6cba Capitalized theory names.
berghofe
parents: 19171
diff changeset
     3
theory Lam_substs
79dbe35c6cba Capitalized theory names.
berghofe
parents: 19171
diff changeset
     4
imports Iteration
18106
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
     5
begin
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
     6
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
     7
constdefs 
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
     8
  depth_Var :: "name \<Rightarrow> nat"
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
     9
  "depth_Var \<equiv> \<lambda>(a::name). 1"
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    10
  
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    11
  depth_App :: "nat \<Rightarrow> nat \<Rightarrow> nat"
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    12
  "depth_App \<equiv> \<lambda>n1 n2. (max n1 n2)+1"
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    13
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    14
  depth_Lam :: "name \<Rightarrow> nat \<Rightarrow> nat"
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    15
  "depth_Lam \<equiv> \<lambda>(a::name) n. n+1"
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    16
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    17
  depth_lam :: "lam \<Rightarrow> nat"
19171
17b952ec5641 split the files
urbanc
parents: 19166
diff changeset
    18
  "depth_lam \<equiv> itfun depth_Var depth_App depth_Lam"
18106
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    19
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    20
lemma supp_depth_Var:
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    21
  shows "((supp depth_Var)::name set)={}"
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    22
  apply(simp add: depth_Var_def)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    23
  apply(simp add: supp_def)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    24
  apply(simp add: perm_fun_def)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    25
  apply(simp add: perm_nat_def)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    26
  done
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    27
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    28
lemma supp_depth_App:
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    29
  shows "((supp depth_App)::name set)={}"
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    30
  apply(simp add: depth_App_def)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    31
  apply(simp add: supp_def)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    32
  apply(simp add: perm_fun_def)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    33
  apply(simp add: perm_nat_def)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    34
  done
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    35
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    36
lemma supp_depth_Lam:
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    37
  shows "((supp depth_Lam)::name set)={}"
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    38
  apply(simp add: depth_Lam_def)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    39
  apply(simp add: supp_def)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    40
  apply(simp add: perm_fun_def)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    41
  apply(simp add: perm_nat_def)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    42
  done
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    43
 
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    44
lemma fin_supp_depth:
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    45
  shows "finite ((supp (depth_Var,depth_App,depth_Lam))::name set)"
19171
17b952ec5641 split the files
urbanc
parents: 19166
diff changeset
    46
  by (finite_guess add: depth_Var_def depth_App_def depth_Lam_def perm_nat_def fs_name1)
18106
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    47
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    48
lemma fresh_depth_Lam:
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    49
  shows "\<exists>(a::name). a\<sharp>depth_Lam \<and> (\<forall>n. a\<sharp>depth_Lam a n)"
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    50
apply(rule exI)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    51
apply(rule conjI)
19171
17b952ec5641 split the files
urbanc
parents: 19166
diff changeset
    52
apply(simp add: fresh_def)
17b952ec5641 split the files
urbanc
parents: 19166
diff changeset
    53
apply(force simp add: supp_depth_Lam)
18106
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    54
apply(unfold fresh_def)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    55
apply(simp add: supp_def)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    56
apply(simp add: perm_nat_def)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    57
done
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    58
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    59
lemma depth_Var:
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    60
  shows "depth_lam (Var c) = 1"
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    61
apply(simp add: depth_lam_def)
19171
17b952ec5641 split the files
urbanc
parents: 19166
diff changeset
    62
apply(simp add: itfun_Var[OF fin_supp_depth, OF fresh_depth_Lam])
18106
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    63
apply(simp add: depth_Var_def)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    64
done
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    65
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    66
lemma depth_App:
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    67
  shows "depth_lam (App t1 t2) = (max (depth_lam t1) (depth_lam t2))+1"
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    68
apply(simp add: depth_lam_def)
19171
17b952ec5641 split the files
urbanc
parents: 19166
diff changeset
    69
apply(simp add: itfun_App[OF fin_supp_depth, OF fresh_depth_Lam])
18106
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    70
apply(simp add: depth_App_def)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    71
done
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    72
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    73
lemma depth_Lam:
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    74
  shows "depth_lam (Lam [a].t) = (depth_lam t)+1"
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    75
apply(simp add: depth_lam_def)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    76
apply(rule trans)
19171
17b952ec5641 split the files
urbanc
parents: 19166
diff changeset
    77
apply(rule itfun_Lam[OF fin_supp_depth, OF fresh_depth_Lam])
18106
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    78
apply(simp add: fresh_def supp_prod supp_depth_Var supp_depth_App supp_depth_Lam)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    79
apply(simp add: depth_Lam_def)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    80
done
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    81
19171
17b952ec5641 split the files
urbanc
parents: 19166
diff changeset
    82
text {* substitution *}
18106
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    83
constdefs 
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    84
  subst_Var :: "name \<Rightarrow>lam \<Rightarrow> name \<Rightarrow> lam"
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    85
  "subst_Var b t \<equiv> \<lambda>a. (if a=b then t else (Var a))"
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    86
  
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    87
  subst_App :: "name \<Rightarrow> lam \<Rightarrow> lam \<Rightarrow> lam \<Rightarrow> lam"
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    88
  "subst_App b t \<equiv> \<lambda>r1 r2. App r1 r2"
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    89
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    90
  subst_Lam :: "name \<Rightarrow> lam \<Rightarrow> name \<Rightarrow> lam \<Rightarrow> lam"
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    91
  "subst_Lam b t \<equiv> \<lambda>a r. Lam [a].r"
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    92
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    93
  subst_lam :: "name \<Rightarrow> lam \<Rightarrow> lam \<Rightarrow> lam"
19171
17b952ec5641 split the files
urbanc
parents: 19166
diff changeset
    94
  "subst_lam b t \<equiv> itfun (subst_Var b t) (subst_App b t) (subst_Lam b t)"
18106
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    95
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    96
lemma supports_subst_Var:
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    97
  shows "((supp (b,t))::name set) supports (subst_Var b t)"
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    98
apply(supports_simp add: subst_Var_def)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
    99
apply(rule impI)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   100
apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst])
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   101
apply(simp add: pt_fresh_fresh[OF pt_name_inst, OF at_name_inst])
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   102
done
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   103
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   104
lemma supports_subst_App:
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   105
  shows "((supp (b,t))::name set) supports subst_App b t"
19171
17b952ec5641 split the files
urbanc
parents: 19166
diff changeset
   106
by  (supports_simp add: subst_App_def)
18106
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   107
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   108
lemma supports_subst_Lam:
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   109
  shows "((supp (b,t))::name set) supports subst_Lam b t"
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   110
  by (supports_simp add: subst_Lam_def)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   111
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   112
lemma fin_supp_subst:
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   113
  shows "finite ((supp (subst_Var b t,subst_App b t,subst_Lam b t))::name set)"
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   114
apply(auto simp add: supp_prod)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   115
apply(rule supports_finite)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   116
apply(rule supports_subst_Var)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   117
apply(simp add: fs_name1)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   118
apply(rule supports_finite)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   119
apply(rule supports_subst_App)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   120
apply(simp add: fs_name1)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   121
apply(rule supports_finite)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   122
apply(rule supports_subst_Lam)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   123
apply(simp add: fs_name1)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   124
done
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   125
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   126
lemma fresh_subst_Lam:
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   127
  shows "\<exists>(a::name). a\<sharp>(subst_Lam b t)\<and> (\<forall>y. a\<sharp>(subst_Lam b t) a y)"
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   128
apply(subgoal_tac "\<exists>(c::name). c\<sharp>(b,t)")
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   129
apply(auto)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   130
apply(rule_tac x="c" in exI)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   131
apply(auto)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   132
apply(rule supports_fresh)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   133
apply(rule supports_subst_Lam)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   134
apply(simp_all add: fresh_def[symmetric] fs_name1)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   135
apply(simp add: subst_Lam_def)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   136
apply(simp add: abs_fresh)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   137
apply(rule at_exists_fresh[OF at_name_inst])
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   138
apply(simp add: fs_name1)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   139
done
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   140
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   141
lemma subst_Var:
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   142
  shows "subst_lam b t (Var a) = (if a=b then t else (Var a))"
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   143
apply(simp add: subst_lam_def)
19171
17b952ec5641 split the files
urbanc
parents: 19166
diff changeset
   144
apply(auto simp add: itfun_Var[OF fin_supp_subst, OF fresh_subst_Lam])
18106
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   145
apply(auto simp add: subst_Var_def)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   146
done
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   147
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   148
lemma subst_App:
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   149
  shows "subst_lam b t (App t1 t2) = App (subst_lam b t t1) (subst_lam b t t2)"
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   150
apply(simp add: subst_lam_def)
19171
17b952ec5641 split the files
urbanc
parents: 19166
diff changeset
   151
apply(auto simp add: itfun_App[OF fin_supp_subst, OF fresh_subst_Lam])
18106
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   152
apply(auto simp add: subst_App_def)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   153
done
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   154
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   155
lemma subst_Lam:
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   156
  assumes a: "a\<sharp>(b,t)"
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   157
  shows "subst_lam b t (Lam [a].t1) = Lam [a].(subst_lam b t t1)"
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   158
using a
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   159
apply(simp add: subst_lam_def)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   160
apply(subgoal_tac "a\<sharp>(subst_Var b t,subst_App b t,subst_Lam b t)")
19171
17b952ec5641 split the files
urbanc
parents: 19166
diff changeset
   161
apply(auto simp add: itfun_Lam[OF fin_supp_subst, OF fresh_subst_Lam])
18106
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   162
apply(simp (no_asm) add: subst_Lam_def)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   163
apply(auto simp add: fresh_prod)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   164
apply(rule supports_fresh)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   165
apply(rule supports_subst_Var)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   166
apply(simp_all add: fs_name1 fresh_def[symmetric] fresh_prod)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   167
apply(rule supports_fresh)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   168
apply(rule supports_subst_App)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   169
apply(simp_all add: fs_name1 fresh_def[symmetric] fresh_prod)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   170
apply(rule supports_fresh)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   171
apply(rule supports_subst_Lam)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   172
apply(simp_all add: fs_name1 fresh_def[symmetric] fresh_prod)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   173
done
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   174
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   175
lemma subst_Lam':
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   176
  assumes a: "a\<noteq>b"
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   177
  and     b: "a\<sharp>t"
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   178
  shows "subst_lam b t (Lam [a].t1) = Lam [a].(subst_lam b t t1)"
19171
17b952ec5641 split the files
urbanc
parents: 19166
diff changeset
   179
by (simp add: subst_Lam fresh_prod a b fresh_atm)
18106
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   180
18300
ca1ac9e81bc8 added one clause for substitution in the lambda-case and
urbanc
parents: 18298
diff changeset
   181
lemma subst_Lam'':
ca1ac9e81bc8 added one clause for substitution in the lambda-case and
urbanc
parents: 18298
diff changeset
   182
  assumes a: "a\<sharp>b"
ca1ac9e81bc8 added one clause for substitution in the lambda-case and
urbanc
parents: 18298
diff changeset
   183
  and     b: "a\<sharp>t"
ca1ac9e81bc8 added one clause for substitution in the lambda-case and
urbanc
parents: 18298
diff changeset
   184
  shows "subst_lam b t (Lam [a].t1) = Lam [a].(subst_lam b t t1)"
19171
17b952ec5641 split the files
urbanc
parents: 19166
diff changeset
   185
by (simp add: subst_Lam fresh_prod a b)
18300
ca1ac9e81bc8 added one clause for substitution in the lambda-case and
urbanc
parents: 18298
diff changeset
   186
18106
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   187
consts
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   188
  subst_syn  :: "lam \<Rightarrow> name \<Rightarrow> lam \<Rightarrow> lam" ("_[_::=_]" [100,100,100] 900)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   189
translations 
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   190
  "t1[a::=t2]" \<rightleftharpoons> "subst_lam a t2 t1"
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   191
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   192
declare subst_Var[simp]
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   193
declare subst_App[simp]
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   194
declare subst_Lam[simp]
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   195
declare subst_Lam'[simp]
18300
ca1ac9e81bc8 added one clause for substitution in the lambda-case and
urbanc
parents: 18298
diff changeset
   196
declare subst_Lam''[simp]
18106
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   197
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   198
lemma subst_eqvt[simp]:
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   199
  fixes pi:: "name prm"
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   200
  and   t1:: "lam"
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   201
  and   t2:: "lam"
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   202
  and   a :: "name"
18301
0c5c3b1a700e fixed the lemma where the new names generated by nominal_induct
urbanc
parents: 18300
diff changeset
   203
  shows "pi\<bullet>(t1[b::=t2]) = (pi\<bullet>t1)[(pi\<bullet>b)::=(pi\<bullet>t2)]"
18659
2ff0ae57431d changes to make use of the new induction principle proved by
urbanc
parents: 18363
diff changeset
   204
apply(nominal_induct t1 avoiding: b t2 rule: lam.induct)
18106
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   205
apply(auto simp add: perm_bij fresh_prod fresh_atm)
18659
2ff0ae57431d changes to make use of the new induction principle proved by
urbanc
parents: 18363
diff changeset
   206
apply(subgoal_tac "(pi\<bullet>name)\<sharp>(pi\<bullet>b,pi\<bullet>t2)")(*A*)
2ff0ae57431d changes to make use of the new induction principle proved by
urbanc
parents: 18363
diff changeset
   207
apply(simp)
19171
17b952ec5641 split the files
urbanc
parents: 19166
diff changeset
   208
(*A*)
17b952ec5641 split the files
urbanc
parents: 19166
diff changeset
   209
apply(simp add: pt_fresh_right[OF pt_name_inst, OF at_name_inst], perm_simp add: fresh_prod fresh_atm) 
18106
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   210
done
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   211
19171
17b952ec5641 split the files
urbanc
parents: 19166
diff changeset
   212
lemma subst_supp: 
17b952ec5641 split the files
urbanc
parents: 19166
diff changeset
   213
  shows "supp(t1[a::=t2]) \<subseteq> (((supp(t1)-{a})\<union>supp(t2))::name set)"
18659
2ff0ae57431d changes to make use of the new induction principle proved by
urbanc
parents: 18363
diff changeset
   214
apply(nominal_induct t1 avoiding: a t2 rule: lam.induct)
18106
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   215
apply(auto simp add: lam.supp supp_atm fresh_prod abs_supp)
19171
17b952ec5641 split the files
urbanc
parents: 19166
diff changeset
   216
apply(blast)+
18106
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   217
done
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   218
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   219
(* parallel substitution *)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   220
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   221
consts
18263
7f75925498da cleaned up all examples so that they work with the
urbanc
parents: 18106
diff changeset
   222
  "domain" :: "(name\<times>lam) list \<Rightarrow> (name list)"
18106
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   223
primrec
18263
7f75925498da cleaned up all examples so that they work with the
urbanc
parents: 18106
diff changeset
   224
  "domain []    = []"
7f75925498da cleaned up all examples so that they work with the
urbanc
parents: 18106
diff changeset
   225
  "domain (x#\<theta>) = (fst x)#(domain \<theta>)" 
18106
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   226
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   227
consts
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   228
  "apply_sss"  :: "(name\<times>lam) list \<Rightarrow> name \<Rightarrow> lam" (" _ < _ >" [80,80] 80)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   229
primrec  
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   230
"(x#\<theta>)<a>  = (if (a = fst x) then (snd x) else \<theta><a>)" 
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   231
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   232
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   233
lemma apply_sss_eqvt[rule_format]:
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   234
  fixes pi::"name prm"
18263
7f75925498da cleaned up all examples so that they work with the
urbanc
parents: 18106
diff changeset
   235
  shows "a\<in>set (domain \<theta>) \<longrightarrow> pi\<bullet>(\<theta><a>) = (pi\<bullet>\<theta>)<pi\<bullet>a>"
18106
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   236
apply(induct_tac \<theta>)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   237
apply(auto)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   238
apply(simp add: pt_bij[OF pt_name_inst, OF at_name_inst])
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   239
done
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   240
18263
7f75925498da cleaned up all examples so that they work with the
urbanc
parents: 18106
diff changeset
   241
lemma domain_eqvt[rule_format]:
18106
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   242
  fixes pi::"name prm"
18263
7f75925498da cleaned up all examples so that they work with the
urbanc
parents: 18106
diff changeset
   243
  shows "((pi\<bullet>a)\<in>set (domain \<theta>)) =  (a\<in>set (domain ((rev pi)\<bullet>\<theta>)))"
18106
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   244
apply(induct_tac \<theta>)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   245
apply(auto)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   246
apply(simp_all add: pt_rev_pi[OF pt_name_inst, OF at_name_inst])
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   247
apply(simp_all add: pt_pi_rev[OF pt_name_inst, OF at_name_inst])
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   248
done
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   249
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   250
constdefs 
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   251
  psubst_Var :: "(name\<times>lam) list \<Rightarrow> name \<Rightarrow> lam"
18263
7f75925498da cleaned up all examples so that they work with the
urbanc
parents: 18106
diff changeset
   252
  "psubst_Var \<theta> \<equiv> \<lambda>a. (if a\<in>set (domain \<theta>) then \<theta><a> else (Var a))"
18106
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   253
  
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   254
  psubst_App :: "(name\<times>lam) list \<Rightarrow> lam \<Rightarrow> lam \<Rightarrow> lam"
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   255
  "psubst_App \<theta> \<equiv> \<lambda>r1 r2. App r1 r2"
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   256
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   257
  psubst_Lam :: "(name\<times>lam) list \<Rightarrow> name \<Rightarrow> lam \<Rightarrow> lam"
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   258
  "psubst_Lam \<theta> \<equiv> \<lambda>a r. Lam [a].r"
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   259
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   260
  psubst_lam :: "(name\<times>lam) list \<Rightarrow> lam \<Rightarrow> lam"
19171
17b952ec5641 split the files
urbanc
parents: 19166
diff changeset
   261
  "psubst_lam \<theta> \<equiv> itfun (psubst_Var \<theta>) (psubst_App \<theta>) (psubst_Lam \<theta>)"
18106
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   262
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   263
lemma supports_psubst_Var:
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   264
  shows "((supp \<theta>)::name set) supports (psubst_Var \<theta>)"
18263
7f75925498da cleaned up all examples so that they work with the
urbanc
parents: 18106
diff changeset
   265
  by (supports_simp add: psubst_Var_def apply_sss_eqvt domain_eqvt)
18106
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   266
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   267
lemma supports_psubst_App:
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   268
  shows "((supp \<theta>)::name set) supports psubst_App \<theta>"
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   269
  by (supports_simp add: psubst_App_def)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   270
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   271
lemma supports_psubst_Lam:
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   272
  shows "((supp \<theta>)::name set) supports psubst_Lam \<theta>"
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   273
  by (supports_simp add: psubst_Lam_def)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   274
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   275
lemma fin_supp_psubst:
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   276
  shows "finite ((supp (psubst_Var \<theta>,psubst_App \<theta>,psubst_Lam \<theta>))::name set)"
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   277
apply(auto simp add: supp_prod)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   278
apply(rule supports_finite)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   279
apply(rule supports_psubst_Var)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   280
apply(simp add: fs_name1)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   281
apply(rule supports_finite)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   282
apply(rule supports_psubst_App)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   283
apply(simp add: fs_name1)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   284
apply(rule supports_finite)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   285
apply(rule supports_psubst_Lam)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   286
apply(simp add: fs_name1)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   287
done
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   288
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   289
lemma fresh_psubst_Lam:
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   290
  shows "\<exists>(a::name). a\<sharp>(psubst_Lam \<theta>)\<and> (\<forall>y. a\<sharp>(psubst_Lam \<theta>) a y)"
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   291
apply(subgoal_tac "\<exists>(c::name). c\<sharp>\<theta>")
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   292
apply(auto)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   293
apply(rule_tac x="c" in exI)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   294
apply(auto)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   295
apply(rule supports_fresh)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   296
apply(rule supports_psubst_Lam)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   297
apply(simp_all add: fresh_def[symmetric] fs_name1)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   298
apply(simp add: psubst_Lam_def)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   299
apply(simp add: abs_fresh)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   300
apply(rule at_exists_fresh[OF at_name_inst])
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   301
apply(simp add: fs_name1)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   302
done
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   303
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   304
lemma psubst_Var:
18263
7f75925498da cleaned up all examples so that they work with the
urbanc
parents: 18106
diff changeset
   305
  shows "psubst_lam \<theta> (Var a) = (if a\<in>set (domain \<theta>) then \<theta><a> else (Var a))"
18106
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   306
apply(simp add: psubst_lam_def)
19171
17b952ec5641 split the files
urbanc
parents: 19166
diff changeset
   307
apply(auto simp add: itfun_Var[OF fin_supp_psubst, OF fresh_psubst_Lam])
18106
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   308
apply(auto simp add: psubst_Var_def)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   309
done
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   310
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   311
lemma psubst_App:
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   312
  shows "psubst_lam \<theta> (App t1 t2) = App (psubst_lam \<theta> t1) (psubst_lam \<theta> t2)"
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   313
apply(simp add: psubst_lam_def)
19171
17b952ec5641 split the files
urbanc
parents: 19166
diff changeset
   314
apply(auto simp add: itfun_App[OF fin_supp_psubst, OF fresh_psubst_Lam])
18106
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   315
apply(auto simp add: psubst_App_def)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   316
done
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   317
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   318
lemma psubst_Lam:
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   319
  assumes a: "a\<sharp>\<theta>"
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   320
  shows "psubst_lam \<theta> (Lam [a].t1) = Lam [a].(psubst_lam \<theta> t1)"
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   321
using a
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   322
apply(simp add: psubst_lam_def)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   323
apply(subgoal_tac "a\<sharp>(psubst_Var \<theta>,psubst_App \<theta>,psubst_Lam \<theta>)")
19171
17b952ec5641 split the files
urbanc
parents: 19166
diff changeset
   324
apply(auto simp add: itfun_Lam[OF fin_supp_psubst, OF fresh_psubst_Lam])
18106
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   325
apply(simp (no_asm) add: psubst_Lam_def)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   326
apply(auto simp add: fresh_prod)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   327
apply(rule supports_fresh)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   328
apply(rule supports_psubst_Var)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   329
apply(simp_all add: fs_name1 fresh_def[symmetric] fresh_prod)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   330
apply(rule supports_fresh)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   331
apply(rule supports_psubst_App)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   332
apply(simp_all add: fs_name1 fresh_def[symmetric] fresh_prod)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   333
apply(rule supports_fresh)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   334
apply(rule supports_psubst_Lam)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   335
apply(simp_all add: fs_name1 fresh_def[symmetric] fresh_prod)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   336
done
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   337
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   338
declare psubst_Var[simp]
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   339
declare psubst_App[simp]
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   340
declare psubst_Lam[simp]
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   341
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   342
consts
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   343
  psubst_syn  :: "lam \<Rightarrow> (name\<times>lam) list \<Rightarrow> lam" ("_[<_>]" [100,100] 900)
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   344
translations 
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   345
  "t[<\<theta>>]" \<rightleftharpoons> "psubst_lam \<theta> t"
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   346
836135c8acb2 Initial commit.
urbanc
parents:
diff changeset
   347
end