3138
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 1
theory Lambda imports "../Nominal2" begin
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 2
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 3
atom_decl name
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 4
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 5
nominal_datatype lam =
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 6
Var "name"
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 7
| App "lam" "lam"
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 8
| Lam x::"name" l::"lam" binds x in l ("Lam [_]. _" [100, 100] 100)
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 9
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 10
nominal_primrec lam_rec ::
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 11
"(name \<Rightarrow> 'a :: pt) \<Rightarrow> (lam \<Rightarrow> lam \<Rightarrow> 'a) \<Rightarrow> (name \<Rightarrow> lam \<Rightarrow> 'a) \<Rightarrow> 'a \<Rightarrow> 'b :: fs \<Rightarrow> lam \<Rightarrow> 'a"
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 12
where
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 13
"lam_rec fv fa fl fd P (Var n) = fv n"
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 14
| "lam_rec fv fa fl fd P (App l r) = fa l r"
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 15
| "(atom x \<sharp> P \<and> (\<forall>y s. atom y \<sharp> P \<longrightarrow> Lam [x]. t = Lam [y]. s \<longrightarrow> fl x t = fl y s)) \<Longrightarrow>
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 16
lam_rec fv fa fl fd P (Lam [x]. t) = fl x t"
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 17
| "(atom x \<sharp> P \<and> \<not>(\<forall>y s. atom y \<sharp> P \<longrightarrow> Lam [x]. t = Lam [y]. s \<longrightarrow> fl x t = fl y s)) \<Longrightarrow>
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 18
lam_rec fv fa fl fd P (Lam [x]. t) = fd"
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 19
apply (simp add: eqvt_def lam_rec_graph_def)
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 20
apply (rule, perm_simp, rule, rule)
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 21
apply (case_tac x)
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 22
apply (rule_tac y="f" and c="e" in lam.strong_exhaust)
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 23
apply metis
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 24
apply metis
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 25
unfolding fresh_star_def
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 26
apply simp
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 27
apply metis
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 28
apply simp_all[2]
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 29
apply (metis (no_types) Pair_inject lam.distinct)+
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 30
apply simp
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 31
apply (metis (no_types) Pair_inject lam.distinct)+
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 32
done
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 33
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 34
termination (eqvt) by lexicographic_order
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 35
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 36
lemma lam_rec_cong[fundef_cong]:
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 37
" (\<And>v. l = Var v \<Longrightarrow> fv v = fv' v) \<Longrightarrow>
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 38
(\<And>t1 t2. l = App t1 t2 \<Longrightarrow> fa t1 t2 = fa' t1 t2) \<Longrightarrow>
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 39
(\<And>n t. l = Lam [n]. t \<Longrightarrow> fl n t = fl' n t) \<Longrightarrow>
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 40
lam_rec fv fa fl fd P l = lam_rec fv' fa' fl' fd P l"
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 41
apply (rule_tac y="l" and c="P" in lam.strong_exhaust)
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 42
apply auto
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 43
apply (case_tac "(\<forall>y s. atom y \<sharp> P \<longrightarrow> Lam [name]. lam = Lam [y]. s \<longrightarrow> fl name lam = fl y s)")
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 44
apply (subst lam_rec.simps) apply (simp add: fresh_star_def)
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 45
apply (subst lam_rec.simps) apply (simp add: fresh_star_def)
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 46
using Abs1_eq_iff lam.eq_iff apply metis
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 47
apply (subst lam_rec.simps(4)) apply (simp add: fresh_star_def)
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 48
apply (subst lam_rec.simps(4)) apply (simp add: fresh_star_def)
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 49
using Abs1_eq_iff lam.eq_iff apply metis
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 50
done
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 51
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 52
nominal_primrec substr where
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 53
[simp del]: "substr l y s = lam_rec
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 54
(%x. if x = y then s else (Var x))
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 55
(%t1 t2. App (substr t1 y s) (substr t2 y s))
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 56
(%x t. Lam [x]. (substr t y s)) (Lam [y]. Var y) (y, s) l"
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 57
unfolding eqvt_def substr_graph_def
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 58
apply (rule, perm_simp, rule, rule)
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 59
by pat_completeness auto
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 60
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 61
termination (eqvt) by lexicographic_order
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 62
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 63
lemma fresh_fun_eqvt_app3:
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 64
assumes e: "eqvt f"
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 65
shows "\<lbrakk>a \<sharp> x; a \<sharp> y; a \<sharp> z\<rbrakk> \<Longrightarrow> a \<sharp> f x y z"
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 66
using fresh_fun_eqvt_app[OF e] fresh_fun_app by (metis (lifting, full_types))
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 67
3143
1da802bd2ab1
Correct Aux and proof sketch that it's same as alpha-equality, following Dan Synek's proof.
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
diff
changeset
+ − 68
lemma substr_simps:
3138
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 69
"substr (Var x) y s = (if x = y then s else (Var x))"
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 70
"substr (App t1 t2) y s = App (substr t1 y s) (substr t2 y s)"
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 71
"atom x \<sharp> (y, s) \<Longrightarrow> substr (Lam [x]. t) y s = Lam [x]. (substr t y s)"
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 72
apply (subst substr.simps) apply (simp only: lam_rec.simps)
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 73
apply (subst substr.simps) apply (simp only: lam_rec.simps)
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 74
apply (subst substr.simps) apply (subst lam_rec.simps)
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 75
apply (auto simp add: Abs1_eq_iff substr.eqvt swap_fresh_fresh)
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 76
apply (rule fresh_fun_eqvt_app3[of substr])
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 77
apply (simp add: eqvt_def eqvts_raw)
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 78
apply (simp_all add: fresh_Pair)
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 79
done
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 80
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 81
end
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 82
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 83
Cezary Kaliszyk <cezarykaliszyk@gmail.com>
parents:
diff
changeset
+ − 84