src/HOL/Nominal/Examples/Crary.thy
changeset 22231 f76f187c91f9
parent 22082 b1be13d32efd
child 22418 49e2d9744ae1
equal deleted inserted replaced
22230:bdec4a82f385 22231:f76f187c91f9
   100   valid :: "(name \<times> 'a::pt_name) list \<Rightarrow> bool"
   100   valid :: "(name \<times> 'a::pt_name) list \<Rightarrow> bool"
   101 where
   101 where
   102     v_nil[intro]:  "valid []"
   102     v_nil[intro]:  "valid []"
   103   | v_cons[intro]: "\<lbrakk>valid \<Gamma>;a\<sharp>\<Gamma>\<rbrakk> \<Longrightarrow> valid ((a,\<sigma>)#\<Gamma>)"
   103   | v_cons[intro]: "\<lbrakk>valid \<Gamma>;a\<sharp>\<Gamma>\<rbrakk> \<Longrightarrow> valid ((a,\<sigma>)#\<Gamma>)"
   104 
   104 
   105 lemma valid_eqvt:
   105 lemma valid_eqvt[eqvt]:
   106   fixes   pi:: "name prm"
   106   fixes   pi:: "name prm"
   107   assumes a: "valid \<Gamma>"
   107   assumes a: "valid \<Gamma>"
   108   shows "valid (pi\<bullet>\<Gamma>)"
   108   shows "valid (pi\<bullet>\<Gamma>)"
   109   using a
   109   using a
   110   by (induct) (auto simp add: fresh_bij)
   110   by (induct) (auto simp add: fresh_bij)
   127   assumes "\<Gamma> \<turnstile> t : T"
   127   assumes "\<Gamma> \<turnstile> t : T"
   128   shows "valid \<Gamma>"
   128   shows "valid \<Gamma>"
   129   using assms
   129   using assms
   130   by (induct) (auto)
   130   by (induct) (auto)
   131  
   131  
   132 lemma typing_eqvt :
   132 lemma typing_eqvt[eqvt]:
   133   fixes pi::"name prm"
   133   fixes pi::"name prm"
   134   assumes "\<Gamma> \<turnstile> t : T"
   134   assumes "\<Gamma> \<turnstile> t : T"
   135   shows "(pi\<bullet>\<Gamma>) \<turnstile> (pi\<bullet>t) : T"
   135   shows "(pi\<bullet>\<Gamma>) \<turnstile> (pi\<bullet>t) : (pi\<bullet>T)"
   136   using assms
   136   using assms
   137   apply(induct)
   137   apply(induct)
   138   apply(auto simp add: fresh_bij set_eqvt valid_eqvt) 
   138   apply(auto simp add: fresh_bij set_eqvt valid_eqvt) 
   139   apply(rule t_Var)
   139   apply(rule t_Var)
   140   apply(drule valid_eqvt)
   140   apply(drule valid_eqvt)
   161   [consumes 1, case_names t_Var t_App t_Lam t_Const t_Unit]:
   161   [consumes 1, case_names t_Var t_App t_Lam t_Const t_Unit]:
   162     fixes  P::"'a::fs_name \<Rightarrow> (name\<times>ty) list \<Rightarrow> trm \<Rightarrow> ty \<Rightarrow>bool"
   162     fixes  P::"'a::fs_name \<Rightarrow> (name\<times>ty) list \<Rightarrow> trm \<Rightarrow> ty \<Rightarrow>bool"
   163     and    x :: "'a::fs_name"
   163     and    x :: "'a::fs_name"
   164     assumes a: "\<Gamma> \<turnstile> e : T"
   164     assumes a: "\<Gamma> \<turnstile> e : T"
   165     and a1: "\<And>\<Gamma> x T c. \<lbrakk>valid \<Gamma>; (x,T)\<in>set \<Gamma>\<rbrakk> \<Longrightarrow> P c \<Gamma> (Var x) T"
   165     and a1: "\<And>\<Gamma> x T c. \<lbrakk>valid \<Gamma>; (x,T)\<in>set \<Gamma>\<rbrakk> \<Longrightarrow> P c \<Gamma> (Var x) T"
   166     and a2: "\<And>\<Gamma> e1 T1 T2 e2 c. 
   166     and a2: "\<And>\<Gamma> e1 T1 T2 e2 c. \<lbrakk>\<And>c. P c \<Gamma> e1 (T1\<rightarrow>T2); \<And>c. P c \<Gamma> e2 T1\<rbrakk> 
   167              \<lbrakk>\<Gamma> \<turnstile> e1 : T1\<rightarrow>T2 ; \<And>c. P c \<Gamma> e1 (T1\<rightarrow>T2); \<Gamma> \<turnstile> e2 : T1 ; \<And>c. P c \<Gamma> e2 T1\<rbrakk> 
       
   168              \<Longrightarrow> P c \<Gamma> (App e1 e2) T2"
   167              \<Longrightarrow> P c \<Gamma> (App e1 e2) T2"
   169     and a3: "\<And>x \<Gamma> T1 t T2 c.
   168     and a3: "\<And>x \<Gamma> T1 t T2 c.\<lbrakk>x\<sharp>(\<Gamma>,c); \<And>c. P c ((x,T1)#\<Gamma>) t T2\<rbrakk>
   170              \<lbrakk>x\<sharp>(\<Gamma>,c); (x,T1)#\<Gamma> \<turnstile> t : T2 ; \<And>c. P c ((x,T1)#\<Gamma>) t T2\<rbrakk>
       
   171              \<Longrightarrow> P c \<Gamma> (Lam [x].t) (T1\<rightarrow>T2)"
   169              \<Longrightarrow> P c \<Gamma> (Lam [x].t) (T1\<rightarrow>T2)"
   172     and a4: "\<And>\<Gamma> n c. valid \<Gamma> \<Longrightarrow> P c \<Gamma> (Const n) TBase"
   170     and a4: "\<And>\<Gamma> n c. valid \<Gamma> \<Longrightarrow> P c \<Gamma> (Const n) TBase"
   173     and a5: "\<And>\<Gamma> c. valid \<Gamma> \<Longrightarrow> P c \<Gamma> Unit TUnit"
   171     and a5: "\<And>\<Gamma> c. valid \<Gamma> \<Longrightarrow> P c \<Gamma> Unit TUnit"
   174     shows "P c \<Gamma> e T"
   172     shows "P c \<Gamma> e T"
   175 proof -
   173 proof -
   176   from a have "\<And>(pi::name prm) c. P c (pi\<bullet>\<Gamma>) (pi\<bullet>e) T"
   174   from a have "\<And>(pi::name prm) c. P c (pi\<bullet>\<Gamma>) (pi\<bullet>e) (pi\<bullet>T)"
   177   proof (induct)
   175   proof (induct)
   178     case (t_Var \<Gamma> x T pi c)
   176     case (t_Var \<Gamma> x T pi c)
   179     have "valid \<Gamma>" by fact
   177     have "valid \<Gamma>" by fact
   180     then have "valid (pi\<bullet>\<Gamma>)" by (simp only: valid_eqvt)
   178     then have "valid (pi\<bullet>\<Gamma>)" by (simp only: eqvt)
   181     moreover
   179     moreover
   182     have "(x,T)\<in>set \<Gamma>" by fact
   180     have "(x,T)\<in>set \<Gamma>" by fact
   183     then have "pi\<bullet>(x,T)\<in>pi\<bullet>(set \<Gamma>)" by (simp only: pt_set_bij[OF pt_name_inst, OF at_name_inst])  
   181     then have "pi\<bullet>(x,T)\<in>pi\<bullet>(set \<Gamma>)" by (simp only: pt_set_bij[OF pt_name_inst, OF at_name_inst])  
   184     then have "(pi\<bullet>x,T)\<in>set (pi\<bullet>\<Gamma>)" by (simp add: set_eqvt)
   182     then have "(pi\<bullet>x,T)\<in>set (pi\<bullet>\<Gamma>)" by (simp add: set_eqvt)
   185     ultimately show "P c (pi\<bullet>\<Gamma>) (pi\<bullet>(Var x)) T" using a1 by simp
   183     ultimately show "P c (pi\<bullet>\<Gamma>) (pi\<bullet>(Var x)) (pi\<bullet>T)" using a1 by simp
   186   next
   184   next
   187     case (t_App \<Gamma> e1 T1 T2 e2 pi c)
   185     case (t_App \<Gamma> e1 T1 T2 e2 pi c)
   188     thus "P c (pi\<bullet>\<Gamma>) (pi\<bullet>(App e1 e2)) T2" using a2 by (simp, blast intro: typing_eqvt)
   186     thus "P c (pi\<bullet>\<Gamma>) (pi\<bullet>(App e1 e2)) (pi\<bullet>T2)" using a2 
       
   187       by (simp only: eqvt) (blast)
   189   next
   188   next
   190     case (t_Lam x \<Gamma> T1 t T2 pi c)
   189     case (t_Lam x \<Gamma> T1 t T2 pi c)
   191     obtain y::"name" where fs: "y\<sharp>(pi\<bullet>x,pi\<bullet>\<Gamma>,pi\<bullet>t,c)" by (erule exists_fresh[OF fs_name1])
   190     obtain y::"name" where fs: "y\<sharp>(pi\<bullet>x,pi\<bullet>\<Gamma>,pi\<bullet>t,c)" by (erule exists_fresh[OF fs_name1])
   192     let ?sw = "[(pi\<bullet>x,y)]"
   191     let ?sw = "[(pi\<bullet>x,y)]"
   193     let ?pi' = "?sw@pi"
   192     let ?pi' = "?sw@pi"
   194     have f0: "x\<sharp>\<Gamma>" by fact
   193     have f0: "x\<sharp>\<Gamma>" by fact
   195     have f1: "(pi\<bullet>x)\<sharp>(pi\<bullet>\<Gamma>)" using f0 by (simp add: fresh_bij)
   194     have f1: "(pi\<bullet>x)\<sharp>(pi\<bullet>\<Gamma>)" using f0 by (simp add: fresh_bij)
   196     have f2: "y\<sharp>?pi'\<bullet>\<Gamma>" by (auto simp add: pt_name2 fresh_left calc_atm perm_pi_simp)
   195     have f2: "y\<sharp>?pi'\<bullet>\<Gamma>" by (auto simp add: pt_name2 fresh_left calc_atm perm_pi_simp)
   197     have pr1: "(x,T1)#\<Gamma> \<turnstile> t : T2" by fact
   196       have ih1: "\<And>c. P c (?pi'\<bullet>((x,T1)#\<Gamma>)) (?pi'\<bullet>t) (?pi'\<bullet>T2)" by fact
   198     then have "(?pi'\<bullet>((x,T1)#\<Gamma>)) \<turnstile> (?pi'\<bullet>t) : T2" by (simp only: typing_eqvt)
   197     then have "P c (?pi'\<bullet>\<Gamma>) (Lam [y].(?pi'\<bullet>t)) (T1\<rightarrow>T2)" using fs f2 a3
   199     moreover
       
   200     have ih1: "\<And>c. P c (?pi'\<bullet>((x,T1)#\<Gamma>)) (?pi'\<bullet>t) T2" by fact
       
   201     ultimately have "P c (?pi'\<bullet>\<Gamma>) (Lam [y].(?pi'\<bullet>t)) (T1\<rightarrow>T2)" using fs f2 a3
       
   202       by (simp add: calc_atm)
   198       by (simp add: calc_atm)
   203     then have "P c (?sw\<bullet>pi\<bullet>\<Gamma>) (?sw\<bullet>(Lam [(pi\<bullet>x)].(pi\<bullet>t))) (T1\<rightarrow>T2)" 
   199     then have "P c (?sw\<bullet>pi\<bullet>\<Gamma>) (?sw\<bullet>(Lam [(pi\<bullet>x)].(pi\<bullet>t))) (T1\<rightarrow>T2)" 
   204       by (simp del: append_Cons add: calc_atm pt_name2)
   200       by (simp del: append_Cons add: calc_atm pt_name2)
   205     moreover have "(?sw\<bullet>pi\<bullet>\<Gamma>) = (pi\<bullet>\<Gamma>)"
   201     moreover have "(?sw\<bullet>pi\<bullet>\<Gamma>) = (pi\<bullet>\<Gamma>)"
   206       by (rule perm_fresh_fresh) (simp_all add: fs f1)
   202       by (rule perm_fresh_fresh) (simp_all add: fs f1)
   207     moreover have "(?sw\<bullet>(Lam [(pi\<bullet>x)].(pi\<bullet>t))) = Lam [(pi\<bullet>x)].(pi\<bullet>t)"
   203     moreover have "(?sw\<bullet>(Lam [(pi\<bullet>x)].(pi\<bullet>t))) = Lam [(pi\<bullet>x)].(pi\<bullet>t)"
   208       by (rule perm_fresh_fresh) (simp_all add: fs f1 fresh_atm abs_fresh)
   204       by (rule perm_fresh_fresh) (simp_all add: fs f1 fresh_atm abs_fresh)
   209     ultimately show "P c (pi\<bullet>\<Gamma>) (pi\<bullet>(Lam [x].t)) (T1\<rightarrow>T2)" 
   205     ultimately show "P c (pi\<bullet>\<Gamma>) (pi\<bullet>(Lam [x].t)) (pi\<bullet>T1\<rightarrow>T2)" by simp
   210       by simp
       
   211   next
   206   next
   212     case (t_Const \<Gamma> n pi c)
   207     case (t_Const \<Gamma> n pi c)
   213     thus "P c (pi\<bullet>\<Gamma>) (pi\<bullet>(Const n)) (TBase)" using a4 by (simp, blast intro: valid_eqvt)
   208     thus "P c (pi\<bullet>\<Gamma>) (pi\<bullet>(Const n)) (pi\<bullet>TBase)" using a4 by (simp, blast intro: valid_eqvt)
   214   next
   209   next
   215     case (t_Unit \<Gamma> pi c)
   210     case (t_Unit \<Gamma> pi c)
   216     thus "P c (pi\<bullet>\<Gamma>) (pi\<bullet>Unit) (TUnit)" using a5 by (simp, blast intro: valid_eqvt)
   211     thus "P c (pi\<bullet>\<Gamma>) (pi\<bullet>Unit) (pi\<bullet>TUnit)" using a5 by (simp, blast intro: valid_eqvt)
   217   qed 
   212   qed 
   218   then have "P c (([]::name prm)\<bullet>\<Gamma>) (([]::name prm)\<bullet>e) T" by blast
   213   then have "P c (([]::name prm)\<bullet>\<Gamma>) (([]::name prm)\<bullet>e) (([]::name prm)\<bullet>T)" by blast
   219   then show "P c \<Gamma> e T" by simp
   214   then show "P c \<Gamma> e T" by simp
   220 qed 
   215 qed
   221 
   216 
   222 text {* capture-avoiding substitution *}
   217 text {* capture-avoiding substitution *}
   223 
   218 
   224 fun
   219 fun
   225   lookup :: "(name\<times>trm) list \<Rightarrow> name \<Rightarrow> trm"   
   220   lookup :: "(name\<times>trm) list \<Rightarrow> name \<Rightarrow> trm"   
   277   and   "x\<sharp>(y,t') \<Longrightarrow> (Lam [x].t)[y::=t'] = Lam [x].(t[y::=t'])"
   272   and   "x\<sharp>(y,t') \<Longrightarrow> (Lam [x].t)[y::=t'] = Lam [x].(t[y::=t'])"
   278   and   "Const n[y::=t'] = Const n"
   273   and   "Const n[y::=t'] = Const n"
   279   and   "Unit [y::=t'] = Unit"
   274   and   "Unit [y::=t'] = Unit"
   280   by (simp_all add: fresh_list_cons fresh_list_nil)
   275   by (simp_all add: fresh_list_cons fresh_list_nil)
   281 
   276 
   282 lemma subst_eqvt:
   277 lemma subst_eqvt[eqvt]:
   283   fixes pi::"name prm" 
   278   fixes pi::"name prm" 
   284   and   t::"trm"
   279   and   t::"trm"
   285   shows "pi\<bullet>(t[x::=t']) = (pi\<bullet>t)[(pi\<bullet>x)::=(pi\<bullet>t')]"
   280   shows "pi\<bullet>(t[x::=t']) = (pi\<bullet>t)[(pi\<bullet>x)::=(pi\<bullet>t')]"
   286   by (nominal_induct t avoiding: x t' rule: trm.induct)
   281   by (nominal_induct t avoiding: x t' rule: trm.induct)
   287      (perm_simp add: fresh_bij)+
   282      (perm_simp add: fresh_bij)+
   369 lemma equiv_def_valid:
   364 lemma equiv_def_valid:
   370   assumes "\<Gamma> \<turnstile> t == s : T"
   365   assumes "\<Gamma> \<turnstile> t == s : T"
   371   shows "valid \<Gamma>"
   366   shows "valid \<Gamma>"
   372 using assms by (induct,auto elim:typing_valid)
   367 using assms by (induct,auto elim:typing_valid)
   373 
   368 
   374 lemma equiv_def_eqvt:
   369 lemma equiv_def_eqvt[eqvt]:
   375   fixes pi::"name prm"
   370   fixes pi::"name prm"
   376   assumes a: "\<Gamma> \<turnstile> s == t : T"
   371   assumes a: "\<Gamma> \<turnstile> s == t : T"
   377   shows "(pi\<bullet>\<Gamma>) \<turnstile> (pi\<bullet>s) == (pi\<bullet>t) : T"
   372   shows "(pi\<bullet>\<Gamma>) \<turnstile> (pi\<bullet>s) == (pi\<bullet>t) : (pi\<bullet>T)"
   378 using a
   373 using a
   379 apply(induct)
   374 apply(induct)
   380 apply(auto intro: typing_eqvt valid_eqvt simp add: fresh_bij subst_eqvt)
   375 apply(auto intro: typing_eqvt valid_eqvt simp add: fresh_bij subst_eqvt simp del: perm_ty)
   381 apply(rule_tac x="pi\<bullet>x" in Q_Ext)
   376 apply(rule_tac x="pi\<bullet>x" in Q_Ext)
   382 apply(simp add: fresh_bij)+
   377 apply(simp add: fresh_bij)+
   383 done
   378 done
   384 
   379 
   385 lemma equiv_def_strong_induct
   380 lemma equiv_def_strong_induct
   386   [consumes 1, case_names Q_Refl Q_Symm Q_Trans Q_Abs Q_App Q_Beta Q_Ext]:
   381   [consumes 1, case_names Q_Refl Q_Symm Q_Trans Q_Abs Q_App Q_Beta Q_Ext]:
   387   fixes c::"'a::fs_name"
   382   fixes c::"'a::fs_name"
   388   assumes a0: "\<Gamma> \<turnstile> s == t : T" 
   383   assumes a0: "\<Gamma> \<turnstile> s == t : T" 
   389   and     a1: "\<And>\<Gamma> t T c.  \<Gamma> \<turnstile> t : T  \<Longrightarrow> P c \<Gamma> t t T"
   384   and     a1: "\<And>\<Gamma> t T c.  \<Gamma> \<turnstile> t : T  \<Longrightarrow> P c \<Gamma> t t T"
   390   and     a2: "\<And>\<Gamma> t s T c. \<lbrakk>\<Gamma> \<turnstile> t == s : T; \<And>d. P d \<Gamma> t s T\<rbrakk> \<Longrightarrow>  P c \<Gamma> s t T"
   385   and     a2: "\<And>\<Gamma> t s T c. \<lbrakk>\<And>d. P d \<Gamma> t s T\<rbrakk> \<Longrightarrow>  P c \<Gamma> s t T"
   391   and     a3: "\<And>\<Gamma> s t T u c. 
   386   and     a3: "\<And>\<Gamma> s t T u c. \<lbrakk>\<And>d. P d \<Gamma> s t T; \<And>d. P d \<Gamma> t u T\<rbrakk> 
   392                \<lbrakk>\<Gamma> \<turnstile> s == t : T; \<And>d. P d \<Gamma> s t T; \<Gamma> \<turnstile> t == u : T; \<And>d. P d \<Gamma> t u T\<rbrakk> 
       
   393                \<Longrightarrow> P c \<Gamma> s u T"
   387                \<Longrightarrow> P c \<Gamma> s u T"
   394   and     a4: "\<And>x \<Gamma> T1 s2 t2 T2 c. \<lbrakk>x\<sharp>\<Gamma>; x\<sharp>c; (x,T1)#\<Gamma> \<turnstile> s2 == t2 : T2; \<And>d. P d ((x,T1)#\<Gamma>) s2 t2 T2\<rbrakk>
   388   and     a4: "\<And>x \<Gamma> T1 s2 t2 T2 c. \<lbrakk>x\<sharp>\<Gamma>; x\<sharp>c; \<And>d. P d ((x,T1)#\<Gamma>) s2 t2 T2\<rbrakk>
   395                \<Longrightarrow> P c \<Gamma> (Lam [x].s2) (Lam [x].t2) (T1\<rightarrow>T2)"
   389                \<Longrightarrow> P c \<Gamma> (Lam [x].s2) (Lam [x].t2) (T1\<rightarrow>T2)"
   396   and     a5: "\<And>\<Gamma> s1 t1 T1 T2 s2 t2 c.
   390   and     a5: "\<And>\<Gamma> s1 t1 T1 T2 s2 t2 c. \<lbrakk>\<And>d. P d \<Gamma> s1 t1 (T1\<rightarrow>T2); \<And>d. P d \<Gamma> s2 t2 T1\<rbrakk> 
   397                \<lbrakk>\<Gamma> \<turnstile> s1 == t1 : T1\<rightarrow>T2; \<And>d. P d \<Gamma> s1 t1 (T1\<rightarrow>T2); 
   391                \<Longrightarrow> P c \<Gamma> (App s1 s2) (App t1 t2) T2"
   398                 \<Gamma> \<turnstile> s2 == t2 : T1; \<And>d. P d \<Gamma> s2 t2 T1\<rbrakk> \<Longrightarrow> P c \<Gamma> (App s1 s2) (App t1 t2) T2"
       
   399   and     a6: "\<And>x \<Gamma> T1 s12 t12 T2 s2 t2 c.
   392   and     a6: "\<And>x \<Gamma> T1 s12 t12 T2 s2 t2 c.
   400                \<lbrakk>x\<sharp>(\<Gamma>,s2,t2); x\<sharp>c; (x,T1)#\<Gamma> \<turnstile> s12 == t12 : T2; \<And>d. P d ((x,T1)#\<Gamma>) s12 t12 T2;
   393                \<lbrakk>x\<sharp>(\<Gamma>,s2,t2); x\<sharp>c; \<And>d. P d ((x,T1)#\<Gamma>) s12 t12 T2; \<And>d. P d \<Gamma> s2 t2 T1\<rbrakk> 
   401                \<Gamma> \<turnstile> s2 == t2 : T1; \<And>d. P d \<Gamma> s2 t2 T1\<rbrakk> 
       
   402                \<Longrightarrow> P c \<Gamma> (App (Lam [x].s12) s2) (t12[x::=t2]) T2"
   394                \<Longrightarrow> P c \<Gamma> (App (Lam [x].s12) s2) (t12[x::=t2]) T2"
   403   and     a7: "\<And>x \<Gamma> s t T1 T2 c.
   395   and     a7: "\<And>x \<Gamma> s t T1 T2 c.
   404                \<lbrakk>x\<sharp>(\<Gamma>,s,t); (x,T1)#\<Gamma> \<turnstile> App s (Var x) == App t (Var x) : T2;
   396                \<lbrakk>x\<sharp>(\<Gamma>,s,t); \<And>d. P d ((x,T1)#\<Gamma>) (App s (Var x)) (App t (Var x)) T2\<rbrakk>
   405                \<And>d. P d ((x,T1)#\<Gamma>) (App s (Var x)) (App t (Var x)) T2\<rbrakk>
       
   406                \<Longrightarrow> P c \<Gamma> s t (T1\<rightarrow>T2)"
   397                \<Longrightarrow> P c \<Gamma> s t (T1\<rightarrow>T2)"
   407  shows "P c \<Gamma>  s t T"
   398  shows "P c \<Gamma>  s t T"
   408 proof -
   399 proof -
   409   from a0 have "\<And>(pi::name prm) c. P c (pi\<bullet>\<Gamma>) (pi\<bullet>s) (pi\<bullet>t) T" 
   400   from a0 have "\<And>(pi::name prm) c. P c (pi\<bullet>\<Gamma>) (pi\<bullet>s) (pi\<bullet>t) (pi\<bullet>T)" 
   410     proof(induct)
   401     proof(induct)
   411       case (Q_Refl \<Gamma> t T pi c)
   402       case (Q_Refl \<Gamma> t T pi c)
   412       then show "P c (pi\<bullet>\<Gamma>) (pi\<bullet>t) (pi\<bullet>t) T" using a1 by (simp add: typing_eqvt)
   403       then show "P c (pi\<bullet>\<Gamma>) (pi\<bullet>t) (pi\<bullet>t) (pi\<bullet>T)" using a1 by (simp only: eqvt)
   413     next
   404     next
   414       case (Q_Symm \<Gamma> t s T pi c)
   405       case (Q_Symm \<Gamma> t s T pi c)
   415       then show "P c (pi\<bullet>\<Gamma>) (pi\<bullet>s) (pi\<bullet>t) T" using a2 by (simp only: equiv_def_eqvt)
   406       then show "P c (pi\<bullet>\<Gamma>) (pi\<bullet>s) (pi\<bullet>t) (pi\<bullet>T)" using a2 by (simp only: equiv_def_eqvt)
   416     next
   407     next
   417       case (Q_Trans \<Gamma> s t T u pi c)
   408       case (Q_Trans \<Gamma> s t T u pi c)
   418       then show " P c (pi\<bullet>\<Gamma>) (pi\<bullet>s) (pi\<bullet>u) T" using a3 by (blast intro: equiv_def_eqvt)
   409       then show " P c (pi\<bullet>\<Gamma>) (pi\<bullet>s) (pi\<bullet>u) (pi\<bullet>T)" using a3 by (blast intro: equiv_def_eqvt)
   419     next
   410     next
   420       case (Q_App \<Gamma> s1 t1 T1 T2 s2 t2 pi c)
   411       case (Q_App \<Gamma> s1 t1 T1 T2 s2 t2 pi c)
   421       then show "P c (pi\<bullet>\<Gamma>) (pi\<bullet>App s1 s2) (pi\<bullet>App t1 t2) T2" using a5 
   412       then show "P c (pi\<bullet>\<Gamma>) (pi\<bullet>App s1 s2) (pi\<bullet>App t1 t2) (pi\<bullet>T2)" using a5 
   422 	by (simp, blast intro: equiv_def_eqvt)
   413 	by (simp only: eqvt) (blast)
   423     next
   414     next
   424       case (Q_Ext x \<Gamma> s t T1 T2 pi c)
   415       case (Q_Ext x \<Gamma> s t T1 T2 pi c)
   425       then show "P c (pi\<bullet>\<Gamma>) (pi\<bullet>s) (pi\<bullet>t) (T1\<rightarrow>T2)"  
   416       then show "P c (pi\<bullet>\<Gamma>) (pi\<bullet>s) (pi\<bullet>t) (pi\<bullet>T1\<rightarrow>T2)"  
   426 	apply(auto intro!: a7 simp add: fresh_bij)
   417 	by (auto intro!: a7 simp add: fresh_bij)
   427 	apply(drule equiv_def_eqvt)
       
   428 	apply(simp)
       
   429 	done
       
   430     next
   418     next
   431       case (Q_Abs x \<Gamma> T1 s2 t2 T2 pi c)
   419       case (Q_Abs x \<Gamma> T1 s2 t2 T2 pi c)
   432       obtain y::"name" where fs: "y\<sharp>(pi\<bullet>x,pi\<bullet>s2,pi\<bullet>t2,pi\<bullet>\<Gamma>,c)" by (rule exists_fresh[OF fs_name1])
   420       obtain y::"name" where fs: "y\<sharp>(pi\<bullet>x,pi\<bullet>s2,pi\<bullet>t2,pi\<bullet>\<Gamma>,c)" by (rule exists_fresh[OF fs_name1])
   433       let ?sw="[(pi\<bullet>x,y)]"
   421       let ?sw="[(pi\<bullet>x,y)]"
   434       let ?pi'="?sw@pi"
   422       let ?pi'="?sw@pi"
   435       have f1: "x\<sharp>\<Gamma>" by fact
   423       have f1: "x\<sharp>\<Gamma>" by fact
   436       have f2: "(pi\<bullet>x)\<sharp>(pi\<bullet>\<Gamma>)" using f1 by (simp add: fresh_bij)
   424       have f2: "(pi\<bullet>x)\<sharp>(pi\<bullet>\<Gamma>)" using f1 by (simp add: fresh_bij)
   437       have f3: "y\<sharp>?pi'\<bullet>\<Gamma>" using f1 by (auto simp add: pt_name2 fresh_left calc_atm perm_pi_simp)
   425       have f3: "y\<sharp>?pi'\<bullet>\<Gamma>" using f1 by (auto simp add: pt_name2 fresh_left calc_atm perm_pi_simp)
   438       have pr1: "(x,T1)#\<Gamma> \<turnstile> s2 == t2 : T2" by fact
   426       have ih1: "\<And>c. P c (?pi'\<bullet>((x,T1)#\<Gamma>)) (?pi'\<bullet>s2) (?pi'\<bullet>t2) (?pi'\<bullet>T2)" by fact
   439       then have "?pi'\<bullet>((x,T1)#\<Gamma>) \<turnstile> (?pi'\<bullet>s2) == (?pi'\<bullet>t2) : T2" by (rule equiv_def_eqvt)
       
   440       then have "((y,T1)#(?pi'\<bullet>\<Gamma>)) \<turnstile> (?pi'\<bullet>s2) == (?pi'\<bullet>t2) : T2" by (simp add: calc_atm)
       
   441       moreover    
       
   442       have ih1: "\<And>c. P c (?pi'\<bullet>((x,T1)#\<Gamma>)) (?pi'\<bullet>s2) (?pi'\<bullet>t2) T2" by fact
       
   443       then have "\<And>c. P c ((y,T1)#(?pi'\<bullet>\<Gamma>)) (?pi'\<bullet>s2) (?pi'\<bullet>t2) T2" by (simp add: calc_atm)
   427       then have "\<And>c. P c ((y,T1)#(?pi'\<bullet>\<Gamma>)) (?pi'\<bullet>s2) (?pi'\<bullet>t2) T2" by (simp add: calc_atm)
   444       ultimately have "P c  (?pi'\<bullet>\<Gamma>) (?pi'\<bullet>Lam [x].s2) (?pi'\<bullet>Lam [x].t2) (T1\<rightarrow>T2)" using a4 f3 fs
   428       then have "P c  (?pi'\<bullet>\<Gamma>) (?pi'\<bullet>Lam [x].s2) (?pi'\<bullet>Lam [x].t2) (T1\<rightarrow>T2)" using a4 f3 fs
   445 	by (simp add: calc_atm)
   429 	by (simp add: calc_atm)
   446       then have "P c (?sw\<bullet>pi\<bullet>\<Gamma>) (?sw\<bullet>Lam [(pi\<bullet>x)].(pi\<bullet>s2)) (?sw\<bullet>Lam [(pi\<bullet>x)].(pi\<bullet>t2)) (T1\<rightarrow>T2)" 
   430       then have "P c (?sw\<bullet>pi\<bullet>\<Gamma>) (?sw\<bullet>Lam [(pi\<bullet>x)].(pi\<bullet>s2)) (?sw\<bullet>Lam [(pi\<bullet>x)].(pi\<bullet>t2)) (T1\<rightarrow>T2)" 
   447 	by (simp del: append_Cons add: calc_atm pt_name2)
   431 	by (simp del: append_Cons add: calc_atm pt_name2)
   448       moreover have "(?sw\<bullet>(pi\<bullet>\<Gamma>)) = (pi\<bullet>\<Gamma>)" 
   432       moreover have "(?sw\<bullet>(pi\<bullet>\<Gamma>)) = (pi\<bullet>\<Gamma>)" 
   449 	by (rule perm_fresh_fresh) (simp_all add: fs f2)
   433 	by (rule perm_fresh_fresh) (simp_all add: fs f2)
   450       moreover have "(?sw\<bullet>(Lam [(pi\<bullet>x)].(pi\<bullet>s2))) = Lam [(pi\<bullet>x)].(pi\<bullet>s2)" 
   434       moreover have "(?sw\<bullet>(Lam [(pi\<bullet>x)].(pi\<bullet>s2))) = Lam [(pi\<bullet>x)].(pi\<bullet>s2)" 
   451 	by (rule perm_fresh_fresh) (simp_all add: fs f2 abs_fresh)
   435 	by (rule perm_fresh_fresh) (simp_all add: fs f2 abs_fresh)
   452       moreover have "(?sw\<bullet>(Lam [(pi\<bullet>x)].(pi\<bullet>t2))) = Lam [(pi\<bullet>x)].(pi\<bullet>t2)" 
   436       moreover have "(?sw\<bullet>(Lam [(pi\<bullet>x)].(pi\<bullet>t2))) = Lam [(pi\<bullet>x)].(pi\<bullet>t2)" 
   453 	by (rule perm_fresh_fresh) (simp_all add: fs f2 abs_fresh)
   437 	by (rule perm_fresh_fresh) (simp_all add: fs f2 abs_fresh)
   454       ultimately have "P c (pi\<bullet>\<Gamma>) (Lam [(pi\<bullet>x)].(pi\<bullet>s2)) (Lam [(pi\<bullet>x)].(pi\<bullet>t2)) (T1\<rightarrow>T2)" by simp
   438       ultimately have "P c (pi\<bullet>\<Gamma>) (Lam [(pi\<bullet>x)].(pi\<bullet>s2)) (Lam [(pi\<bullet>x)].(pi\<bullet>t2)) (T1\<rightarrow>T2)" by simp
   455       then show  "P c (pi\<bullet>\<Gamma>) (pi\<bullet>Lam [x].s2) (pi\<bullet>Lam [x].t2) (T1\<rightarrow>T2)" by simp 
   439       then show  "P c (pi\<bullet>\<Gamma>) (pi\<bullet>Lam [x].s2) (pi\<bullet>Lam [x].t2) (pi\<bullet>T1\<rightarrow>T2)" by simp 
   456     next 
   440     next 
   457       case (Q_Beta x \<Gamma> s2 t2 T1 s12 t12 T2 pi c) 
   441       case (Q_Beta x \<Gamma> s2 t2 T1 s12 t12 T2 pi c) 
   458       obtain y::"name" where fs: "y\<sharp>(pi\<bullet>x,pi\<bullet>s12,pi\<bullet>t12,pi\<bullet>s2,pi\<bullet>t2,pi\<bullet>\<Gamma>,c)" 
   442       obtain y::"name" where fs: "y\<sharp>(pi\<bullet>x,pi\<bullet>s12,pi\<bullet>t12,pi\<bullet>s2,pi\<bullet>t2,pi\<bullet>\<Gamma>,c)" 
   459 	by (rule exists_fresh[OF fs_name1])
   443 	by (rule exists_fresh[OF fs_name1])
   460       let ?sw="[(pi\<bullet>x,y)]"
   444       let ?sw="[(pi\<bullet>x,y)]"
   461       let ?pi'="?sw@pi"
   445       let ?pi'="?sw@pi"
   462       have f1: "x\<sharp>(\<Gamma>,s2,t2)" by fact 
   446       have f1: "x\<sharp>(\<Gamma>,s2,t2)" by fact 
   463       have f2: "(pi\<bullet>x)\<sharp>(pi\<bullet>(\<Gamma>,s2,t2))" using f1 by (simp add: fresh_bij)
   447       have f2: "(pi\<bullet>x)\<sharp>(pi\<bullet>(\<Gamma>,s2,t2))" using f1 by (simp add: fresh_bij)
   464       have f3: "y\<sharp>(?pi'\<bullet>(\<Gamma>,s2,t2))" using f1 
   448       have f3: "y\<sharp>(?pi'\<bullet>(\<Gamma>,s2,t2))" using f1 
   465 	by (auto simp add: pt_name2 fresh_left calc_atm perm_pi_simp fresh_prod)
   449 	by (auto simp add: pt_name2 fresh_left calc_atm perm_pi_simp fresh_prod)
   466       have pr1: "(x,T1)#\<Gamma> \<turnstile> s12 == t12 : T2" by fact
   450       have ih1: "\<And>c. P c (?pi'\<bullet>((x,T1)#\<Gamma>)) (?pi'\<bullet>s12) (?pi'\<bullet>t12) (?pi'\<bullet>T2)" by fact
   467       then have "?pi'\<bullet>((x,T1)#\<Gamma>) \<turnstile> (?pi'\<bullet>s12) == (?pi'\<bullet>t12) : T2" by (rule equiv_def_eqvt)
   451       then have "\<And>c. P c ((y,T1)#(?pi'\<bullet>\<Gamma>)) (?pi'\<bullet>s12) (?pi'\<bullet>t12) (?pi'\<bullet>T2)" by (simp add: calc_atm)
   468       then have "((y,T1)#(?pi'\<bullet>\<Gamma>)) \<turnstile> (?pi'\<bullet>s12) == (?pi'\<bullet>t12) : T2" by (simp add: calc_atm)
       
   469       moreover    
       
   470       have ih1: "\<And>c. P c (?pi'\<bullet>((x,T1)#\<Gamma>)) (?pi'\<bullet>s12) (?pi'\<bullet>t12) T2" by fact
       
   471       then have "\<And>c. P c ((y,T1)#(?pi'\<bullet>\<Gamma>)) (?pi'\<bullet>s12) (?pi'\<bullet>t12) T2" by (simp add: calc_atm)
       
   472       moreover
   452       moreover
   473       have pr2: "\<Gamma> \<turnstile> s2 == t2 : T1" by fact
   453       have ih2: "\<And>c. P c (?pi'\<bullet>\<Gamma>) (?pi'\<bullet>s2) (?pi'\<bullet>t2) (?pi'\<bullet>T1)" by fact
   474       then have "(?pi'\<bullet>\<Gamma>) \<turnstile> (?pi'\<bullet>s2) == (?pi'\<bullet>t2) : T1" by (rule equiv_def_eqvt)
   454       ultimately have "P c  (?pi'\<bullet>\<Gamma>) (?pi'\<bullet>(App (Lam [x].s12) s2)) (?pi'\<bullet>(t12[x::=t2])) (?pi'\<bullet>T2)" 
   475       moreover    
   455 	using a6 f3 fs by (force simp add: subst_eqvt calc_atm del: perm_ty)
   476       have ih2: "\<And>c. P c (?pi'\<bullet>\<Gamma>) (?pi'\<bullet>s2) (?pi'\<bullet>t2) T1" by fact
       
   477       ultimately have "P c  (?pi'\<bullet>\<Gamma>) (?pi'\<bullet>(App (Lam [x].s12) s2)) (?pi'\<bullet>(t12[x::=t2])) T2" 
       
   478 	using a6 f3 fs by (simp add: subst_eqvt calc_atm)
       
   479       then have "P c (?sw\<bullet>pi\<bullet>\<Gamma>) (?sw\<bullet>(App (Lam [(pi\<bullet>x)].(pi\<bullet>s12)) (pi\<bullet>s2))) 
   456       then have "P c (?sw\<bullet>pi\<bullet>\<Gamma>) (?sw\<bullet>(App (Lam [(pi\<bullet>x)].(pi\<bullet>s12)) (pi\<bullet>s2))) 
   480 	(?sw\<bullet>((pi\<bullet>t12)[(pi\<bullet>x)::=(pi\<bullet>t2)])) T2" 
   457 	(?sw\<bullet>((pi\<bullet>t12)[(pi\<bullet>x)::=(pi\<bullet>t2)])) T2" 
   481 	by (simp del: append_Cons add: calc_atm pt_name2 subst_eqvt)
   458 	by (simp del: append_Cons add: calc_atm pt_name2 subst_eqvt)
   482       moreover have "(?sw\<bullet>(pi\<bullet>\<Gamma>)) = (pi\<bullet>\<Gamma>)" 
   459       moreover have "(?sw\<bullet>(pi\<bullet>\<Gamma>)) = (pi\<bullet>\<Gamma>)" 
   483 	by (rule perm_fresh_fresh) (simp_all add: fs[simplified] f2[simplified])
   460 	by (rule perm_fresh_fresh) (simp_all add: fs[simplified] f2[simplified])
   486       moreover have "(?sw\<bullet>((pi\<bullet>t12)[(pi\<bullet>x)::=(pi\<bullet>t2)])) = ((pi\<bullet>t12)[(pi\<bullet>x)::=(pi\<bullet>t2)])" 
   463       moreover have "(?sw\<bullet>((pi\<bullet>t12)[(pi\<bullet>x)::=(pi\<bullet>t2)])) = ((pi\<bullet>t12)[(pi\<bullet>x)::=(pi\<bullet>t2)])" 
   487 	by (rule perm_fresh_fresh) 
   464 	by (rule perm_fresh_fresh) 
   488 	   (simp_all add: fs[simplified] f2[simplified] fresh_subst fresh_subst'')
   465 	   (simp_all add: fs[simplified] f2[simplified] fresh_subst fresh_subst'')
   489       ultimately have "P c (pi\<bullet>\<Gamma>) (App (Lam [(pi\<bullet>x)].(pi\<bullet>s12)) (pi\<bullet>s2)) ((pi\<bullet>t12)[(pi\<bullet>x)::=(pi\<bullet>t2)]) T2"
   466       ultimately have "P c (pi\<bullet>\<Gamma>) (App (Lam [(pi\<bullet>x)].(pi\<bullet>s12)) (pi\<bullet>s2)) ((pi\<bullet>t12)[(pi\<bullet>x)::=(pi\<bullet>t2)]) T2"
   490 	by simp
   467 	by simp
   491       then show "P c (pi\<bullet>\<Gamma>) (pi\<bullet>App (Lam [x].s12) s2) (pi\<bullet>t12[x::=t2]) T2" by (simp add: subst_eqvt)	
   468       then show "P c (pi\<bullet>\<Gamma>) (pi\<bullet>App (Lam [x].s12) s2) (pi\<bullet>t12[x::=t2]) (pi\<bullet>T2)" by (simp add: subst_eqvt)
   492     qed
   469     qed
   493   then have "P c (([]::name prm)\<bullet>\<Gamma>) (([]::name prm)\<bullet>s) (([]::name prm)\<bullet>t) T" by blast
   470   then have "P c (([]::name prm)\<bullet>\<Gamma>) (([]::name prm)\<bullet>s) (([]::name prm)\<bullet>t) (([]::name prm)\<bullet>T)" by blast
   494   then show "P c \<Gamma> s t T" by simp
   471   then show "P c \<Gamma> s t T" by simp
   495 qed
   472 qed
   496 
   473 
   497 text {* Weak head reduction *}
   474 text {* Weak head reduction *}
   498 
   475 
   536   assumes a: "t \<leadsto> t'"
   513   assumes a: "t \<leadsto> t'"
   537   shows "(pi\<bullet>t) \<leadsto> (pi\<bullet>t')"
   514   shows "(pi\<bullet>t) \<leadsto> (pi\<bullet>t')"
   538 using a
   515 using a
   539 by (induct) (auto simp add: subst_eqvt fresh_bij)
   516 by (induct) (auto simp add: subst_eqvt fresh_bij)
   540 
   517 
   541 lemma whn_eqvt:
   518 lemma whn_eqvt[eqvt]:
   542   fixes pi::"name prm"
   519   fixes pi::"name prm"
   543   assumes a: "t \<Down> t'"
   520   assumes a: "t \<Down> t'"
   544   shows "(pi\<bullet>t) \<Down> (pi\<bullet>t')"
   521   shows "(pi\<bullet>t) \<Down> (pi\<bullet>t')"
   545 using a
   522 using a
   546 apply(induct)
   523 apply(induct)
   566 | QAT_One[intro]:   "valid \<Gamma> \<Longrightarrow> \<Gamma> \<turnstile> s <=> t : TUnit"
   543 | QAT_One[intro]:   "valid \<Gamma> \<Longrightarrow> \<Gamma> \<turnstile> s <=> t : TUnit"
   567 | QAP_Var[intro]:   "\<lbrakk>valid \<Gamma>;(x,T) \<in> set \<Gamma>\<rbrakk> \<Longrightarrow> \<Gamma> \<turnstile> Var x \<leftrightarrow> Var x : T"
   544 | QAP_Var[intro]:   "\<lbrakk>valid \<Gamma>;(x,T) \<in> set \<Gamma>\<rbrakk> \<Longrightarrow> \<Gamma> \<turnstile> Var x \<leftrightarrow> Var x : T"
   568 | QAP_App[intro]:   "\<lbrakk>\<Gamma> \<turnstile> p \<leftrightarrow> q : T1 \<rightarrow> T2; \<Gamma> \<turnstile> s <=> t : T1 \<rbrakk> \<Longrightarrow> \<Gamma> \<turnstile> App p s \<leftrightarrow> App q t : T2"
   545 | QAP_App[intro]:   "\<lbrakk>\<Gamma> \<turnstile> p \<leftrightarrow> q : T1 \<rightarrow> T2; \<Gamma> \<turnstile> s <=> t : T1 \<rbrakk> \<Longrightarrow> \<Gamma> \<turnstile> App p s \<leftrightarrow> App q t : T2"
   569 | QAP_Const[intro]: "valid \<Gamma> \<Longrightarrow> \<Gamma> \<turnstile> Const n \<leftrightarrow> Const n : TBase"
   546 | QAP_Const[intro]: "valid \<Gamma> \<Longrightarrow> \<Gamma> \<turnstile> Const n \<leftrightarrow> Const n : TBase"
   570 
   547 
   571 lemma alg_equiv_alg_path_equiv_eqvt:
   548 lemma alg_equiv_alg_path_equiv_eqvt[eqvt]:
   572   fixes pi::"name prm"
   549   fixes pi::"name prm"
   573   shows "\<Gamma> \<turnstile> s <=> t : T \<Longrightarrow> (pi\<bullet>\<Gamma>) \<turnstile> (pi\<bullet>s) <=> (pi\<bullet>t) : T" 
   550   shows "\<Gamma> \<turnstile> s <=> t : T \<Longrightarrow> (pi\<bullet>\<Gamma>) \<turnstile> (pi\<bullet>s) <=> (pi\<bullet>t) : (pi\<bullet>T)" 
   574   and   "\<Gamma> \<turnstile> p \<leftrightarrow> q : T \<Longrightarrow> (pi\<bullet>\<Gamma>) \<turnstile> (pi\<bullet>p) \<leftrightarrow> (pi\<bullet>q) : T"
   551   and   "\<Gamma> \<turnstile> p \<leftrightarrow> q : T \<Longrightarrow> (pi\<bullet>\<Gamma>) \<turnstile> (pi\<bullet>p) \<leftrightarrow> (pi\<bullet>q) : (pi\<bullet>T)"
   575 apply(induct rule: alg_equiv_alg_path_equiv.inducts)
   552 apply(induct rule: alg_equiv_alg_path_equiv.inducts)
   576 apply(auto intro: whn_eqvt simp add: fresh_bij valid_eqvt)
   553 apply(auto intro: whn_eqvt simp add: fresh_bij valid_eqvt)
   577 apply(rule_tac x="pi\<bullet>x" in  QAT_Arrow)
   554 apply(rule_tac x="pi\<bullet>x" in  QAT_Arrow)
   578 apply(auto simp add: fresh_bij)
   555 apply(auto simp add: fresh_bij)
   579 apply(rule QAP_Var)
   556 apply(rule QAP_Var)
   604   proof(induct rule: alg_equiv_alg_path_equiv.induct)
   581   proof(induct rule: alg_equiv_alg_path_equiv.induct)
   605     case (QAT_Base s q t p \<Gamma>)
   582     case (QAT_Base s q t p \<Gamma>)
   606     then show "\<forall>c (pi::name prm). P1 c (pi\<bullet>\<Gamma>) (pi\<bullet>s) (pi\<bullet>t) TBase"
   583     then show "\<forall>c (pi::name prm). P1 c (pi\<bullet>\<Gamma>) (pi\<bullet>s) (pi\<bullet>t) TBase"
   607       apply(auto)
   584       apply(auto)
   608       apply(rule_tac p="pi\<bullet>q" and q="pi\<bullet>p" in  a1)
   585       apply(rule_tac p="pi\<bullet>q" and q="pi\<bullet>p" in  a1)
   609       apply(simp_all add: whn_eqvt alg_equiv_alg_path_equiv_eqvt)
   586       apply(simp_all add: whn_eqvt alg_equiv_alg_path_equiv_eqvt[simplified])
   610       done
   587       done
   611   next
   588   next
   612     case (QAT_Arrow x \<Gamma> s t T1 T2)
   589     case (QAT_Arrow x \<Gamma> s t T1 T2)
   613     show ?case
   590     show ?case
   614     proof (rule allI, rule allI)
   591     proof (rule allI, rule allI)
   621       have f2: "(pi\<bullet>x)\<sharp>(pi\<bullet>(\<Gamma>,s,t))" using f1 by (simp add: fresh_bij)
   598       have f2: "(pi\<bullet>x)\<sharp>(pi\<bullet>(\<Gamma>,s,t))" using f1 by (simp add: fresh_bij)
   622       have f3: "y\<sharp>?pi'\<bullet>(\<Gamma>,s,t)" using f1 
   599       have f3: "y\<sharp>?pi'\<bullet>(\<Gamma>,s,t)" using f1 
   623 	by (simp only: pt_name2 fresh_left, auto simp add: perm_pi_simp calc_atm)
   600 	by (simp only: pt_name2 fresh_left, auto simp add: perm_pi_simp calc_atm)
   624       then have f3': "y\<sharp>?pi'\<bullet>\<Gamma>" "y\<sharp>?pi'\<bullet>s" "y\<sharp>?pi'\<bullet>t" by (auto simp add: fresh_prod)
   601       then have f3': "y\<sharp>?pi'\<bullet>\<Gamma>" "y\<sharp>?pi'\<bullet>s" "y\<sharp>?pi'\<bullet>t" by (auto simp add: fresh_prod)
   625       have pr1: "(x,T1)#\<Gamma> \<turnstile> App s (Var x) <=> App t (Var x) : T2" by fact
   602       have pr1: "(x,T1)#\<Gamma> \<turnstile> App s (Var x) <=> App t (Var x) : T2" by fact
   626       then have "(?pi'\<bullet>((x,T1)#\<Gamma>)) \<turnstile> (?pi'\<bullet>(App s (Var x))) <=> (?pi'\<bullet>(App t (Var x))) : T2" 
   603       then have "(?pi'\<bullet>((x,T1)#\<Gamma>)) \<turnstile> (?pi'\<bullet>(App s (Var x))) <=> (?pi'\<bullet>(App t (Var x))) : (?pi'\<bullet>T2)" 
   627 	by (simp only: alg_equiv_alg_path_equiv_eqvt)
   604 	by (rule alg_equiv_alg_path_equiv_eqvt)
   628       then have "(y,T1)#(?pi'\<bullet>\<Gamma>) \<turnstile> (App (?pi'\<bullet>s) (Var y)) <=> (App (?pi'\<bullet>t) (Var y)) : T2" 
   605       then have "(y,T1)#(?pi'\<bullet>\<Gamma>) \<turnstile> (App (?pi'\<bullet>s) (Var y)) <=> (App (?pi'\<bullet>t) (Var y)) : T2" 
   629 	by (simp add: calc_atm)
   606 	by (simp add: calc_atm)
   630       moreover    
   607       moreover    
   631       have ih1: "\<forall>c (pi::name prm).  P1 c (pi\<bullet>((x,T1)#\<Gamma>)) (pi\<bullet>App s (Var x)) (pi\<bullet>App t (Var x)) T2"
   608       have ih1: "\<forall>c (pi::name prm).  P1 c (pi\<bullet>((x,T1)#\<Gamma>)) (pi\<bullet>App s (Var x)) (pi\<bullet>App t (Var x)) T2"
   632 	by fact
   609 	by fact
   657       apply(perm_simp add: pt_set_bij1a[OF pt_name_inst, OF at_name_inst])
   634       apply(perm_simp add: pt_set_bij1a[OF pt_name_inst, OF at_name_inst])
   658       done
   635       done
   659   next
   636   next
   660     case (QAP_App \<Gamma> p q T1 T2 s t)
   637     case (QAP_App \<Gamma> p q T1 T2 s t)
   661     then show "\<forall>c (pi::name prm). P2 c (pi\<bullet>\<Gamma>) (pi\<bullet>App p s) (pi\<bullet>App q t) T2"
   638     then show "\<forall>c (pi::name prm). P2 c (pi\<bullet>\<Gamma>) (pi\<bullet>App p s) (pi\<bullet>App q t) T2"
   662       by (auto intro!: a5 simp add: alg_equiv_alg_path_equiv_eqvt)
   639       by (auto intro!: a5 simp add: alg_equiv_alg_path_equiv_eqvt[simplified])
   663   next
   640   next
   664     case (QAP_Const \<Gamma> n)
   641     case (QAP_Const \<Gamma> n)
   665     then show "\<forall>c (pi::name prm). P2 c (pi\<bullet>\<Gamma>) (pi\<bullet>Const n) (pi\<bullet>Const n) TBase"
   642     then show "\<forall>c (pi::name prm). P2 c (pi\<bullet>\<Gamma>) (pi\<bullet>Const n) (pi\<bullet>Const n) TBase"
   666       by (auto intro!: a6 simp add: valid_eqvt)
   643       by (auto intro!: a6 simp add: valid_eqvt)
   667   qed
   644   qed
   722   shows "\<Gamma> \<turnstile> s <=> t : T \<Longrightarrow> \<Gamma>\<lless>\<Gamma>' \<Longrightarrow> \<Gamma>' \<turnstile> s <=> t : T"
   699   shows "\<Gamma> \<turnstile> s <=> t : T \<Longrightarrow> \<Gamma>\<lless>\<Gamma>' \<Longrightarrow> \<Gamma>' \<turnstile> s <=> t : T"
   723   and "\<Gamma> \<turnstile> s \<leftrightarrow> t : T \<Longrightarrow> \<Gamma>\<lless>\<Gamma>' \<Longrightarrow> \<Gamma>' \<turnstile> s \<leftrightarrow> t : T"
   700   and "\<Gamma> \<turnstile> s \<leftrightarrow> t : T \<Longrightarrow> \<Gamma>\<lless>\<Gamma>' \<Longrightarrow> \<Gamma>' \<turnstile> s \<leftrightarrow> t : T"
   724 proof (nominal_induct \<Gamma> s t T and \<Gamma> s t T avoiding: \<Gamma>' rule: alg_equiv_alg_path_equiv_strong_inducts)
   701 proof (nominal_induct \<Gamma> s t T and \<Gamma> s t T avoiding: \<Gamma>' rule: alg_equiv_alg_path_equiv_strong_inducts)
   725   case (QAT_Arrow x \<Gamma> s t T1 T2 \<Gamma>')
   702   case (QAT_Arrow x \<Gamma> s t T1 T2 \<Gamma>')
   726   have fs:"x\<sharp>\<Gamma>" "x\<sharp>s" "x\<sharp>t" by fact
   703   have fs:"x\<sharp>\<Gamma>" "x\<sharp>s" "x\<sharp>t" by fact
   727   have h1:"(x,T1)#\<Gamma> \<turnstile> App s (Var x) <=> App t (Var x) : T2" by fact
       
   728   have h2:"\<Gamma>\<lless>\<Gamma>'" by fact
   704   have h2:"\<Gamma>\<lless>\<Gamma>'" by fact
   729   have ih:"\<And>\<Gamma>'. \<lbrakk>(x,T1)#\<Gamma> \<lless> \<Gamma>'\<rbrakk>  \<Longrightarrow> \<Gamma>' \<turnstile> App s (Var x) <=> App t (Var x) : T2" by fact
   705   have ih:"\<And>\<Gamma>'. \<lbrakk>(x,T1)#\<Gamma> \<lless> \<Gamma>'\<rbrakk>  \<Longrightarrow> \<Gamma>' \<turnstile> App s (Var x) <=> App t (Var x) : T2" by fact
   730   have "x\<sharp>\<Gamma>'" by fact
   706   have "x\<sharp>\<Gamma>'" by fact
   731   then have sub:"(x,T1)#\<Gamma> \<lless> (x,T1)#\<Gamma>'" using h2 by auto
   707   then have sub:"(x,T1)#\<Gamma> \<lless> (x,T1)#\<Gamma>'" using h2 by auto
   732   then have "(x,T1)#\<Gamma>' \<turnstile> App s (Var x) <=> App t (Var x) : T2" using ih by auto
   708   then have "(x,T1)#\<Gamma>' \<turnstile> App s (Var x) <=> App t (Var x) : T2" using ih by auto
   982   case (QAT_Arrow x \<Gamma> s t T1 T2)
   958   case (QAT_Arrow x \<Gamma> s t T1 T2)
   983   then have h:"((pi\<bullet>x)\<sharp>(pi\<bullet>\<Gamma>))" "((pi\<bullet>x)\<sharp>(pi\<bullet>s))" "((pi\<bullet>x)\<sharp>(pi\<bullet>t))"  using fresh_bij by auto
   959   then have h:"((pi\<bullet>x)\<sharp>(pi\<bullet>\<Gamma>))" "((pi\<bullet>x)\<sharp>(pi\<bullet>s))" "((pi\<bullet>x)\<sharp>(pi\<bullet>t))"  using fresh_bij by auto
   984   have "(pi\<bullet>((x,T1)#\<Gamma>)) \<turnstile> pi \<bullet> (App s (Var x)) <=> pi \<bullet> (App t (Var x)) : T2" by fact
   960   have "(pi\<bullet>((x,T1)#\<Gamma>)) \<turnstile> pi \<bullet> (App s (Var x)) <=> pi \<bullet> (App t (Var x)) : T2" by fact
   985   then have "(pi\<bullet>((x,T1)#\<Gamma>)) \<turnstile> (App (pi\<bullet>s) (Var (pi\<bullet>x))) <=> (App (pi\<bullet>t) (Var (pi\<bullet>x))) : T2" by auto
   961   then have "(pi\<bullet>((x,T1)#\<Gamma>)) \<turnstile> (App (pi\<bullet>s) (Var (pi\<bullet>x))) <=> (App (pi\<bullet>t) (Var (pi\<bullet>x))) : T2" by auto
   986   moreover have "pi\<bullet>((x,T1)#\<Gamma>) = (pi\<bullet>x,pi\<bullet>T1)#(pi\<bullet>\<Gamma>)" by auto
   962   moreover have "pi\<bullet>((x,T1)#\<Gamma>) = (pi\<bullet>x,pi\<bullet>T1)#(pi\<bullet>\<Gamma>)" by auto
   987   ultimately have "((pi\<bullet>x,T1)#(pi\<bullet>\<Gamma>))  \<turnstile> (App (pi\<bullet>s) (Var (pi\<bullet>x))) <=> (App (pi\<bullet>t) (Var (pi\<bullet>x))) : T2" using perm_ty by auto
   963   ultimately have "((pi\<bullet>x,T1)#(pi\<bullet>\<Gamma>))  \<turnstile> (App (pi\<bullet>s) (Var (pi\<bullet>x))) <=> (App (pi\<bullet>t) (Var (pi\<bullet>x))) : T2" 
       
   964     using perm_ty by auto
   988   then show ?case using h by auto
   965   then show ?case using h by auto
   989 qed (auto elim:whn_eqvt valid_eqvt)
   966 qed (auto elim:whn_eqvt valid_eqvt)
   990  
   967  
   991 (* FIXME this lemma should not be here I am reinventing the wheel I guess *)
   968 (* FIXME this lemma should not be here I am reinventing the wheel I guess *)
   992 
   969 
  1269   ultimately show "\<Gamma>' \<turnstile> \<gamma><s> is \<theta><u> : T" using logical_transitivity by blast
  1246   ultimately show "\<Gamma>' \<turnstile> \<gamma><s> is \<theta><u> : T" using logical_transitivity by blast
  1270 next
  1247 next
  1271   case (Q_Abs x \<Gamma> T1 s2 t2 T2 \<Gamma>' \<gamma> \<theta>)
  1248   case (Q_Abs x \<Gamma> T1 s2 t2 T2 \<Gamma>' \<gamma> \<theta>)
  1272   have fs:"x\<sharp>\<Gamma>" by fact
  1249   have fs:"x\<sharp>\<Gamma>" by fact
  1273   have fs2: "x\<sharp>\<gamma>" "x\<sharp>\<theta>" by fact 
  1250   have fs2: "x\<sharp>\<gamma>" "x\<sharp>\<theta>" by fact 
  1274   have h1:"(x,T1)#\<Gamma> \<turnstile> s2 == t2 : T2" by fact
       
  1275   have h2:"\<Gamma>' \<turnstile> \<gamma> is \<theta> over \<Gamma>" by fact
  1251   have h2:"\<Gamma>' \<turnstile> \<gamma> is \<theta> over \<Gamma>" by fact
  1276   have ih:"\<And>\<Gamma>' \<gamma> \<theta>. \<Gamma>' \<turnstile> \<gamma> is \<theta> over (x,T1)#\<Gamma> \<Longrightarrow> \<Gamma>' \<turnstile> \<gamma><s2> is \<theta><t2> : T2" by fact
  1252   have ih:"\<And>\<Gamma>' \<gamma> \<theta>. \<Gamma>' \<turnstile> \<gamma> is \<theta> over (x,T1)#\<Gamma> \<Longrightarrow> \<Gamma>' \<turnstile> \<gamma><s2> is \<theta><t2> : T2" by fact
  1277   {
  1253   {
  1278     fix \<Gamma>'' s' t'
  1254     fix \<Gamma>'' s' t'
  1279     assume "\<Gamma>'\<lless>\<Gamma>''" and hl:"\<Gamma>''\<turnstile> s' is t' : T1"
  1255     assume "\<Gamma>'\<lless>\<Gamma>''" and hl:"\<Gamma>''\<turnstile> s' is t' : T1"