src/HOL/Nominal/Examples/Iteration.thy
author urbanc
Wed, 01 Mar 2006 00:04:52 +0100
changeset 19158 3cca1e0a2a79
parent 19157 6e4ce7402dbe
child 19168 c8faffc8e6fb
permissions -rw-r--r--
some minor tuning on the proofs
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
19157
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
     1
(* $Id$ *)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
     2
theory Iteration
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
     3
imports "../nominal"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
     4
begin
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
     5
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
     6
atom_decl name
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
     7
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
     8
nominal_datatype lam = Var "name"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
     9
                     | App "lam" "lam"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    10
                     | Lam "\<guillemotleft>name\<guillemotright>lam" ("Lam [_]._" [100,100] 100)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    11
 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    12
types 'a f1_ty  = "name\<Rightarrow>('a::pt_name)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    13
      'a f2_ty  = "'a\<Rightarrow>'a\<Rightarrow>('a::pt_name)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    14
      'a f3_ty  = "name\<Rightarrow>'a\<Rightarrow>('a::pt_name)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    15
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    16
consts
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    17
  it :: "'a f1_ty \<Rightarrow> 'a f2_ty \<Rightarrow> 'a f3_ty \<Rightarrow> (lam \<times> (name prm \<Rightarrow> 'a::pt_name)) set"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    18
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    19
inductive "it f1 f2 f3"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    20
intros
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    21
it1: "(Var a,\<lambda>pi. f1(pi\<bullet>a)) \<in> it f1 f2 f3"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    22
it2: "\<lbrakk>(t1,r1) \<in> it f1 f2 f3; (t2,r2) \<in> it f1 f2 f3\<rbrakk> \<Longrightarrow> 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    23
      (App t1 t2,\<lambda>pi. f2 (r1 pi) (r2 pi)) \<in> it f1 f2 f3"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    24
it3: "(t,r) \<in> it f1 f2 f3 \<Longrightarrow> 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    25
      (Lam [a].t,\<lambda>pi. fresh_fun (\<lambda>a'. f3 a' (r (pi@[(a,a')])))) \<in> it f1 f2 f3"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    26
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    27
constdefs
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    28
  itfun' :: "'a f1_ty \<Rightarrow> 'a f2_ty \<Rightarrow> 'a f3_ty \<Rightarrow> lam \<Rightarrow> name prm \<Rightarrow> ('a::pt_name)" 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    29
  "itfun' f1 f2 f3 t \<equiv> (THE y. (t,y) \<in> it f1 f2 f3)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    30
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    31
  itfun :: "'a f1_ty \<Rightarrow> 'a f2_ty \<Rightarrow> 'a f3_ty \<Rightarrow> lam \<Rightarrow> ('a::pt_name)" 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    32
  "itfun f1 f2 f3 t \<equiv> itfun' f1 f2 f3 t ([]::name prm)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    33
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    34
lemma it_total:
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    35
  shows "\<exists>r. (t,r) \<in> it f1 f2 f3"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    36
  apply(induct t rule: lam.induct_weak)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    37
  apply(auto intro: it.intros)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    38
  done
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    39
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    40
lemma it_prm_eq:
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    41
  assumes a: "(t,y) \<in> it f1 f2 f3"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    42
  and     b: "pi1 \<triangleq> pi2"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    43
  shows "y pi1 = y pi2"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    44
using a b
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    45
apply(induct fixing: pi1 pi2)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    46
apply(auto simp add: pt3[OF pt_name_inst])
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    47
apply(rule_tac f="fresh_fun" in arg_cong)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    48
apply(auto simp add: expand_fun_eq)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    49
apply(drule_tac x="pi1@[(a,x)]" in meta_spec)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    50
apply(drule_tac x="pi2@[(a,x)]" in meta_spec)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    51
apply(force simp add: prm_eq_def pt2[OF pt_name_inst])
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    52
done
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    53
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    54
lemma f3_freshness_conditions_simple:
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    55
  fixes f3::"('a::pt_name) f3_ty"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    56
  and   y ::"name prm \<Rightarrow> 'a::pt_name"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    57
  and   a ::"name"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    58
  and   pi::"name prm"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    59
  assumes a: "finite ((supp f3)::name set)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    60
  and     b: "finite ((supp y)::name set)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    61
  and     c: "\<exists>(a::name). a\<sharp>f3 \<and> (\<forall>(y::'a::pt_name). a\<sharp>f3 a y)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    62
  shows "\<exists>(a''::name). a''\<sharp>(\<lambda>a'. f3 a' (y (pi@[(a,a')]))) \<and> a''\<sharp>(\<lambda>a'. f3 a' (y (pi@[(a,a')]))) a''" 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    63
proof -
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    64
  from c obtain a' where d0: "a'\<sharp>f3" and d1: "\<forall>(y::'a::pt_name). a'\<sharp>f3 a' y" by force
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    65
  have "\<exists>(a''::name). a''\<sharp>(f3,a,a',pi,y)" 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    66
    by (rule at_exists_fresh[OF at_name_inst],  simp add: supp_prod fs_name1 a b)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    67
  then obtain a'' where d2: "a''\<sharp>f3" and d3: "a''\<noteq>a'" and d3b: "a''\<sharp>(f3,a,pi,y)" 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    68
    by (auto simp add: fresh_prod at_fresh[OF at_name_inst])
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    69
  have d3c: "a''\<notin>((supp (f3,a,pi,y))::name set)" using d3b by (simp add: fresh_def)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    70
  have d4: "a''\<sharp>f3 a'' (y (pi@[(a,a'')]))"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    71
  proof -
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    72
    have d5: "[(a'',a')]\<bullet>f3 = f3" 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    73
      by (rule pt_fresh_fresh[OF pt_name_inst, OF at_name_inst, OF d2, OF d0]) 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    74
    from d1 have "\<forall>(y::'a::pt_name). ([(a'',a')]\<bullet>a')\<sharp>([(a'',a')]\<bullet>(f3 a' y))"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    75
      by (simp add: pt_fresh_bij[OF pt_name_inst, OF at_name_inst])
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    76
    hence "\<forall>(y::'a::pt_name). a''\<sharp>(f3 a'' ([(a'',a')]\<bullet>y))" using d3 d5 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    77
      by (simp add: at_calc[OF at_name_inst] pt_fun_app_eq[OF pt_name_inst, OF at_name_inst])
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    78
    hence "a''\<sharp>(f3 a'' ([(a'',a')]\<bullet>((rev [(a'',a')])\<bullet>(y (pi@[(a,a'')])))))" by force
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    79
    thus ?thesis by (simp only: pt_pi_rev[OF pt_name_inst, OF at_name_inst])
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    80
  qed
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    81
  have d6: "a''\<sharp>(\<lambda>a'. f3 a' (y (pi@[(a,a')])))"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    82
  proof -
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    83
    from a b have d7: "finite ((supp (f3,a,pi,y))::name set)" by (simp add: supp_prod fs_name1)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    84
    have "((supp (f3,a,pi,y))::name set) supports (\<lambda>a'. f3 a' (y (pi@[(a,a')])))" 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    85
      by (supports_simp add: perm_append)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    86
    with d7 d3c show ?thesis by (simp add: supports_fresh)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    87
  qed
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    88
  from d6 d4 show ?thesis by force
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    89
qed
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    90
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    91
text {* FIXME: this lemma should be thrown out somehow *}
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    92
lemma f3_freshness_conditions:
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    93
  fixes f3::"('a::pt_name) f3_ty"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    94
  and   y ::"name prm \<Rightarrow> 'a::pt_name"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    95
  and   a ::"name"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    96
  and   pi1::"name prm"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    97
  and   pi2::"name prm"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    98
  assumes a: "finite ((supp f3)::name set)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
    99
  and     b: "finite ((supp y)::name set)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   100
  and     c: "\<exists>(a::name). a\<sharp>f3 \<and> (\<forall>(y::'a::pt_name). a\<sharp>f3 a y)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   101
  shows "\<exists>(a''::name). a''\<sharp>(\<lambda>a'. f3 a' (y (pi1@[(a,a')]@pi2))) \<and> 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   102
                       a''\<sharp>(\<lambda>a'. f3 a' (y (pi1@[(a,a')]@pi2))) a''" 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   103
proof -
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   104
  from c obtain a' where d0: "a'\<sharp>f3" and d1: "\<forall>(y::'a::pt_name). a'\<sharp>f3 a' y" by force
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   105
  have "\<exists>(a''::name). a''\<sharp>(f3,a,a',pi1,pi2,y)" 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   106
    by (rule at_exists_fresh[OF at_name_inst],  simp add: supp_prod fs_name1 a b)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   107
  then obtain a'' where d2: "a''\<sharp>f3" and d3: "a''\<noteq>a'" and d3b: "a''\<sharp>(f3,a,pi1,pi2,y)" 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   108
    by (auto simp add: fresh_prod at_fresh[OF at_name_inst])
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   109
  have d3c: "a''\<notin>((supp (f3,a,pi1,pi2,y))::name set)" using d3b by (simp add: fresh_def)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   110
  have d4: "a''\<sharp>f3 a'' (y (pi1@[(a,a'')]@pi2))"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   111
  proof -
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   112
    have d5: "[(a'',a')]\<bullet>f3 = f3" 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   113
      by (rule pt_fresh_fresh[OF pt_name_inst, OF at_name_inst, OF d2, OF d0]) 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   114
    from d1 have "\<forall>(y::'a::pt_name). ([(a'',a')]\<bullet>a')\<sharp>([(a'',a')]\<bullet>(f3 a' y))"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   115
      by (simp add: pt_fresh_bij[OF pt_name_inst, OF at_name_inst])
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   116
    hence "\<forall>(y::'a::pt_name). a''\<sharp>(f3 a'' ([(a'',a')]\<bullet>y))" using d3 d5 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   117
      by (simp add: at_calc[OF at_name_inst] pt_fun_app_eq[OF pt_name_inst, OF at_name_inst])
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   118
    hence "a''\<sharp>(f3 a'' ([(a'',a')]\<bullet>((rev [(a'',a')])\<bullet>(y (pi1@[(a,a'')]@pi2)))))" by force
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   119
    thus ?thesis by (simp only: pt_pi_rev[OF pt_name_inst, OF at_name_inst])
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   120
  qed
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   121
  have d6: "a''\<sharp>(\<lambda>a'. f3 a' (y (pi1@[(a,a')]@pi2)))"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   122
  proof -
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   123
    from a b have d7: "finite ((supp (f3,a,pi1,pi2,y))::name set)" by (simp add: supp_prod fs_name1)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   124
    have e: "((supp (f3,a,pi1,pi2,y))::name set) supports (\<lambda>a'. f3 a' (y (pi1@[(a,a')]@pi2)))" 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   125
      by (supports_simp add: perm_append)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   126
    from e d7 d3c show ?thesis by (rule supports_fresh)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   127
  qed
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   128
  from d6 d4 show ?thesis by force
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   129
qed
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   130
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   131
lemma it_fin_supp: 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   132
  assumes f: "finite ((supp (f1,f2,f3))::name set)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   133
  and     c: "\<exists>(a::name). a\<sharp>f3 \<and> (\<forall>(r::'a::pt_name). a\<sharp>f3 a r)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   134
  and     a: "(t,r) \<in> it f1 f2 f3"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   135
  shows "finite ((supp r)::name set)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   136
using a 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   137
proof (induct)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   138
  case it1 thus ?case using f by (finite_guess add: supp_prod fs_name1)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   139
next
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   140
  case it2 thus ?case using f by (finite_guess add: supp_prod fs_name1)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   141
next
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   142
  case (it3 c r t)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   143
  have ih: "finite ((supp r)::name set)" by fact
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   144
  let ?g' = "\<lambda>pi a'. f3 a' (r (pi@[(c,a')]))"     --"helper function"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   145
  --"two facts used by fresh_fun_equiv"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   146
  have fact1: "\<forall>pi. finite ((supp (?g' pi))::name set)" using f ih
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   147
    by (rule_tac allI, finite_guess add: perm_append supp_prod fs_name1)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   148
  have fact2: "\<forall>pi. \<exists>(a''::name). a''\<sharp>(?g' pi) \<and> a''\<sharp>((?g' pi) a'')" 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   149
  proof 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   150
    fix pi::"name prm"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   151
    show "\<exists>(a''::name). a''\<sharp>(?g' pi) \<and> a''\<sharp>((?g' pi) a'')" using f c ih
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   152
      by (rule_tac f3_freshness_conditions_simple, simp_all add: supp_prod)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   153
  qed
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   154
  show ?case using fact1 fact2 ih f
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   155
    by (finite_guess add: fresh_fun_equiv[OF pt_name_inst, OF at_name_inst] 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   156
                          perm_append supp_prod fs_name1)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   157
qed 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   158
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   159
lemma it_trans: 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   160
  shows "\<lbrakk>(t,r)\<in>rec f1 f2 f3; r=r'\<rbrakk> \<Longrightarrow> (t,r')\<in>rec f1 f2 f3" by simp
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   161
19158
3cca1e0a2a79 some minor tuning on the proofs
urbanc
parents: 19157
diff changeset
   162
lemma it_perm_aux:
19157
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   163
  assumes f: "finite ((supp (f1,f2,f3))::name set)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   164
  and     c: "\<exists>(a::name). a\<sharp>f3 \<and> (\<forall>(y::'a::pt_name). a\<sharp>f3 a y)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   165
  and     a: "(t,y) \<in> it f1 f2 f3"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   166
  shows "(pi1\<bullet>t, \<lambda>pi2. y (pi2@pi1)) \<in> it f1 f2 f3"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   167
using a
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   168
proof (induct)
19158
3cca1e0a2a79 some minor tuning on the proofs
urbanc
parents: 19157
diff changeset
   169
  case (it1 c) show ?case by (auto simp add: pt_name2, rule it.intros)
19157
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   170
next
19158
3cca1e0a2a79 some minor tuning on the proofs
urbanc
parents: 19157
diff changeset
   171
  case (it2 t1 t2 r1 r2) thus ?case by (auto intro: it.intros) 
19157
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   172
next
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   173
  case (it3 c r t)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   174
  let ?g  = "\<lambda>pi' a'. f3 a' (r (pi'@[(pi1\<bullet>c,a')]@pi1))"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   175
  and ?h  = "\<lambda>pi' a'. f3 a' (r ((pi'@pi1)@[(c,a')]))" 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   176
  have ih': "(t,r) \<in> it f1 f2 f3" by fact
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   177
  hence fin_r: "finite ((supp r)::name set)" using f c by (auto intro: it_fin_supp)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   178
  have ih: "(pi1\<bullet>t,\<lambda>pi2. r (pi2@pi1)) \<in> it f1 f2 f3" by fact
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   179
  hence "(Lam [(pi1\<bullet>c)].(pi1\<bullet>t),\<lambda>pi'. fresh_fun (?g pi')) \<in> it f1 f2 f3" 
19158
3cca1e0a2a79 some minor tuning on the proofs
urbanc
parents: 19157
diff changeset
   180
    by (auto intro: it_trans it.intros) (* FIXME: wy is it_trans needed ? *)
19157
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   181
  moreover
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   182
  have "\<forall>pi'. (fresh_fun (?g pi')) = (fresh_fun (?h pi'))" 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   183
  proof 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   184
    fix pi'::"name prm"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   185
    have fin_g: "finite ((supp (?g pi'))::name set)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   186
      using f fin_r by (finite_guess add: perm_append supp_prod fs_name1)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   187
    have fr_g: "\<exists>(a::name). (a\<sharp>(?g pi')\<and> a\<sharp>(?g pi' a))" 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   188
      using f c fin_r by (rule_tac f3_freshness_conditions, simp_all add: supp_prod)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   189
    have fin_h: "finite ((supp (?h pi'))::name set)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   190
      using f fin_r by (finite_guess add: perm_append supp_prod fs_name1)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   191
    have fr_h: "\<exists>(a::name). (a\<sharp>(?h pi')\<and> a\<sharp>(?h pi' a))" 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   192
      using f c fin_r by (rule_tac f3_freshness_conditions_simple, simp_all add: supp_prod)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   193
    show "fresh_fun (?g pi') = fresh_fun (?h pi')" 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   194
    proof -
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   195
      have "\<exists>(d::name). d\<sharp>(?g pi', ?h pi', pi1)" using fin_g fin_h
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   196
	by (rule_tac at_exists_fresh[OF at_name_inst], simp only: supp_prod finite_Un fs_name1, simp)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   197
      then obtain d::"name" where f1: "d\<sharp>?g pi'" and f2: "d\<sharp>?h pi'" and f3: "d\<sharp>(rev pi1)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   198
	by (auto simp only: fresh_prod fresh_list_rev)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   199
      have "?g pi' d = ?h pi' d" 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   200
      proof -
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   201
	have "r (pi'@[(pi1\<bullet>c,d)]@pi1) = r ((pi'@pi1)@[(c,d)])" using f3 ih'
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   202
	  by (auto intro!: it_prm_eq at_prm_eq_append[OF at_name_inst]
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   203
              simp only: append_assoc at_ds10[OF at_name_inst])
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   204
	then show ?thesis by simp
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   205
      qed
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   206
      then show "fresh_fun (?g pi') = fresh_fun (?h pi')"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   207
	using f1 fin_g fr_g f2 fin_h fr_h
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   208
	by (simp add: fresh_fun_app[OF pt_name_inst, OF at_name_inst])
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   209
    qed
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   210
  qed
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   211
  hence "(\<lambda>pi'. (fresh_fun (?g pi'))) = (\<lambda>pi'. (fresh_fun (?h pi')))" by (simp add: expand_fun_eq)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   212
  ultimately show ?case by simp
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   213
qed
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   214
19158
3cca1e0a2a79 some minor tuning on the proofs
urbanc
parents: 19157
diff changeset
   215
lemma it_perm:
19157
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   216
  assumes f: "finite ((supp (f1,f2,f3))::name set)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   217
  and     c: "\<exists>(a::name). a\<sharp>f3 \<and> (\<forall>(y::'a::pt_name). a\<sharp>f3 a y)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   218
  and     a: "(pi\<bullet>t,y) \<in> it f1 f2 f3"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   219
  shows "(t, \<lambda>pi2. y (pi2@(rev pi))) \<in> it f1 f2 f3"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   220
proof - 
19158
3cca1e0a2a79 some minor tuning on the proofs
urbanc
parents: 19157
diff changeset
   221
  from a have "((rev pi)\<bullet>(pi\<bullet>t),\<lambda>pi2. y (pi2@(rev pi))) \<in> it f1 f2 f3" using f c
3cca1e0a2a79 some minor tuning on the proofs
urbanc
parents: 19157
diff changeset
   222
    by (simp add: it_perm_aux)
19157
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   223
  thus ?thesis by perm_simp
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   224
qed
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   225
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   226
lemma it_unique:
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   227
  assumes f: "finite ((supp (f1,f2,f3))::name set)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   228
  and     c: "\<exists>(a::name). a\<sharp>f3 \<and> (\<forall>(y::'a::pt_name). a\<sharp>f3 a y)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   229
  and     a: "(t,y) \<in> it f1 f2 f3"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   230
  and     b: "(t,y') \<in> it f1 f2 f3"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   231
  shows "y pi = y' pi"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   232
using a b
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   233
proof (induct fixing: y' pi)
19158
3cca1e0a2a79 some minor tuning on the proofs
urbanc
parents: 19157
diff changeset
   234
  case (it1 c) thus ?case by (cases, simp_all add: lam.inject)
19157
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   235
next
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   236
  case (it2 r1 r2 t1 t2)
19158
3cca1e0a2a79 some minor tuning on the proofs
urbanc
parents: 19157
diff changeset
   237
  with `(App t1 t2, y') \<in> it f1 f2 f3` show ?case 
19157
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   238
    by (cases, simp_all (no_asm_use) add: lam.inject, force)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   239
next
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   240
  case (it3 c r t r')
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   241
  have "(t,r) \<in> it f1 f2 f3" by fact
19158
3cca1e0a2a79 some minor tuning on the proofs
urbanc
parents: 19157
diff changeset
   242
  hence fin_r: "finite ((supp r)::name set)" using f c by (simp only: it_fin_supp)
19157
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   243
  have ih: "\<And>r' pi. (t,r') \<in> it f1 f2 f3 \<Longrightarrow> r pi = r' pi" by fact
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   244
  have "(Lam [c].t, r') \<in> it f1 f2 f3" by fact
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   245
  then show "fresh_fun (\<lambda>a'. f3 a' (r (pi@[(c,a')]))) = r' pi"
19158
3cca1e0a2a79 some minor tuning on the proofs
urbanc
parents: 19157
diff changeset
   246
  proof (cases, auto simp add: lam.inject)
19157
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   247
    fix a::"name" and t'::"lam" and r''::"name prm\<Rightarrow>'a::pt_name"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   248
    assume i5: "[c].t = [a].t'"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   249
    and    i6: "(t',r'') \<in> it f1 f2 f3"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   250
    hence fin_r'': "finite ((supp r'')::name set)" using f c by (auto intro: it_fin_supp)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   251
    let ?g = "\<lambda>a'. f3 a' (r (pi@[(c,a')]))"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   252
    and ?h = "\<lambda>a'. f3 a' (r'' (pi@[(a,a')]))"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   253
    show "fresh_fun ?g = fresh_fun ?h" using i5
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   254
    proof (cases "a=c")
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   255
      case True
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   256
      have i7: "a=c" by fact
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   257
      with i5 have i8: "t=t'" by (simp add: alpha)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   258
      show "fresh_fun ?g = fresh_fun ?h" using i6 i7 i8 ih by simp
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   259
    next
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   260
      case False
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   261
      assume i9: "a\<noteq>c"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   262
      with i5[symmetric] have i10: "t'=[(a,c)]\<bullet>t" and i11: "a\<sharp>t" by (simp_all add: alpha)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   263
      have fin_g: "finite ((supp ?g)::name set)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   264
	using f fin_r by (finite_guess add: perm_append supp_prod fs_name1)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   265
      have fin_h: "finite ((supp ?h)::name set)" 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   266
	using f fin_r'' by (finite_guess add: perm_append supp_prod fs_name1)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   267
      have fr_g: "\<exists>(a''::name). a''\<sharp>?g \<and> a''\<sharp>(?g a'')"
19158
3cca1e0a2a79 some minor tuning on the proofs
urbanc
parents: 19157
diff changeset
   268
	using f c fin_r by (simp add:  f3_freshness_conditions_simple supp_prod)
19157
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   269
      have fr_h: "\<exists>(a''::name). a''\<sharp>?h \<and> a''\<sharp>(?h a'')"
19158
3cca1e0a2a79 some minor tuning on the proofs
urbanc
parents: 19157
diff changeset
   270
	using f c fin_r'' by (simp add: f3_freshness_conditions_simple supp_prod)
19157
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   271
      have "\<exists>(d::name). d\<sharp>(?g,?h,t,a,c)" using fin_g fin_h
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   272
	by (rule_tac at_exists_fresh[OF at_name_inst], simp only: finite_Un supp_prod fs_name1, simp)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   273
      then obtain d::"name" 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   274
	where f1: "d\<sharp>?g" and f2: "d\<sharp>?h" and f3: "d\<sharp>t" and f4: "d\<noteq>a" and f5: "d\<noteq>c" 
19158
3cca1e0a2a79 some minor tuning on the proofs
urbanc
parents: 19157
diff changeset
   275
	by (force simp add: fresh_prod fresh_atm)
19157
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   276
      have g1: "[(a,d)]\<bullet>t = t" 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   277
	by (rule pt_fresh_fresh[OF pt_name_inst, OF at_name_inst, OF i11, OF f3]) 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   278
      from i6 have "(([(a,c)]@[(a,d)])\<bullet>t,r'') \<in> it f1 f2 f3" using g1 i10 by (simp only: pt_name2)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   279
      hence "(t, \<lambda>pi2. r'' (pi2@(rev ([(a,c)]@[(a,d)])))) \<in> it f1 f2 f3"
19158
3cca1e0a2a79 some minor tuning on the proofs
urbanc
parents: 19157
diff changeset
   280
	by (simp only: it_perm[OF f, OF c])
19157
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   281
      hence g2: "(t, \<lambda>pi2. r'' (pi2@([(a,d)]@[(a,c)]))) \<in> it f1 f2 f3" by simp
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   282
      have "distinct [a,c,d]" using i9 f4 f5 by force
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   283
      hence g3: "(pi@[(c,d)]@[(a,d)]@[(a,c)]) \<triangleq> (pi@[(a,d)])"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   284
	by (rule_tac at_prm_eq_append[OF at_name_inst], 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   285
            force simp add: prm_eq_def at_calc[OF at_name_inst])
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   286
      have "fresh_fun ?g = ?g d" using fin_g fr_g f1
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   287
	by (simp add: fresh_fun_app[OF pt_name_inst, OF at_name_inst])
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   288
      also have "\<dots> = f3 d ((\<lambda>pi2. r'' (pi2@([(a,d)]@[(a,c)]))) (pi@[(c,d)]))" using ih g2 by simp 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   289
      also have "\<dots> = f3 d (r'' (pi@[(c,d)]@[(a,d)]@[(a,c)]))" by simp
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   290
      also have "\<dots> = f3 d (r'' (pi@[(a,d)]))" using i6 g3 by (simp add: it_prm_eq)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   291
      also have "\<dots> = fresh_fun ?h" using fin_h fr_h f2
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   292
	by (simp add: fresh_fun_app[OF pt_name_inst, OF at_name_inst])
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   293
      finally show "fresh_fun ?g = fresh_fun ?h" by simp
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   294
    qed
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   295
  qed
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   296
qed
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   297
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   298
lemma it_function:
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   299
  assumes f: "finite ((supp (f1,f2,f3))::name set)"
19158
3cca1e0a2a79 some minor tuning on the proofs
urbanc
parents: 19157
diff changeset
   300
  and     c: "\<exists>(a::name). a\<sharp>f3 \<and> (\<forall>(r::'a::pt_name). a\<sharp>f3 a r)"
3cca1e0a2a79 some minor tuning on the proofs
urbanc
parents: 19157
diff changeset
   301
  shows "\<exists>!r. (t,r) \<in> it f1 f2 f3"
19157
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   302
proof (rule ex_ex1I)
19158
3cca1e0a2a79 some minor tuning on the proofs
urbanc
parents: 19157
diff changeset
   303
  case goal1 show "\<exists>r. (t,r) \<in> it f1 f2 f3" by (rule it_total)
19157
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   304
next
19158
3cca1e0a2a79 some minor tuning on the proofs
urbanc
parents: 19157
diff changeset
   305
  case (goal2 r1 r2)
3cca1e0a2a79 some minor tuning on the proofs
urbanc
parents: 19157
diff changeset
   306
  have a1: "(t,r1) \<in> it f1 f2 f3" and a2: "(t,r2) \<in> it f1 f2 f3" by fact
3cca1e0a2a79 some minor tuning on the proofs
urbanc
parents: 19157
diff changeset
   307
  hence "\<forall>pi. r1 pi = r2 pi" using it_unique[OF f, OF c] by simp
3cca1e0a2a79 some minor tuning on the proofs
urbanc
parents: 19157
diff changeset
   308
  thus "r1=r2" by (simp add: expand_fun_eq) 
19157
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   309
qed
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   310
  
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   311
lemma it_eqvt:
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   312
  fixes pi::"name prm"
19158
3cca1e0a2a79 some minor tuning on the proofs
urbanc
parents: 19157
diff changeset
   313
  assumes f: "finite ((supp (f1,f2,f3))::name set)"
19157
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   314
  and     c: "\<exists>(a::name). a\<sharp>f3 \<and> (\<forall>(r::'a::pt_name). a\<sharp>f3 a r)"
19158
3cca1e0a2a79 some minor tuning on the proofs
urbanc
parents: 19157
diff changeset
   315
  and     a: "(t,r) \<in> it f1 f2 f3"
19157
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   316
  shows "(pi\<bullet>t,pi\<bullet>r) \<in> it (pi\<bullet>f1) (pi\<bullet>f2) (pi\<bullet>f3)"
19158
3cca1e0a2a79 some minor tuning on the proofs
urbanc
parents: 19157
diff changeset
   317
using a
19157
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   318
proof(induct)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   319
  case it1 show ?case by (perm_simp add: it.intros)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   320
next
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   321
  case it2 thus ?case by (perm_simp add: it.intros)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   322
next
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   323
  case (it3 c r t) (* lam case *)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   324
  let ?g = "pi\<bullet>(\<lambda>pi'. fresh_fun (\<lambda>a'. f3 a' (r (pi'@[(c,a')]))))"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   325
  and ?h = "\<lambda>pi'. fresh_fun (\<lambda>a'. (pi\<bullet>f3) a' ((pi\<bullet>r) (pi'@[((pi\<bullet>c),a')])))"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   326
  have "(t,r) \<in> it f1 f2 f3" by fact
19158
3cca1e0a2a79 some minor tuning on the proofs
urbanc
parents: 19157
diff changeset
   327
  hence fin_r: "finite ((supp r)::name set)" using f c by (auto intro: it_fin_supp)
19157
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   328
  have ih: "(pi\<bullet>t,pi\<bullet>r) \<in> it (pi\<bullet>f1) (pi\<bullet>f2) (pi\<bullet>f3)" by fact
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   329
  hence "(Lam [(pi\<bullet>c)].(pi\<bullet>t),?h) \<in> it (pi\<bullet>f1) (pi\<bullet>f2) (pi\<bullet>f3)" by (simp add: it.intros)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   330
  moreover 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   331
  have "?g = ?h"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   332
  proof -
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   333
    let ?g' = "\<lambda>pi a'. f3 a' (r (pi@[(c,a')]))"
19158
3cca1e0a2a79 some minor tuning on the proofs
urbanc
parents: 19157
diff changeset
   334
    have fact1: "\<forall>pi. finite ((supp (?g' pi))::name set)" using fin_r f
19157
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   335
      by (rule_tac allI, finite_guess add: perm_append supp_prod fs_name1)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   336
    have fact2: "\<forall>pi. \<exists>(a''::name). a''\<sharp>(?g' pi) \<and> a''\<sharp>((?g' pi) a'')" 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   337
    proof 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   338
      fix pi::"name prm"
19158
3cca1e0a2a79 some minor tuning on the proofs
urbanc
parents: 19157
diff changeset
   339
      show "\<exists>(a''::name). a''\<sharp>(?g' pi) \<and> a''\<sharp>((?g' pi) a'')" using f c fin_r
3cca1e0a2a79 some minor tuning on the proofs
urbanc
parents: 19157
diff changeset
   340
	by (simp add: f3_freshness_conditions_simple supp_prod)
19157
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   341
    qed
19158
3cca1e0a2a79 some minor tuning on the proofs
urbanc
parents: 19157
diff changeset
   342
    from fact1 fact2 show "?g = ?h" by (perm_simp add: fresh_fun_eqvt perm_append)
19157
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   343
  qed
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   344
  ultimately show "(pi\<bullet>Lam [c].t,?g) \<in> it (pi\<bullet>f1) (pi\<bullet>f2) (pi\<bullet>f3)" by simp
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   345
qed
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   346
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   347
lemma theI2':
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   348
  assumes a1: "P a" 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   349
  and     a2: "\<exists>!x. P x" 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   350
  and     a3: "P a \<Longrightarrow> Q a"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   351
  shows "Q (THE x. P x)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   352
apply(rule theI2)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   353
apply(rule a1)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   354
apply(subgoal_tac "\<exists>!x. P x")
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   355
apply(auto intro: a1 simp add: Ex1_def)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   356
apply(fold Ex1_def)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   357
apply(rule a2)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   358
apply(subgoal_tac "x=a")
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   359
apply(simp)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   360
apply(rule a3)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   361
apply(assumption)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   362
apply(subgoal_tac "\<exists>!x. P x")
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   363
apply(auto intro: a1 simp add: Ex1_def)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   364
apply(fold Ex1_def)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   365
apply(rule a2)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   366
done
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   367
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   368
lemma itfun'_equiv:
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   369
  fixes pi::"name prm"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   370
  assumes f: "finite ((supp (f1,f2,f3))::name set)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   371
  and     c: "\<exists>(a::name). a\<sharp>f3 \<and> (\<forall>(y::'a::pt_name). a\<sharp>f3 a y)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   372
  shows "pi\<bullet>(itfun' f1 f2 f3 t) = itfun' (pi\<bullet>f1) (pi\<bullet>f2) (pi\<bullet>f3) (pi\<bullet>t)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   373
using f
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   374
apply(auto simp add: itfun'_def)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   375
apply(subgoal_tac "\<exists>y. (t,y) \<in> it f1 f2 f3")(*A*)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   376
apply(auto)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   377
apply(rule sym)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   378
apply(rule_tac a="y" in theI2')
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   379
apply(assumption)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   380
apply(rule it_function[OF f, OF c])
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   381
apply(rule the1_equality)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   382
apply(rule it_function)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   383
apply(simp add: supp_prod)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   384
apply(simp add: pt_supp_finite_pi[OF pt_name_inst, OF at_name_inst])
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   385
apply(subgoal_tac "\<exists>(a::name). a\<sharp>f3 \<and> (\<forall>(y::'a::pt_name). a\<sharp>f3 a y)")
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   386
apply(auto)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   387
apply(rule_tac x="pi\<bullet>a" in exI)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   388
apply(auto)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   389
apply(simp add: fresh_eqvt)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   390
apply(drule_tac x="(rev pi)\<bullet>x" in spec)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   391
apply(subgoal_tac "(pi\<bullet>f3) (pi\<bullet>a) x  = pi\<bullet>(f3 a ((rev pi)\<bullet>x))")
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   392
apply(simp add: fresh_eqvt)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   393
apply(subgoal_tac "pi\<bullet>(f3 a ((rev pi)\<bullet>x)) = (pi\<bullet>f3) (pi\<bullet>a) (pi\<bullet>((rev pi)\<bullet>x))")
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   394
apply(simp)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   395
apply(perm_simp)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   396
apply(perm_simp)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   397
apply(rule c)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   398
apply(rule it_eqvt)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   399
apply(rule f, rule c, assumption)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   400
(*A*)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   401
apply(rule it_total)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   402
done
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   403
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   404
lemma itfun'_equiv_aux:
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   405
  fixes pi::"name prm"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   406
  assumes f: "finite ((supp (f1,f2,f3))::name set)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   407
  and     c: "\<exists>(a::name). a\<sharp>f3 \<and> (\<forall>(y::'a::pt_name). a\<sharp>f3 a y)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   408
  shows "pi\<bullet>(itfun' f1 f2 f3 t pi') = itfun' (pi\<bullet>f1) (pi\<bullet>f2) (pi\<bullet>f3) (pi\<bullet>t) (pi\<bullet>pi')" (is "?LHS=?RHS")
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   409
proof -
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   410
  have "?LHS = (pi\<bullet>itfun' f1 f2 f3 t) (pi\<bullet>pi')" by (simp add: perm_app)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   411
  also have "\<dots> = ?RHS" by (simp add: itfun'_equiv[OF f, OF c])
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   412
  finally show "?LHS = ?RHS" by simp
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   413
qed
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   414
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   415
lemma itfun'_finite_supp:
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   416
  assumes f: "finite ((supp (f1,f2,f3))::name set)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   417
  and     c: "\<exists>(a::name). a\<sharp>f3 \<and> (\<forall>(y::'a::pt_name). a\<sharp>f3 a y)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   418
  shows "finite ((supp (itfun' f1 f2 f3 t))::name set)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   419
  using f by (finite_guess add: itfun'_equiv[OF f, OF c] supp_prod fs_name1)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   420
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   421
lemma itfun'_prm:
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   422
  assumes f: "finite ((supp (f1,f2,f3))::name set)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   423
  and     c: "\<exists>(a::name). a\<sharp>f3 \<and> (\<forall>(y::'a::pt_name). a\<sharp>f3 a y)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   424
  shows "itfun' f1 f2 f3 (pi1\<bullet>t) pi2 = itfun' f1 f2 f3 t (pi2@pi1)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   425
apply(auto simp add: itfun'_def)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   426
apply(subgoal_tac "\<exists>y. (t,y) \<in> it f1 f2 f3")(*A*)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   427
apply(auto)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   428
apply(rule_tac a="y" in theI2')
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   429
apply(assumption)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   430
apply(rule it_function[OF f, OF c])
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   431
apply(rule_tac a="\<lambda>pi2. y (pi2@pi1)" in theI2')
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   432
apply(rule it_perm)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   433
apply(rule f, rule c)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   434
apply(assumption)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   435
apply(rule it_function[OF f, OF c])
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   436
apply(simp)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   437
(*A*)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   438
apply(rule it_total)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   439
done
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   440
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   441
lemma itfun_Var:
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   442
  assumes f: "finite ((supp (f1,f2,f3))::name set)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   443
  and     c: "\<exists>(a::name). a\<sharp>f3 \<and> (\<forall>(y::'a::pt_name). a\<sharp>f3 a y)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   444
  shows "itfun f1 f2 f3 (Var c) = (f1 c)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   445
apply(auto simp add: itfun_def itfun'_def)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   446
apply(subgoal_tac "(THE y. (Var c, y) \<in> it f1 f2 f3) = (\<lambda>(pi::name prm). f1 (pi\<bullet>c))")(*A*)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   447
apply(simp)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   448
apply(rule the1_equality)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   449
apply(rule it_function[OF f, OF c])
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   450
apply(rule it.intros)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   451
done
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   452
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   453
lemma itfun_App:
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   454
  assumes f: "finite ((supp (f1,f2,f3))::name set)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   455
  and     c: "\<exists>(a::name). a\<sharp>f3 \<and> (\<forall>(y::'a::pt_name). a\<sharp>f3 a y)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   456
  shows "itfun f1 f2 f3 (App t1 t2) = (f2 (itfun f1 f2 f3 t1) (itfun f1 f2 f3 t2))"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   457
apply(auto simp add: itfun_def itfun'_def)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   458
apply(subgoal_tac "(THE y. (App t1 t2, y) \<in> it f1 f2 f3) = 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   459
      (\<lambda>(pi::name prm). f2 ((itfun' f1 f2 f3 t1) pi) ((itfun' f1 f2 f3 t2) pi))")(*A*)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   460
apply(simp add: itfun'_def)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   461
apply(rule the1_equality)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   462
apply(rule it_function[OF f, OF c])
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   463
apply(rule it.intros)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   464
apply(subgoal_tac "\<exists>y. (t1,y) \<in> it f1 f2 f3")(*A*)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   465
apply(erule exE, simp add: itfun'_def)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   466
apply(rule_tac a="y" in theI2')
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   467
apply(assumption)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   468
apply(rule it_function[OF f, OF c])
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   469
apply(assumption)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   470
(*A*)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   471
apply(rule it_total)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   472
apply(subgoal_tac "\<exists>y. (t2,y) \<in> it f1 f2 f3")(*B*)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   473
apply(auto simp add: itfun'_def)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   474
apply(rule_tac a="y" in theI2')
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   475
apply(assumption)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   476
apply(rule it_function[OF f, OF c])
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   477
apply(assumption)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   478
(*B*)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   479
apply(rule it_total)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   480
done 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   481
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   482
lemma itfun_Lam_aux1:
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   483
  assumes f: "finite ((supp (f1,f2,f3))::name set)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   484
  and     c: "\<exists>(a::name). a\<sharp>f3 \<and> (\<forall>(y::'a::pt_name). a\<sharp>f3 a y)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   485
  shows "itfun f1 f2 f3 (Lam [a].t) = fresh_fun (\<lambda>a'. f3 a' (itfun' f1 f2 f3 t ([]@[(a,a')])))"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   486
apply(simp add: itfun_def itfun'_def)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   487
apply(subgoal_tac "(THE y. (Lam [a].t, y) \<in> it f1 f2 f3) = 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   488
        (\<lambda>(pi::name prm). fresh_fun(\<lambda>a'. f3 a' ((itfun' f1 f2 f3 t) (pi@[(a,a')]))))")(*A*)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   489
apply(simp add: itfun'_def[symmetric])
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   490
apply(rule the1_equality)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   491
apply(rule it_function[OF f, OF c])
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   492
apply(rule it.intros)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   493
apply(subgoal_tac "\<exists>y. (t,y) \<in> it f1 f2 f3")(*B*)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   494
apply(erule exE, simp add: itfun'_def)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   495
apply(rule_tac a="y" in theI2')
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   496
apply(assumption)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   497
apply(rule it_function[OF f, OF c])
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   498
apply(assumption)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   499
(*B*)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   500
apply(rule it_total)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   501
done
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   502
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   503
lemma itfun_Lam_aux2:
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   504
  assumes f: "finite ((supp (f1,f2,f3))::name set)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   505
  and     c: "\<exists>(a::name). a\<sharp>f3 \<and> (\<forall>(y::'a::pt_name). a\<sharp>f3 a y)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   506
  and     a: "b\<sharp>(a,t,f1,f2,f3)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   507
  shows "itfun f1 f2 f3 (Lam [b].([(b,a)]\<bullet>t)) = f3 b (itfun f1 f2 f3 ([(a,b)]\<bullet>t))"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   508
proof -
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   509
  from f have f': "finite ((supp f3)::name set)" by (simp add: supp_prod)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   510
  have eq1: "itfun f1 f2 f3 (Lam [b].([(b,a)]\<bullet>t)) = itfun f1 f2 f3 (Lam [a].t)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   511
  proof -
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   512
    have "Lam [b].([(b,a)]\<bullet>t) = Lam [a].t" using a
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   513
      by (simp add: lam.inject alpha fresh_prod fresh_atm)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   514
    thus ?thesis by simp
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   515
  qed
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   516
  let ?g = "(\<lambda>a'. f3 a' (itfun' f1 f2 f3 t ([]@[(a,a')])))"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   517
  (* FIXME: cleanup*)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   518
  have a0: "((supp (f1,f3,f2,t,a))::name set) supports ?g"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   519
    by (supports_simp add: itfun'_equiv_aux[OF f, OF c] perm_append)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   520
  have a1: "finite ((supp (f1,f3,f2,t,a))::name set)" using f
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   521
    by (simp add: supp_prod fs_name1)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   522
  have a2: "finite ((supp ?g)::name set)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   523
    using f by (finite_guess add: itfun'_equiv_aux[OF f, OF c] supp_prod fs_name1)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   524
  have c0: "finite ((supp (itfun' f1 f2 f3 t))::name set)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   525
    by (rule itfun'_finite_supp[OF f, OF c])
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   526
  have c1: "\<exists>(a''::name). a''\<sharp>?g \<and> a''\<sharp>(?g a'')"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   527
    by (rule f3_freshness_conditions_simple[OF f', OF c0, OF c])
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   528
  have c2: "b\<sharp>?g"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   529
  proof -
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   530
    have fs_g: "finite ((supp (f1,f2,f3,t))::name set)" using f
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   531
      by (simp add: supp_prod fs_name1)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   532
    have "((supp (f1,f2,f3,t))::name set) supports (itfun' f1 f2 f3 t)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   533
      by (supports_simp add: itfun'_equiv[OF f, OF c])
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   534
    hence c3: "b\<sharp>(itfun' f1 f2 f3 t)" using fs_g 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   535
    proof(rule supports_fresh, simp add: fresh_def[symmetric])
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   536
      show "b\<sharp>(f1,f2,f3,t)" using a by (simp add: fresh_prod)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   537
    qed
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   538
    show ?thesis using a
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   539
      by (rule_tac supports_fresh[OF a0, OF a1], simp add: fresh_def[symmetric], simp add: fresh_prod)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   540
  qed
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   541
  (* main proof *)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   542
  have "itfun f1 f2 f3 (Lam [b].([(b,a)]\<bullet>t)) = itfun f1 f2 f3 (Lam [a].t)" by (simp add: eq1)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   543
  also have "\<dots> = fresh_fun ?g" by (rule itfun_Lam_aux1[OF f, OF c])
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   544
  also have "\<dots> = ?g b" using c2
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   545
    by (rule fresh_fun_app[OF pt_name_inst, OF at_name_inst, OF a2, OF c1])
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   546
  also have "\<dots> = f3 b (itfun f1 f2 f3 ([(a,b)]\<bullet>t))"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   547
    by (simp add: itfun_def itfun'_prm[OF f, OF c]) 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   548
  finally show "itfun f1 f2 f3 (Lam [b].([(b,a)]\<bullet>t)) = f3 b (itfun f1 f2 f3 ([(a,b)]\<bullet>t))" by simp 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   549
qed
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   550
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   551
lemma itfun_Lam:
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   552
  assumes f: "finite ((supp (f1,f2,f3))::name set)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   553
  and     c: "\<exists>(a::name). a\<sharp>f3 \<and> (\<forall>(y::'a::pt_name). a\<sharp>f3 a y)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   554
  and     a: "b\<sharp>(f1,f2,f3)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   555
  shows "itfun f1 f2 f3 (Lam [b].t) = f3 b (itfun f1 f2 f3 t)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   556
proof -
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   557
  have "\<exists>(a::name). a\<sharp>(b,t)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   558
    by (rule at_exists_fresh[OF at_name_inst], simp add: supp_prod fs_name1)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   559
  then obtain a::"name" where a1: "a\<sharp>b" and a2: "a\<sharp>t" by (force simp add: fresh_prod)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   560
  have "itfun f1 f2 f3 (Lam [b].t) = itfun f1 f2 f3 (Lam [b].(([(b,a)])\<bullet>([(b,a)]\<bullet>t)))"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   561
    by (simp add: pt_swap_bij[OF pt_name_inst, OF at_name_inst])
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   562
  also have "\<dots> = f3 b (itfun f1 f2 f3 (([(a,b)])\<bullet>([(b,a)]\<bullet>t)))" 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   563
  proof(rule itfun_Lam_aux2[OF f, OF c])
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   564
    have "b\<sharp>([(b,a)]\<bullet>t)" using a1 a2
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   565
      by (simp add: pt_fresh_left[OF pt_name_inst, OF at_name_inst] at_calc[OF at_name_inst] 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   566
        at_fresh[OF at_name_inst])
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   567
    thus "b\<sharp>(a,[(b,a)]\<bullet>t,f1,f2,f3)" using a a1 by (force simp add: fresh_prod at_fresh[OF at_name_inst])
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   568
  qed
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   569
  also have "\<dots> = f3 b (itfun f1 f2 f3 t)" by (simp add: pt_swap_bij'[OF pt_name_inst, OF at_name_inst])
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   570
  finally show ?thesis .
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   571
qed
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   572
  
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   573
constdefs 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   574
  depth_Var :: "name \<Rightarrow> nat"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   575
  "depth_Var \<equiv> \<lambda>(a::name). 1"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   576
  
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   577
  depth_App :: "nat \<Rightarrow> nat \<Rightarrow> nat"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   578
  "depth_App \<equiv> \<lambda>n1 n2. (max n1 n2)+1"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   579
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   580
  depth_Lam :: "name \<Rightarrow> nat \<Rightarrow> nat"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   581
  "depth_Lam \<equiv> \<lambda>(a::name) n. n+1"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   582
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   583
  depth_lam :: "lam \<Rightarrow> nat"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   584
  "depth_lam \<equiv> itfun depth_Var depth_App depth_Lam"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   585
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   586
lemma supp_depth_Var:
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   587
  shows "((supp depth_Var)::name set)={}"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   588
  apply(simp add: depth_Var_def)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   589
  apply(simp add: supp_def)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   590
  apply(simp add: perm_fun_def)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   591
  apply(simp add: perm_nat_def)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   592
  done
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   593
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   594
lemma supp_depth_App:
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   595
  shows "((supp depth_App)::name set)={}"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   596
  apply(simp add: depth_App_def)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   597
  apply(simp add: supp_def)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   598
  apply(simp add: perm_fun_def)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   599
  apply(simp add: perm_nat_def)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   600
  done
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   601
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   602
lemma supp_depth_Lam:
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   603
  shows "((supp depth_Lam)::name set)={}"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   604
  apply(simp add: depth_Lam_def)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   605
  apply(simp add: supp_def)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   606
  apply(simp add: perm_fun_def)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   607
  apply(simp add: perm_nat_def)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   608
  done
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   609
 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   610
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   611
lemma fin_supp_depth:
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   612
  shows "finite ((supp (depth_Var,depth_App,depth_Lam))::name set)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   613
  using supp_depth_Var supp_depth_Lam supp_depth_App
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   614
by (simp add: supp_prod)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   615
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   616
lemma fresh_depth_Lam:
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   617
  shows "\<exists>(a::name). a\<sharp>depth_Lam \<and> (\<forall>n. a\<sharp>depth_Lam a n)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   618
apply(rule exI)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   619
apply(rule conjI)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   620
apply(simp add: fresh_def)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   621
apply(force simp add: supp_depth_Lam)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   622
apply(unfold fresh_def)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   623
apply(simp add: supp_def)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   624
apply(simp add: perm_nat_def)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   625
done
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   626
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   627
lemma depth_Var:
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   628
  shows "depth_lam (Var c) = 1"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   629
apply(simp add: depth_lam_def)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   630
apply(simp add: itfun_Var[OF fin_supp_depth, OF fresh_depth_Lam])
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   631
apply(simp add: depth_Var_def)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   632
done
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   633
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   634
lemma depth_App:
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   635
  shows "depth_lam (App t1 t2) = (max (depth_lam t1) (depth_lam t2))+1"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   636
apply(simp add: depth_lam_def)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   637
apply(simp add: itfun_App[OF fin_supp_depth, OF fresh_depth_Lam])
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   638
apply(simp add: depth_App_def)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   639
done
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   640
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   641
lemma depth_Lam:
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   642
  shows "depth_lam (Lam [a].t) = (depth_lam t)+1"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   643
apply(simp add: depth_lam_def)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   644
apply(rule trans)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   645
apply(rule itfun_Lam[OF fin_supp_depth, OF fresh_depth_Lam])
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   646
apply(simp add: fresh_def supp_prod supp_depth_Var supp_depth_App supp_depth_Lam)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   647
apply(simp add: depth_Lam_def)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   648
done
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   649
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   650
text {* substitution *}
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   651
constdefs 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   652
  subst_Var :: "name \<Rightarrow>lam \<Rightarrow> name \<Rightarrow> lam"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   653
  "subst_Var b t \<equiv> \<lambda>a. (if a=b then t else (Var a))"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   654
  
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   655
  subst_App :: "name \<Rightarrow> lam \<Rightarrow> lam \<Rightarrow> lam \<Rightarrow> lam"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   656
  "subst_App b t \<equiv> \<lambda>r1 r2. App r1 r2"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   657
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   658
  subst_Lam :: "name \<Rightarrow> lam \<Rightarrow> name \<Rightarrow> lam \<Rightarrow> lam"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   659
  "subst_Lam b t \<equiv> \<lambda>a r. Lam [a].r"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   660
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   661
  subst_lam :: "name \<Rightarrow> lam \<Rightarrow> lam \<Rightarrow> lam"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   662
  "subst_lam b t \<equiv> itfun (subst_Var b t) (subst_App b t) (subst_Lam b t)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   663
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   664
lemma supports_subst_Var:
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   665
  shows "((supp (b,t))::name set) supports (subst_Var b t)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   666
apply(supports_simp add: subst_Var_def)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   667
apply(rule impI)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   668
apply(drule pt_bij1[OF pt_name_inst, OF at_name_inst])
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   669
apply(simp add: pt_fresh_fresh[OF pt_name_inst, OF at_name_inst])
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   670
done
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   671
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   672
lemma supports_subst_App:
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   673
  shows "((supp (b,t))::name set) supports subst_App b t"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   674
by  (supports_simp add: subst_App_def)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   675
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   676
lemma supports_subst_Lam:
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   677
  shows "((supp (b,t))::name set) supports subst_Lam b t"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   678
  by (supports_simp add: subst_Lam_def)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   679
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   680
lemma fin_supp_subst:
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   681
  shows "finite ((supp (subst_Var b t,subst_App b t,subst_Lam b t))::name set)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   682
apply(auto simp add: supp_prod)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   683
apply(rule supports_finite)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   684
apply(rule supports_subst_Var)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   685
apply(simp add: fs_name1)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   686
apply(rule supports_finite)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   687
apply(rule supports_subst_App)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   688
apply(simp add: fs_name1)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   689
apply(rule supports_finite)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   690
apply(rule supports_subst_Lam)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   691
apply(simp add: fs_name1)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   692
done
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   693
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   694
lemma fresh_subst_Lam:
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   695
  shows "\<exists>(a::name). a\<sharp>(subst_Lam b t)\<and> (\<forall>y. a\<sharp>(subst_Lam b t) a y)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   696
apply(subgoal_tac "\<exists>(c::name). c\<sharp>(b,t)")
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   697
apply(auto)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   698
apply(rule_tac x="c" in exI)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   699
apply(auto)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   700
apply(rule supports_fresh)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   701
apply(rule supports_subst_Lam)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   702
apply(simp_all add: fresh_def[symmetric] fs_name1)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   703
apply(simp add: subst_Lam_def)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   704
apply(simp add: abs_fresh)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   705
apply(rule at_exists_fresh[OF at_name_inst])
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   706
apply(simp add: fs_name1)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   707
done
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   708
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   709
lemma subst_Var:
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   710
  shows "subst_lam b t (Var a) = (if a=b then t else (Var a))"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   711
apply(simp add: subst_lam_def)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   712
apply(auto simp add: itfun_Var[OF fin_supp_subst, OF fresh_subst_Lam])
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   713
apply(auto simp add: subst_Var_def)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   714
done
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   715
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   716
lemma subst_App:
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   717
  shows "subst_lam b t (App t1 t2) = App (subst_lam b t t1) (subst_lam b t t2)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   718
apply(simp add: subst_lam_def)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   719
apply(auto simp add: itfun_App[OF fin_supp_subst, OF fresh_subst_Lam])
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   720
apply(auto simp add: subst_App_def)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   721
done
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   722
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   723
lemma subst_Lam:
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   724
  assumes a: "a\<sharp>(b,t)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   725
  shows "subst_lam b t (Lam [a].t1) = Lam [a].(subst_lam b t t1)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   726
using a
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   727
apply(simp add: subst_lam_def)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   728
apply(subgoal_tac "a\<sharp>(subst_Var b t,subst_App b t,subst_Lam b t)")
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   729
apply(auto simp add: itfun_Lam[OF fin_supp_subst, OF fresh_subst_Lam])
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   730
apply(simp (no_asm) add: subst_Lam_def)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   731
apply(auto simp add: fresh_prod)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   732
apply(rule supports_fresh)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   733
apply(rule supports_subst_Var)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   734
apply(simp_all add: fs_name1 fresh_def[symmetric] fresh_prod)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   735
apply(rule supports_fresh)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   736
apply(rule supports_subst_App)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   737
apply(simp_all add: fs_name1 fresh_def[symmetric] fresh_prod)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   738
apply(rule supports_fresh)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   739
apply(rule supports_subst_Lam)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   740
apply(simp_all add: fs_name1 fresh_def[symmetric] fresh_prod)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   741
done
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   742
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   743
lemma subst_Lam':
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   744
  assumes a: "a\<noteq>b"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   745
  and     b: "a\<sharp>t"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   746
  shows "subst_lam b t (Lam [a].t1) = Lam [a].(subst_lam b t t1)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   747
apply(rule subst_Lam)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   748
apply(simp add: fresh_prod a b fresh_atm)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   749
done
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   750
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   751
lemma subst_Lam'':
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   752
  assumes a: "a\<sharp>b"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   753
  and     b: "a\<sharp>t"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   754
  shows "subst_lam b t (Lam [a].t1) = Lam [a].(subst_lam b t t1)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   755
apply(rule subst_Lam)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   756
apply(simp add: fresh_prod a b)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   757
done
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   758
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   759
consts
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   760
  subst_syn  :: "lam \<Rightarrow> name \<Rightarrow> lam \<Rightarrow> lam" ("_[_::=_]" [100,100,100] 900)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   761
translations 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   762
  "t1[a::=t2]" \<rightleftharpoons> "subst_lam a t2 t1"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   763
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   764
declare subst_Var[simp]
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   765
declare subst_App[simp]
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   766
declare subst_Lam[simp]
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   767
declare subst_Lam'[simp]
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   768
declare subst_Lam''[simp]
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   769
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   770
lemma subst_eqvt[simp]:
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   771
  fixes pi:: "name prm"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   772
  and   t1:: "lam"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   773
  and   t2:: "lam"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   774
  and   a :: "name"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   775
  shows "pi\<bullet>(t1[b::=t2]) = (pi\<bullet>t1)[(pi\<bullet>b)::=(pi\<bullet>t2)]"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   776
apply(nominal_induct t1 avoiding: b t2 rule: lam.induct)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   777
apply(auto simp add: perm_bij fresh_prod fresh_atm)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   778
apply(subgoal_tac "(pi\<bullet>name)\<sharp>(pi\<bullet>b,pi\<bullet>t2)")(*A*)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   779
apply(simp)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   780
(*A*) 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   781
apply(simp add: perm_bij fresh_prod fresh_atm pt_fresh_bij[OF pt_name_inst, OF at_name_inst]) 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   782
done
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   783
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   784
lemma subst_supp: "supp(t1[a::=t2])\<subseteq>(((supp(t1)-{a})\<union>supp(t2))::name set)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   785
apply(nominal_induct t1 avoiding: a t2 rule: lam.induct)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   786
apply(auto simp add: lam.supp supp_atm fresh_prod abs_supp)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   787
apply(blast)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   788
apply(blast)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   789
done
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   790
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   791
end