src/HOL/Nominal/Examples/Iteration.thy
author urbanc
Wed, 08 Mar 2006 17:55:51 +0100
changeset 19217 5caacd449ea4
parent 19171 17b952ec5641
child 19225 a23af144eb47
permissions -rw-r--r--
tuned some 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
  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
   146
    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
   147
  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
   148
  proof 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   149
    fix pi::"name prm"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   150
    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
   151
      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
   152
  qed
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   153
  show ?case using fact1 fact2 ih f
19217
5caacd449ea4 tuned some proofs
urbanc
parents: 19171
diff changeset
   154
    by (finite_guess add: fresh_fun_eqvt perm_append supp_prod fs_name1)
19157
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   155
qed 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   156
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   157
lemma it_trans: 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   158
  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
   159
19158
3cca1e0a2a79 some minor tuning on the proofs
urbanc
parents: 19157
diff changeset
   160
lemma it_perm_aux:
19157
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   161
  assumes f: "finite ((supp (f1,f2,f3))::name set)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   162
  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
   163
  and     a: "(t,y) \<in> it f1 f2 f3"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   164
  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
   165
using a
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   166
proof (induct)
19158
3cca1e0a2a79 some minor tuning on the proofs
urbanc
parents: 19157
diff changeset
   167
  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
   168
next
19158
3cca1e0a2a79 some minor tuning on the proofs
urbanc
parents: 19157
diff changeset
   169
  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
   170
next
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   171
  case (it3 c r t)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   172
  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
   173
  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
   174
  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
   175
  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
   176
  have ih: "(pi1\<bullet>t,\<lambda>pi2. r (pi2@pi1)) \<in> it f1 f2 f3" by fact
19168
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   177
  hence "(Lam [(pi1\<bullet>c)].(pi1\<bullet>t),\<lambda>pi'. fresh_fun (?g pi')) \<in> it f1 f2 f3"
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   178
    by (auto intro: it_trans it.intros) 
19157
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   179
  moreover
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   180
  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
   181
  proof 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   182
    fix pi'::"name prm"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   183
    have fin_g: "finite ((supp (?g pi'))::name set)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   184
      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
   185
    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
   186
      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
   187
    have fin_h: "finite ((supp (?h pi'))::name set)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   188
      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
   189
    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
   190
      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
   191
    show "fresh_fun (?g pi') = fresh_fun (?h pi')" 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   192
    proof -
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   193
      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
   194
	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
   195
      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
   196
	by (auto simp only: fresh_prod fresh_list_rev)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   197
      have "?g pi' d = ?h pi' d" 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   198
      proof -
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   199
	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
   200
	  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
   201
              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
   202
	then show ?thesis by simp
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   203
      qed
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   204
      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
   205
	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
   206
	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
   207
    qed
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   208
  qed
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   209
  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
   210
  ultimately show ?case by simp
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   211
qed
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   212
19158
3cca1e0a2a79 some minor tuning on the proofs
urbanc
parents: 19157
diff changeset
   213
lemma it_perm:
19157
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   214
  assumes f: "finite ((supp (f1,f2,f3))::name set)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   215
  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
   216
  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
   217
  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
   218
proof - 
19217
5caacd449ea4 tuned some proofs
urbanc
parents: 19171
diff changeset
   219
  from a have "((rev pi)\<bullet>(pi\<bullet>t),\<lambda>pi2. y (pi2@(rev pi))) \<in> it f1 f2 f3" 
5caacd449ea4 tuned some proofs
urbanc
parents: 19171
diff changeset
   220
    using f c by (simp add: it_perm_aux)
19157
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   221
  thus ?thesis by perm_simp
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   222
qed
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   223
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   224
lemma it_unique:
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   225
  assumes f: "finite ((supp (f1,f2,f3))::name set)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   226
  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
   227
  and     a: "(t,y) \<in> it f1 f2 f3"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   228
  and     b: "(t,y') \<in> it f1 f2 f3"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   229
  shows "y pi = y' pi"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   230
using a b
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   231
proof (induct fixing: y' pi)
19158
3cca1e0a2a79 some minor tuning on the proofs
urbanc
parents: 19157
diff changeset
   232
  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
   233
next
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   234
  case (it2 r1 r2 t1 t2)
19158
3cca1e0a2a79 some minor tuning on the proofs
urbanc
parents: 19157
diff changeset
   235
  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
   236
    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
   237
next
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   238
  case (it3 c r t r')
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   239
  have "(t,r) \<in> it f1 f2 f3" by fact
19158
3cca1e0a2a79 some minor tuning on the proofs
urbanc
parents: 19157
diff changeset
   240
  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
   241
  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
   242
  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
   243
  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
   244
  proof (cases, auto simp add: lam.inject)
19157
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   245
    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
   246
    assume i5: "[c].t = [a].t'"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   247
    and    i6: "(t',r'') \<in> it f1 f2 f3"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   248
    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
   249
    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
   250
    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
   251
    show "fresh_fun ?g = fresh_fun ?h" using i5
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   252
    proof (cases "a=c")
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   253
      case True
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   254
      have i7: "a=c" by fact
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   255
      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
   256
      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
   257
    next
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   258
      case False
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   259
      assume i9: "a\<noteq>c"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   260
      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
   261
      have fin_g: "finite ((supp ?g)::name set)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   262
	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
   263
      have fin_h: "finite ((supp ?h)::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 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
   266
	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
   267
      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
   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 "\<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
   270
	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
   271
      then obtain d::"name" 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   272
	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
   273
	by (force simp add: fresh_prod fresh_atm)
19157
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   274
      have g1: "[(a,d)]\<bullet>t = t" 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   275
	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
   276
      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
   277
      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
   278
	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
   279
      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
   280
      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
   281
      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
   282
	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
   283
            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
   284
      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
   285
	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
   286
      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
   287
      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
   288
      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
   289
      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
   290
	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
   291
      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
   292
    qed
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   293
  qed
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
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   296
lemma it_function:
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   297
  assumes f: "finite ((supp (f1,f2,f3))::name set)"
19158
3cca1e0a2a79 some minor tuning on the proofs
urbanc
parents: 19157
diff changeset
   298
  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
   299
  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
   300
proof (rule ex_ex1I)
19158
3cca1e0a2a79 some minor tuning on the proofs
urbanc
parents: 19157
diff changeset
   301
  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
   302
next
19158
3cca1e0a2a79 some minor tuning on the proofs
urbanc
parents: 19157
diff changeset
   303
  case (goal2 r1 r2)
3cca1e0a2a79 some minor tuning on the proofs
urbanc
parents: 19157
diff changeset
   304
  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
   305
  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
   306
  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
   307
qed
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   308
  
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   309
lemma it_eqvt:
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   310
  fixes pi::"name prm"
19158
3cca1e0a2a79 some minor tuning on the proofs
urbanc
parents: 19157
diff changeset
   311
  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
   312
  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
   313
  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
   314
  shows "(pi\<bullet>t,pi\<bullet>r) \<in> it (pi\<bullet>f1) (pi\<bullet>f2) (pi\<bullet>f3)"
19217
5caacd449ea4 tuned some proofs
urbanc
parents: 19171
diff changeset
   315
using a proof(induct)
19157
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   316
  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
   317
next
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   318
  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
   319
next
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   320
  case (it3 c r t) (* lam case *)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   321
  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
   322
  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
   323
  have "(t,r) \<in> it f1 f2 f3" by fact
19158
3cca1e0a2a79 some minor tuning on the proofs
urbanc
parents: 19157
diff changeset
   324
  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
   325
  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
   326
  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
   327
  moreover 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   328
  have "?g = ?h"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   329
  proof -
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   330
    let ?g' = "\<lambda>pi a'. f3 a' (r (pi@[(c,a')]))"
19158
3cca1e0a2a79 some minor tuning on the proofs
urbanc
parents: 19157
diff changeset
   331
    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
   332
      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
   333
    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
   334
    proof 
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   335
      fix pi::"name prm"
19158
3cca1e0a2a79 some minor tuning on the proofs
urbanc
parents: 19157
diff changeset
   336
      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
   337
	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
   338
    qed
19158
3cca1e0a2a79 some minor tuning on the proofs
urbanc
parents: 19157
diff changeset
   339
    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
   340
  qed
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   341
  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
   342
qed
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   343
19168
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   344
lemma the1_equality': 
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   345
  assumes a: "\<exists>!r. P r"
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   346
  and     b: "P b" 
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   347
  and     c: "b y = a"
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   348
  shows "(THE r. P r) y = a"
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   349
apply(simp add: c[symmetric])
19217
5caacd449ea4 tuned some proofs
urbanc
parents: 19171
diff changeset
   350
apply(rule fun_cong[OF the1_equality, OF a, OF b])
19157
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   351
done
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   352
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   353
lemma itfun'_prm:
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   354
  assumes f: "finite ((supp (f1,f2,f3))::name set)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   355
  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
   356
  shows "itfun' f1 f2 f3 (pi1\<bullet>t) pi2 = itfun' f1 f2 f3 t (pi2@pi1)"
19168
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   357
apply(auto simp add: itfun_def itfun'_def)
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   358
apply(rule the1_equality'[OF it_function, OF f, OF c])
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   359
apply(rule it_perm_aux[OF f, OF c])
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   360
apply(rule theI'[OF it_function,OF f, OF c])
19157
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   361
apply(simp)
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   362
done
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   363
19168
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   364
lemma itfun'_eqvt:
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   365
  fixes pi1::"name prm"
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   366
  assumes f: "finite ((supp (f1,f2,f3))::name set)"
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   367
  and     c: "\<exists>(a::name). a\<sharp>f3 \<and> (\<forall>(y::'a::pt_name). a\<sharp>f3 a y)"
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   368
  shows "pi1\<bullet>(itfun' f1 f2 f3 t pi2) = itfun' (pi1\<bullet>f1) (pi1\<bullet>f2) (pi1\<bullet>f3) (pi1\<bullet>t) (pi1\<bullet>pi2)"
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   369
proof -
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   370
  have f_pi: "finite ((supp (pi1\<bullet>f1,pi1\<bullet>f2,pi1\<bullet>f3))::name set)" using f
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   371
    (* FIXME: check why proof (finite_guess_debug add: perm_append fs_name1) does not work *)
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   372
    by (simp add: supp_prod pt_supp_finite_pi[OF pt_name_inst, OF at_name_inst])
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   373
  have fs_pi: "\<exists>(a::name). a\<sharp>(pi1\<bullet>f3) \<and> (\<forall>(y::'a::pt_name). a\<sharp>(pi1\<bullet>f3) a y)" 
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   374
  proof -
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   375
    from c obtain a where fs1: "a\<sharp>f3" and fs2: "(\<forall>(y::'a::pt_name). a\<sharp>f3 a y)" by force
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   376
    have "(pi1\<bullet>a)\<sharp>(pi1\<bullet>f3)" using fs1 by (simp add: fresh_eqvt)
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   377
    moreover
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   378
    have "\<forall>(y::'a::pt_name). (pi1\<bullet>a)\<sharp>((pi1\<bullet>f3) (pi1\<bullet>a) y)" 
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   379
    proof
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   380
      fix y::"'a::pt_name"
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   381
      from fs2 have "a\<sharp>f3 a ((rev pi1)\<bullet>y)" by simp
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   382
      then show "(pi1\<bullet>a)\<sharp>((pi1\<bullet>f3) (pi1\<bullet>a) y)"
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   383
	by (perm_simp add: pt_fresh_right[OF pt_name_inst, OF at_name_inst])
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   384
    qed
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   385
    ultimately show "\<exists>(a::name). a\<sharp>(pi1\<bullet>f3) \<and> (\<forall>(y::'a::pt_name). a\<sharp>(pi1\<bullet>f3) a y)" by blast
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   386
  qed
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   387
  show ?thesis
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   388
    apply(rule sym)
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   389
    apply(auto simp add: itfun_def itfun'_def)
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   390
    apply(rule the1_equality'[OF it_function, OF f_pi, OF fs_pi])
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   391
    apply(rule it_eqvt[OF f, OF c])
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   392
    apply(rule theI'[OF it_function,OF f, OF c])
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   393
    apply(rule sym)
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   394
    apply(rule pt_bij2[OF pt_name_inst, OF at_name_inst])
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   395
    apply(perm_simp)
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   396
    done
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   397
qed
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   398
19157
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   399
lemma itfun_Var:
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   400
  assumes f: "finite ((supp (f1,f2,f3))::name set)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   401
  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
   402
  shows "itfun f1 f2 f3 (Var c) = (f1 c)"
19168
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   403
using f c by (auto intro!: the1_equality' it_function it.intros simp add: itfun_def itfun'_def)
19157
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   404
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   405
lemma itfun_App:
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 "itfun f1 f2 f3 (App t1 t2) = (f2 (itfun f1 f2 f3 t1) (itfun f1 f2 f3 t2))"
19168
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   409
by (auto intro!: the1_equality' it_function[OF f, OF c] it.intros 
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   410
         intro: theI'[OF it_function, OF f, OF c] simp add: itfun_def itfun'_def)
19157
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   411
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   412
lemma itfun_Lam_aux1:
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   413
  assumes f: "finite ((supp (f1,f2,f3))::name set)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   414
  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
   415
  shows "itfun f1 f2 f3 (Lam [a].t) = fresh_fun (\<lambda>a'. f3 a' (itfun' f1 f2 f3 t ([]@[(a,a')])))"
19168
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   416
by (auto intro!: the1_equality' it_function[OF f, OF c] it.intros 
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   417
         intro: theI'[OF it_function, OF f, OF c] simp add: itfun_def itfun'_def)
19157
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   418
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   419
lemma itfun_Lam_aux2:
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   420
  assumes f: "finite ((supp (f1,f2,f3))::name set)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   421
  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
   422
  and     a: "b\<sharp>(a,t,f1,f2,f3)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   423
  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
   424
proof -
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   425
  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
   426
  proof -
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   427
    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
   428
      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
   429
    thus ?thesis by simp
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   430
  qed
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   431
  let ?g = "(\<lambda>a'. f3 a' (itfun' f1 f2 f3 t ([]@[(a,a')])))"
19168
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   432
  have fin_g: "finite ((supp ?g)::name set)" 
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   433
    using f by (finite_guess add: itfun'_eqvt[OF f, OF c] supp_prod fs_name1)
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   434
  have fr_g: "\<exists>(a''::name). a''\<sharp>?g \<and> a''\<sharp>(?g a'')" using f c 
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   435
    by (rule_tac f3_freshness_conditions_simple, auto simp add: supp_prod, 
19217
5caacd449ea4 tuned some proofs
urbanc
parents: 19171
diff changeset
   436
        finite_guess add: itfun'_eqvt[OF f, OF c] supp_prod fs_name1)
19168
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   437
  have fresh_b: "b\<sharp>?g" 
19157
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   438
  proof -
19168
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   439
    have "finite ((supp (a,t,f1,f2,f3))::name set)" using f
19157
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   440
      by (simp add: supp_prod fs_name1)
19168
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   441
    moreover 
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   442
    have "((supp (a,t,f1,f2,f3))::name set) supports ?g"
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   443
      by (supports_simp add: itfun'_eqvt[OF f, OF c] perm_append)
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   444
    ultimately show ?thesis using a
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   445
      by (auto intro!: supports_fresh, simp add: fresh_def)
19157
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   446
  qed
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   447
  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
   448
  also have "\<dots> = fresh_fun ?g" by (rule itfun_Lam_aux1[OF f, OF c])
19168
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   449
  also have "\<dots> = ?g b" using fresh_b fin_g fr_g
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   450
    by (simp add: fresh_fun_app[OF pt_name_inst, OF at_name_inst])
19157
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   451
  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
   452
    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
   453
  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
   454
qed
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   455
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   456
lemma itfun_Lam:
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   457
  assumes f: "finite ((supp (f1,f2,f3))::name set)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   458
  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
   459
  and     a: "b\<sharp>(f1,f2,f3)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   460
  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
   461
proof -
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   462
  have "\<exists>(a::name). a\<sharp>(b,t)"
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   463
    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
   464
  then obtain a::"name" where a1: "a\<sharp>b" and a2: "a\<sharp>t" by (force simp add: fresh_prod)
19168
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   465
  have fresh_b: "b\<sharp>(a,[(b,a)]\<bullet>t,f1,f2,f3)" using a a1 a2
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   466
    by (simp add: fresh_prod fresh_atm fresh_left calc_atm)
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   467
  have "itfun f1 f2 f3 (Lam [b].t) = itfun f1 f2 f3 (Lam [b].(([(b,a)])\<bullet>([(b,a)]\<bullet>t)))" by (perm_simp)
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   468
  also have "\<dots> = f3 b (itfun f1 f2 f3 (([(a,b)])\<bullet>([(b,a)]\<bullet>t)))" using fresh_b
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   469
    by (rule itfun_Lam_aux2[OF f, OF c])
19157
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   470
  also have "\<dots> = f3 b (itfun f1 f2 f3 t)" by (simp add: pt_swap_bij'[OF pt_name_inst, OF at_name_inst])
19168
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   471
  finally show ?thesis by simp
19157
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   472
qed
19168
c8faffc8e6fb streamlined the proof
urbanc
parents: 19158
diff changeset
   473
19157
6e4ce7402dbe initial commit (especially 2nd half needs to be cleaned up)
urbanc
parents:
diff changeset
   474
end