fun lookup :: "name list → nat → name → dbtm" where "lookup [] n x = DBVar x"
| "lookup (y # ys) n x = (if x = y then DBInd n else (lookup ys (Suc n) x))"
lemma fresh_imp_notin_env: "atom name ♯ e ==> name ∉ set e" by (metis List.finite_set fresh_finite_set_at_base fresh_set)
lemma lookup_notin: "x ∉ set e ==> lookup e n x = DBVar x" by (induct e arbitrary: n) auto
lemma lookup_in: "x ∈ set e ==>∃k. lookup e n x = DBInd k ∧ n ≤ k ∧ k < n + length e" by (induction e arbitrary: n) force+
lemma lookup_fresh: "x ♯ lookup e n y ⟷ y ∈ set e ∨ x ≠ atom y" by (induct arbitrary: n rule: lookup.induct) (auto simp: pure_fresh fresh_at_base)
lemma lookup_inject [iff]: "(lookup e n x = lookup e n y) ⟷ x = y" proof (induction e n x arbitrary: y rule: lookup.induct) case (2 y ys n x z) thenshow ?case by (metis dbtm.distinct(7) dbtm.eq_iff(3) lookup.simps(2) lookup_in lookup_notin not_less_eq_eq) qed auto
nominal_function trans_tm :: "name list → tm → dbtm" where "trans_tm e Zero = DBZero"
| "trans_tm e (Var k) = lookup e 0 k"
| "trans_tm e (Eats t u) = DBEats (trans_tm e t) (trans_tm e u)" by (auto simp: eqvt_def trans_tm_graph_aux_def) (metis tm.strong_exhaust)
nominal_termination (eqvt) by lexicographic_order
lemma fresh_trans_tm_iff [simp]: "i ♯ trans_tm e t ⟷ i ♯ t ∨ i ∈ atom ` set e" by (induct t rule: tm.induct, auto simp: lookup_fresh fresh_at_base)
lemma trans_tm_forget: "atom i ♯ t ==> trans_tm [i] t = trans_tm [] t" by (induct t rule: tm.induct, auto simp: fresh_Pair)
nominal_function (invariant "λ(xs, _) y. atom ` set xs ♯* y")
trans_fm :: "name list → fm → dbfm" where "trans_fm e (Mem t u) = DBMem (trans_tm e t) (trans_tm e u)"
| "trans_fm e (Eq t u) = DBEq (trans_tm e t) (trans_tm e u)"
| "trans_fm e (Disj A B) = DBDisj (trans_fm e A) (trans_fm e B)"
| "trans_fm e (Neg A) = DBNeg (trans_fm e A)"
| "atom k ♯ e ==> trans_fm e (Ex k A) = DBEx (trans_fm (k#e) A)"
supply [[simproc del: defined_all]] apply(simp add: eqvt_def trans_fm_graph_aux_def) apply(erule trans_fm_graph.induct) using [[simproc del: alpha_lst]] apply(auto simp: fresh_star_def) apply (metis fm.strong_exhaust fresh_star_insert) apply(erule Abs_lst1_fcb2') apply (simp_all add: eqvt_at_def) apply (simp_all add: fresh_star_Pair perm_supp_eq) apply (simp add: fresh_star_def) done
nominal_termination (eqvt) by lexicographic_order
lemma fresh_trans_fm [simp]: "i ♯ trans_fm e A ⟷ i ♯ A ∨ i ∈ atom ` set e" by (nominal_induct A avoiding: e rule: fm.strong_induct, auto simp: fresh_at_base)
abbreviation DBConj :: "dbfm → dbfm → dbfm" where"DBConj t u ≡ DBNeg (DBDisj (DBNeg t) (DBNeg u))"
lemma trans_fm_Conj [simp]: "trans_fm e (Conj A B) = DBConj (trans_fm e A) (trans_fm e B)" by (simp add: Conj_def)
lemma trans_tm_inject [iff]: "(trans_tm e t = trans_tm e u) ⟷ t = u" proof (induct t arbitrary: u rule: tm.induct) case Zero show ?case apply (cases u rule: tm.exhaust, auto) apply (metis dbtm.distinct(1) dbtm.distinct(3) lookup_in lookup_notin) done next case (Var i) show ?case apply (cases u rule: tm.exhaust, auto) apply (metis dbtm.distinct(1) dbtm.distinct(3) lookup_in lookup_notin) apply (metis dbtm.distinct(10) dbtm.distinct(11) lookup_in lookup_notin) done next case (Eats tm1 tm2) thus ?case apply (cases u rule: tm.exhaust, auto) apply (metis dbtm.distinct(12) dbtm.distinct(9) lookup_in lookup_notin) done qed
lemma trans_fm_inject [iff]: "(trans_fm e A = trans_fm e B) ⟷ A = B" proof (nominal_induct A avoiding: e B rule: fm.strong_induct) case (Mem tm1 tm2) thus ?case by (rule fm.strong_exhaust [where y=B and c=e]) (auto simp: fresh_star_def) next case (Eq tm1 tm2) thus ?case by (rule fm.strong_exhaust [where y=B and c=e]) (auto simp: fresh_star_def) next case (Disj fm1 fm2) show ?case by (rule fm.strong_exhaust [where y=B and c=e]) (auto simp: Disj fresh_star_def) next case (Neg fm) show ?case by (rule fm.strong_exhaust [where y=B and c=e]) (auto simp: Neg fresh_star_def) next case (Ex name fm) thus ?caseusing [[simproc del: alpha_lst]] proof (cases rule: fm.strong_exhaust [where y=B and c="(e, name)"], simp_all add: fresh_star_def) fix name'::name and fm'::fm assume name': "atom name' ♯ (e, name)" assume"atom name ♯ fm' ∨ name = name'" thus"(trans_fm (name # e) fm = trans_fm (name' # e) fm') = ([[atom name]]lst. fm = [[atom name']]lst. fm')"
(is"?lhs = ?rhs") proof (rule disjE) assume"name = name'" thus"?lhs = ?rhs" by (metis fresh_Pair fresh_at_base(2) name') next assume name: "atom name ♯ fm'" have eq1: "(name ↔ name') ∙ trans_fm (name' # e) fm' = trans_fm (name' # e) fm'" by (simp add: flip_fresh_fresh name) have eq2: "(name ↔ name') ∙ ([[atom name']]lst. fm') = [[atom name']]lst. fm'" by (rule flip_fresh_fresh) (auto simp: Abs_fresh_iff name) show"?lhs = ?rhs"using name' eq1 eq2 Ex(1) Ex(3) [of "name#e""(name ↔ name') ∙ fm'"] by (simp add: flip_fresh_fresh) (metis Abs1_eq(3)) qed qed qed
lemma trans_fm_perm: assumes c: "atom c ♯ (i,j,A,B)" and t: "trans_fm [i] A = trans_fm [j] B" shows"(i ↔ c) ∙ A = (j ↔ c) ∙ B" proof - have c_fresh1: "atom c ♯ trans_fm [i] A" using c by (auto simp: supp_Pair) moreover have i_fresh: "atom i ♯ trans_fm [i] A" by auto moreover have c_fresh2: "atom c ♯ trans_fm [j] B" using c by (auto simp: supp_Pair) moreover have j_fresh: "atom j ♯ trans_fm [j] B" by auto ultimatelyhave"((i ↔ c) ∙ (trans_fm [i] A)) = ((j ↔ c) ∙ trans_fm [j] B)" by (simp only: flip_fresh_fresh t) thenhave"trans_fm [c] ((i ↔ c) ∙ A) = trans_fm [c] ((j ↔ c) ∙ B)" by simp thenshow"(i ↔ c) ∙ A = (j ↔ c) ∙ B"by simp qed
section‹Abstraction and Substitution on de Bruijn Formulas›
nominal_function abst_dbtm :: "name → nat → dbtm → dbtm" where "abst_dbtm name i DBZero = DBZero"
| "abst_dbtm name i (DBVar name') = (if name = name' then DBInd i else DBVar name')"
| "abst_dbtm name i (DBInd j) = DBInd j"
| "abst_dbtm name i (DBEats t1 t2) = DBEats (abst_dbtm name i t1) (abst_dbtm name i t2)" apply (simp add: eqvt_def abst_dbtm_graph_aux_def, auto) apply (metis dbtm.exhaust) done
nominal_termination (eqvt) by lexicographic_order
nominal_function subst_dbtm :: "dbtm → name → dbtm → dbtm" where "subst_dbtm u x DBZero = DBZero"
| "subst_dbtm u x (DBVar name) = (if x = name then u else DBVar name)"
| "subst_dbtm u x (DBInd j) = DBInd j"
| "subst_dbtm u x (DBEats t1 t2) = DBEats (subst_dbtm u x t1) (subst_dbtm u x t2)" by (auto simp: eqvt_def subst_dbtm_graph_aux_def) (metis dbtm.exhaust)
nominal_termination (eqvt) by lexicographic_order
lemma fresh_iff_non_subst_dbtm: "subst_dbtm DBZero i t = t ⟷ atom i ♯ t" by (induct t rule: dbtm.induct) (auto simp: pure_fresh fresh_at_base(2))
lemma lookup_append: "lookup (e @ [i]) n j = abst_dbtm i (length e + n) (lookup e n j)" by (induct e arbitrary: n) (auto simp: fresh_Cons)
lemma trans_tm_abs: "trans_tm (e@[name]) t = abst_dbtm name (length e) (trans_tm e t)" by (induct t rule: tm.induct) (auto simp: lookup_notin lookup_append)
subsection‹Well-Formed Formulas›
nominal_function abst_dbfm :: "name → nat → dbfm → dbfm" where "abst_dbfm name i (DBMem t1 t2) = DBMem (abst_dbtm name i t1) (abst_dbtm name i t2)"
| "abst_dbfm name i (DBEq t1 t2) = DBEq (abst_dbtm name i t1) (abst_dbtm name i t2)"
| "abst_dbfm name i (DBDisj A1 A2) = DBDisj (abst_dbfm name i A1) (abst_dbfm name i A2)"
| "abst_dbfm name i (DBNeg A) = DBNeg (abst_dbfm name i A)"
| "abst_dbfm name i (DBEx A) = DBEx (abst_dbfm name (i+1) A)" apply (simp add: eqvt_def abst_dbfm_graph_aux_def, auto) apply (metis dbfm.exhaust) done
nominal_termination (eqvt) by lexicographic_order
nominal_function subst_dbfm :: "dbtm → name → dbfm → dbfm" where "subst_dbfm u x (DBMem t1 t2) = DBMem (subst_dbtm u x t1) (subst_dbtm u x t2)"
| "subst_dbfm u x (DBEq t1 t2) = DBEq (subst_dbtm u x t1) (subst_dbtm u x t2)"
| "subst_dbfm u x (DBDisj A1 A2) = DBDisj (subst_dbfm u x A1) (subst_dbfm u x A2)"
| "subst_dbfm u x (DBNeg A) = DBNeg (subst_dbfm u x A)"
| "subst_dbfm u x (DBEx A) = DBEx (subst_dbfm u x A)" by (auto simp: eqvt_def subst_dbfm_graph_aux_def) (metis dbfm.exhaust)
nominal_termination (eqvt) by lexicographic_order
lemma fresh_iff_non_subst_dbfm: "subst_dbfm DBZero i t = t ⟷ atom i ♯ t" by (induct t rule: dbfm.induct) (auto simp: fresh_iff_non_subst_dbtm)
section‹Well formed terms and formulas (de Bruijn representation)›
lemma wf_dbtm_imp_is_tm: assumes"wf_dbtm x" shows"∃t::tm. x = trans_tm [] t" using assms proof (induct rule: wf_dbtm.induct) case Zero thus ?case by (metis trans_tm.simps(1)) next case (Var i) thus ?case by (metis lookup.simps(1) trans_tm.simps(2)) next case (Eats dt1 dt2) thus ?case by (metis trans_tm.simps(3)) qed
lemma wf_dbtm_trans_tm: "wf_dbtm (trans_tm [] t)" by (induct t rule: tm.induct) auto
theorem wf_dbtm_iff_is_tm: "wf_dbtm x ⟷ (∃t::tm. x = trans_tm [] t)" by (metis wf_dbtm_imp_is_tm wf_dbtm_trans_tm)
lemma atom_fresh_abst_dbtm [simp]: "atom i ♯ abst_dbtm i n t" by (induct t rule: dbtm.induct) (auto simp: pure_fresh)
lemma atom_fresh_abst_dbfm [simp]: "atom i ♯ abst_dbfm i n A" by (nominal_induct A arbitrary: n rule: dbfm.strong_induct) auto
text‹Setting up strong induction: "avoiding" for name. Necessary to allow some proofs to go through› nominal_inductive wf_dbfm avoids Ex: name by (auto simp: fresh_star_def)
lemma trans_fm_abs: "trans_fm (e@[name]) A = abst_dbfm name (length e) (trans_fm e A)" apply (nominal_induct A avoiding: name e rule: fm.strong_induct) apply (auto simp: trans_tm_abs fresh_Cons fresh_append) by (metis append_Cons length_Cons)
lemma abst_trans_fm: "abst_dbfm name 0 (trans_fm [] A) = trans_fm [name] A" by (metis append_Nil list.size(3) trans_fm_abs)
lemma abst_trans_fm2: "i ≠ j ==> abst_dbfm i (Suc 0) (trans_fm [j] A) = trans_fm [j,i] A" using trans_fm_abs [where e="[j]"and name=i] by auto
lemma wf_dbfm_imp_is_fm: assumes"wf_dbfm x"shows"∃A::fm. x = trans_fm [] A" using assms proof (induct rule: wf_dbfm.induct) case (Mem t1 t2) thus ?case by (metis trans_fm.simps(1) wf_dbtm_imp_is_tm) next case (Eq t1 t2) thus ?case by (metis trans_fm.simps(2) wf_dbtm_imp_is_tm) next case (Disj fm1 fm2) thus ?case by (metis trans_fm.simps(3)) next case (Neg fm) thus ?case by (metis trans_fm.simps(4)) next case (Ex fm name) thus ?case apply auto apply (rule_tac x="Ex name A"in exI) apply (auto simp: abst_trans_fm) done qed
lemma wf_dbfm_iff_is_fm: "wf_dbfm x ⟷ (∃A::fm. x = trans_fm [] A)" by (metis wf_dbfm_imp_is_fm wf_dbfm_trans_fm)
lemma dbtm_abst_ignore [simp]: "abst_dbtm name i (abst_dbtm name j t) = abst_dbtm name j t" by (induct t rule: dbtm.induct) auto
lemma abst_dbtm_fresh_ignore [simp]: "atom name ♯ u ==> abst_dbtm name j u = u" by (induct u rule: dbtm.induct) auto
lemma dbtm_subst_ignore [simp]: "subst_dbtm u name (abst_dbtm name j t) = abst_dbtm name j t" by (induct t rule: dbtm.induct) auto
lemma dbtm_abst_swap_subst: "name ≠ name' ==> atom name' ♯ u ==> subst_dbtm u name (abst_dbtm name' j t) = abst_dbtm name' j (subst_dbtm u name t)" by (induct t rule: dbtm.induct) auto
lemma dbfm_abst_swap_subst: "name ≠ name' ==> atom name' ♯ u ==> subst_dbfm u name (abst_dbfm name' j A) = abst_dbfm name' j (subst_dbfm u name A)" by (induct A arbitrary: j rule: dbfm.induct) (auto simp: dbtm_abst_swap_subst)
lemma subst_trans_commute [simp]: "atom i ♯ e ==> subst_dbtm (trans_tm e u) i (trans_tm e t) = trans_tm e (subst i u t)" apply (induct t rule: tm.induct) apply (auto simp: lookup_notin fresh_imp_notin_env) by (metis abst_dbtm_fresh_ignore atom_eq_iff dbtm_subst_ignore lookup_fresh)
lemma subst_fm_trans_commute [simp]: "subst_dbfm (trans_tm [] u) name (trans_fm [] A) = trans_fm [] (A (name::= u))" apply (nominal_induct A avoiding: name u rule: fm.strong_induct) apply (auto simp: lookup_notin dbfm_abst_swap_subst simp flip: abst_trans_fm) done
lemma subst_fm_trans_commute_eq: "du = trans_tm [] u ==> subst_dbfm du i (trans_fm [] A) = trans_fm [] (A(i::=u))" by (metis subst_fm_trans_commute)
fun HTuple :: "nat → tm"where "HTuple 0 = HPair Zero Zero"
| "HTuple (Suc k) = HPair Zero (HTuple k)"
lemma eval_tm_HTuple [simp]: "[HTuple n]e = htuple n" by (induct n) auto
lemma fresh_HTuple [simp]: "x ♯ HTuple n" by (induct n) auto
lemma HTuple_eqvt[eqvt]: "(p ∙ HTuple n) = HTuple (p ∙ n)" by (induct n, auto simp: HPair_eqvt permute_pure)
lemma htuple_nonzero [simp]: "htuple k ≠ 0" by (induct k) auto
lemma htuple_inject [iff]: "htuple i = htuple j ⟷ i=j" proof (induct i arbitrary: j) case0show ?case by (cases j) auto next case (Suc i) show ?case by (cases j) (auto simp: Suc) qed
lemma HPair_neq_ORD_OF [simp]: "HPair x y ≠ ORD_OF i" by (metis Not_Ord_hpair Ord_ord_of eval_tm_HPair eval_tm_ORD_OF)
text‹Infinite support, so we cannot use nominal primrec.› function quot_dbtm :: "dbtm → tm" where "quot_dbtm DBZero = Zero"
| "quot_dbtm (DBVar name) = ORD_OF (Suc (nat_of_name name))"
| "quot_dbtm (DBInd k) = HPair (HTuple 6) (ORD_OF k)"
| "quot_dbtm (DBEats t u) = HPair (HTuple 1) (HPair (quot_dbtm t) (quot_dbtm u))" by (rule dbtm.exhaust) auto
termination by lexicographic_order
lemma quot_dbtm_inject_lemma [simp]: "[quot_dbtm t]e = [quot_dbtm u]e ⟷ t=u" proof (induct t arbitrary: u rule: dbtm.induct) case DBZero show ?case by (induct u rule: dbtm.induct) auto next case (DBVar name) show ?case by (induct u rule: dbtm.induct) (auto simp: hpair_neq_Ord') next case (DBInd k) show ?case by (induct u rule: dbtm.induct) (auto simp: hpair_neq_Ord hpair_neq_Ord') next case (DBEats t1 t2) thus ?case by (induct u rule: dbtm.induct) (simp_all add: hpair_neq_Ord) qed
lemma quot_dbtm_inject [iff]: "quot_dbtm t = quot_dbtm u ⟷ t=u" by (metis quot_dbtm_inject_lemma)
subsection‹Quotations of de Bruijn formulas›
text‹Infinite support, so we cannot use nominal primrec.› function quot_dbfm :: "dbfm → tm" where "quot_dbfm (DBMem t u) = HPair (HTuple 0) (HPair (quot_dbtm t) (quot_dbtm u))"
| "quot_dbfm (DBEq t u) = HPair (HTuple 2) (HPair (quot_dbtm t) (quot_dbtm u))"
| "quot_dbfm (DBDisj A B) = HPair (HTuple 3) (HPair (quot_dbfm A) (quot_dbfm B))"
| "quot_dbfm (DBNeg A) = HPair (HTuple 4) (quot_dbfm A)"
| "quot_dbfm (DBEx A) = HPair (HTuple 5) (quot_dbfm A)" by (rule_tac y=x in dbfm.exhaust, auto)
termination by lexicographic_order
lemma htuple_minus_1: "n > 0 ==> htuple n = ⟨0, htuple (n - 1)⟩" by (metis Suc_diff_1 htuple.simps(2))
lemma HTuple_minus_1: "n > 0 ==> HTuple n = HPair Zero (HTuple (n - 1))" by (metis Suc_diff_1 HTuple.simps(2))
lemmas HTS = HTuple_minus_1 HTuple.simps ―‹for freeness reasoning on codes›
lemma quot_dbfm_inject_lemma [simp]: "[quot_dbfm A]e = [quot_dbfm B]e ⟷ A=B" proof (induct A arbitrary: B rule: dbfm.induct) case (DBMem t u) show ?case by (induct B rule: dbfm.induct) (simp_all add: htuple_minus_1) next case (DBEq t u) show ?case by (induct B rule: dbfm.induct) (auto simp: htuple_minus_1) next case (DBDisj A B') thus ?case by (induct B rule: dbfm.induct) (simp_all add: htuple_minus_1) next case (DBNeg A) thus ?case by (induct B rule: dbfm.induct) (simp_all add: htuple_minus_1) next case (DBEx A) thus ?case by (induct B rule: dbfm.induct) (simp_all add: htuple_minus_1) qed
class quot = fixes quot :: "'a → tm" (‹«_¬›)
instantiation tm :: quot begin definition quot_tm :: "tm → tm" where"quot_tm t = quot_dbtm (trans_tm [] t)"
instance .. end
lemma quot_dbtm_fresh [simp]: "s ♯ (quot_dbtm t)" by (induct t rule: dbtm.induct) auto
lemma quot_Eats: "«Eats x y¬ = HPair (HTuple 1) (HPair «x¬«y¬)" by (simp add: quot_tm_def)
text‹irrelevance of the environment for quotations, because they are ground terms› lemma eval_quot_dbtm_ignore: "[quot_dbtm t]e = [quot_dbtm t]e'" by (induct t rule: dbtm.induct) auto
lemma eval_quot_dbfm_ignore: "[quot_dbfm A]e = [quot_dbfm A]e'" by (induct A rule: dbfm.induct) (auto intro: eval_quot_dbtm_ignore)
instantiation fm :: quot begin definition quot_fm :: "fm → tm" where"quot_fm A = quot_dbfm (trans_fm [] A)"
instance .. end
lemma quot_dbfm_fresh [simp]: "s ♯ (quot_dbfm A)" by (induct A rule: dbfm.induct) auto
lemma q_Eats_iff [iff]: "q_Eats x y = q_Eats x' y' ⟷ x=x' ∧ y=y'" by (metis hpair_iff q_Eats_def)
lemma quot_subst_eq: "«A(i::=t)¬ = quot_dbfm (subst_dbfm (trans_tm [] t) i (trans_fm [] A))" by (metis quot_fm_def subst_fm_trans_commute)
lemma Q_Succ_cong: "H ⊨ x EQ x' ==> H ⊨ Q_Succ x EQ Q_Succ x'" by (metis HPair_cong Refl)
section‹Quotations are Injective›
subsection‹Terms›
lemma eval_tm_inject [simp]: fixes t::tm shows"[«t¬] e = [«u¬] e ⟷ t=u" proof (induct t arbitrary: u rule: tm.induct) case Zero thus ?case by (cases u rule: tm.exhaust) (auto simp: quot_Var quot_Eats) next case (Var i) thus ?case apply (cases u rule: tm.exhaust, auto) apply (auto simp: quot_Var quot_Eats) done next case (Eats t1 t2) thus ?case apply (cases u rule: tm.exhaust, auto) apply (auto simp: quot_Eats quot_Var) done qed
subsection‹Formulas›
lemma eval_fm_inject [simp]: fixes A::fm shows"[«A¬] e = [«B¬] e ⟷ A=B" proof (nominal_induct B arbitrary: A rule: fm.strong_induct) case (Mem tm1 tm2) thus ?case by (cases A rule: fm.exhaust, auto simp: quot_simps htuple_minus_1) next case (Eq tm1 tm2) thus ?case by (cases A rule: fm.exhaust, auto simp: quot_simps htuple_minus_1) next case (Neg α) thus ?case by (cases A rule: fm.exhaust, auto simp: quot_simps htuple_minus_1) next case (Disj fm1 fm2) thus ?case by (cases A rule: fm.exhaust, auto simp: quot_simps htuple_minus_1) next case (Ex i α) thus ?case apply (induct A arbitrary: i rule: fm.induct) apply (auto simp: trans_fm_perm quot_simps htuple_minus_1 Abs1_eq_iff_all) by (metis (no_types) Abs1_eq_iff_all(3) dbfm.eq_iff(5) fm.eq_iff(5) fresh_Nil trans_fm.simps(5)) qed
subsection‹The set ‹Γ› of Definition 1.1, constant terms used for coding›
inductive coding_tm :: "tm → bool" where
Ord: "∃i. x = ORD_OF i ==> coding_tm x"
| HPair: "coding_tm x ==> coding_tm y ==> coding_tm (HPair x y)"
declare coding_tm.intros [intro]
lemma coding_tm_Zero [intro]: "coding_tm Zero" by (metis ORD_OF.simps(1) Ord)
lemma coding_tm_HTuple [intro]: "coding_tm (HTuple k)" by (induct k, auto)
inductive_simps coding_tm_HPair [simp]: "coding_tm (HPair x y)"
lemma coding_tm_hf [simp]: "coding_tm t ==> coding_hf [t]e" by (induct t rule: coding_tm.induct) auto
section‹V-Coding for terms and formulas, for the Second Theorem›
text‹Infinite support, so we cannot use nominal primrec.› function vquot_dbtm :: "name set → dbtm → tm" where "vquot_dbtm V DBZero = Zero"
| "vquot_dbtm V (DBVar name) = (if name ∈ V then Var name else ORD_OF (Suc (nat_of_name name)))"
| "vquot_dbtm V (DBInd k) = HPair (HTuple 6) (ORD_OF k)"
| "vquot_dbtm V (DBEats t u) = HPair (HTuple 1) (HPair (vquot_dbtm V t) (vquot_dbtm V u))" by (auto, rule_tac y=b in dbtm.exhaust, auto)
termination by lexicographic_order
lemma fresh_vquot_dbtm [simp]: "i ♯ vquot_dbtm V tm ⟷ i ♯ tm ∨ i ∉ atom ` V" by (induct tm rule: dbtm.induct) (auto simp: fresh_at_base pure_fresh)
text‹Infinite support, so we cannot use nominal primrec.› function vquot_dbfm :: "name set → dbfm → tm" where "vquot_dbfm V (DBMem t u) = HPair (HTuple 0) (HPair (vquot_dbtm V t) (vquot_dbtm V u))"
| "vquot_dbfm V (DBEq t u) = HPair (HTuple 2) (HPair (vquot_dbtm V t) (vquot_dbtm V u))"
| "vquot_dbfm V (DBDisj A B) = HPair (HTuple 3) (HPair (vquot_dbfm V A) (vquot_dbfm V B))"
| "vquot_dbfm V (DBNeg A) = HPair (HTuple 4) (vquot_dbfm V A)"
| "vquot_dbfm V (DBEx A) = HPair (HTuple 5) (vquot_dbfm V A)" by (auto, rule_tac y=b in dbfm.exhaust, auto)
termination by lexicographic_order
lemma fresh_vquot_dbfm [simp]: "i ♯ vquot_dbfm V fm ⟷ i ♯ fm ∨ i ∉ atom ` V" by (induct fm rule: dbfm.induct) (auto simp: HPair_def HTuple_minus_1)
class vquot = fixes vquot :: "'a → name set → tm" (‹⌊_⌋_› [0,1000]1000)
instantiation tm :: vquot begin definition vquot_tm :: "tm → name set → tm" where"vquot_tm t V = vquot_dbtm V (trans_tm [] t)" instance .. end
lemma vquot_dbtm_empty [simp]: "vquot_dbtm {} t = quot_dbtm t" by (induct t rule: dbtm.induct) auto
lemma vquot_dbtm_eq: "atom ` V ∩ supp t = atom ` W ∩ supp t ==> vquot_dbtm V t = vquot_dbtm W t" by (induct t rule: dbtm.induct) (auto simp: image_iff, blast+)
instantiation fm :: vquot begin definition vquot_fm :: "fm → name set → tm" where"vquot_fm A V = vquot_dbfm V (trans_fm [] A)" instance .. end
lemma vquot_fm_fresh [simp]: fixes A::fm shows"i ♯⌊A⌋V ⟷ i ♯ A ∨ i ∉ atom ` V" by (simp add: vquot_fm_def)
lemma vquot_dbfm_empty [simp]: "vquot_dbfm {} A = quot_dbfm A" by (induct A rule: dbfm.induct) auto
lemma vquot_dbfm_eq: "atom ` V ∩ supp A = atom ` W ∩ supp A ==> vquot_dbfm V A = vquot_dbfm W A" by (induct A rule: dbfm.induct) (auto simp: intro!: vquot_dbtm_eq, blast+)
lemma vquot_fm_insert: fixes A::fm shows"atom i ∉ supp A ==>⌊A⌋(insert i V) = ⌊A⌋V" by (auto simp: vquot_fm_def supp_conv_fresh intro: vquot_dbfm_eq)
declare HTuple.simps [simp del]
end
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.5 Sekunden
(vorverarbeitet am 2026-07-03)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.