diff --git a/thys/Goedel_HFSet_Semanticless/Coding.thy b/thys/Goedel_HFSet_Semanticless/Coding.thy --- a/thys/Goedel_HFSet_Semanticless/Coding.thy +++ b/thys/Goedel_HFSet_Semanticless/Coding.thy @@ -1,681 +1,681 @@ chapter\De Bruijn Syntax, Quotations, Codes, V-Codes\ theory Coding imports SyntaxN begin declare fresh_Nil [iff] section \de Bruijn Indices (locally-nameless version)\ nominal_datatype dbtm = DBZero | DBVar name | DBInd nat | DBEats dbtm dbtm nominal_datatype dbfm = DBMem dbtm dbtm | DBEq dbtm dbtm | DBDisj dbfm dbfm | DBNeg dbfm | DBEx dbfm declare dbtm.supp [simp] declare dbfm.supp [simp] 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" apply (induct e arbitrary: n) apply (auto intro: Suc_leD) apply (metis Suc_leD add_Suc_right add_Suc_shift) done 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_eqvt[eqvt]: "(p \ lookup xs n x) = lookup (p \ xs) (p \ n) (p \ x)" by (induct xs arbitrary: n) (simp_all add: permute_pure) lemma lookup_inject [iff]: "(lookup e n x = lookup e n y) \ x = y" apply (induct e n x arbitrary: y rule: lookup.induct, force, simp) by (metis Suc_n_not_le_n dbtm.distinct(7) dbtm.eq_iff(3) lookup_in lookup_notin) 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)" 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(rule_tac y=b and c=a in fm.strong_exhaust) apply(auto simp: fresh_star_def) apply(erule_tac c=ea in 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: e 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 ?case using [[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 ultimately have "((i \ c) \ (trans_fm [i] A)) = ((j \ c) \ trans_fm [j] B)" by (simp only: flip_fresh_fresh t) then have "trans_fm [c] ((i \ c) \ A) = trans_fm [c] ((j \ c) \ B)" by simp then show "(i \ c) \ A = (j \ c) \ B" by simp qed section\Characterising the Well-Formed de Bruijn Formulas\ subsection\Well-Formed Terms\ inductive wf_dbtm :: "dbtm \ bool" where Zero: "wf_dbtm DBZero" | Var: "wf_dbtm (DBVar name)" | Eats: "wf_dbtm t1 \ wf_dbtm t2 \ wf_dbtm (DBEats t1 t2)" equivariance wf_dbtm inductive_cases Zero_wf_dbtm [elim!]: "wf_dbtm DBZero" inductive_cases Var_wf_dbtm [elim!]: "wf_dbtm (DBVar name)" inductive_cases Ind_wf_dbtm [elim!]: "wf_dbtm (DBInd i)" inductive_cases Eats_wf_dbtm [elim!]: "wf_dbtm (DBEats t1 t2)" declare wf_dbtm.intros [intro] 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) 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 i DBZero = DBZero" | "subst_dbtm u i (DBVar name) = (if i = name then u else DBVar name)" | "subst_dbtm u i (DBInd j) = DBInd j" | "subst_dbtm u i (DBEats t1 t2) = DBEats (subst_dbtm u i t1) (subst_dbtm u i 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 i (DBMem t1 t2) = DBMem (subst_dbtm u i t1) (subst_dbtm u i t2)" | "subst_dbfm u i (DBEq t1 t2) = DBEq (subst_dbtm u i t1) (subst_dbtm u i t2)" | "subst_dbfm u i (DBDisj A1 A2) = DBDisj (subst_dbfm u i A1) (subst_dbfm u i A2)" | "subst_dbfm u i (DBNeg A) = DBNeg (subst_dbfm u i A)" | "subst_dbfm u i (DBEx A) = DBEx (subst_dbfm u i 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)\ inductive wf_dbfm :: "dbfm \ bool" where Mem: "wf_dbtm t1 \ wf_dbtm t2 \ wf_dbfm (DBMem t1 t2)" | Eq: "wf_dbtm t1 \ wf_dbtm t2 \ wf_dbfm (DBEq t1 t2)" | Disj: "wf_dbfm A1 \ wf_dbfm A2 \ wf_dbfm (DBDisj A1 A2)" | Neg: "wf_dbfm A \ wf_dbfm (DBNeg A)" | Ex: "wf_dbfm A \ wf_dbfm (DBEx (abst_dbfm name 0 A))" equivariance wf_dbfm 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) inductive_cases Mem_wf_dbfm [elim!]: "wf_dbfm (DBMem t1 t2)" inductive_cases Eq_wf_dbfm [elim!]: "wf_dbfm (DBEq t1 t2)" inductive_cases Disj_wf_dbfm [elim!]: "wf_dbfm (DBDisj A1 A2)" inductive_cases Neg_wf_dbfm [elim!]: "wf_dbfm (DBNeg A)" inductive_cases Ex_wf_dbfm [elim!]: "wf_dbfm (DBEx z)" declare wf_dbfm.intros [intro] 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) apply (metis One_nat_def Suc_eq_plus1 append_Cons list.size(4)) done 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_trans_fm: "wf_dbfm (trans_fm [] A)" apply (nominal_induct A rule: fm.strong_induct) apply (auto simp: wf_dbtm_trans_tm abst_trans_fm) apply (metis abst_trans_fm wf_dbfm.Ex) done 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) apply (metis abst_dbtm_fresh_ignore dbtm_subst_ignore lookup_fresh lookup_notin subst_dbtm.simps(2)) done 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 abst_trans_fm [symmetric]) apply (metis dbfm_abst_swap_subst fresh_at_base(2) fresh_trans_tm_iff) 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) section\Quotations\ fun HTuple :: "nat \ tm" where "HTuple 0 = HPair Zero Zero" | "HTuple (Suc k) = HPair Zero (HTuple k)" 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) subsection \Quotations of de Bruijn terms\ definition nat_of_name :: "name \ nat" where "nat_of_name x = nat_of (atom x)" lemma nat_of_name_inject [simp]: "nat_of_name n1 = nat_of_name n2 \ n1 = n2" by (metis nat_of_name_def atom_components_eq_iff atom_eq_iff sort_of_atom_eq) definition name_of_nat :: "nat \ name" where "name_of_nat n \ Abs_name (Atom (Sort ''SyntaxN.name'' []) n)" lemma nat_of_name_Abs_eq [simp]: "nat_of_name (Abs_name (Atom (Sort ''SyntaxN.name'' []) n)) = n" by (auto simp: nat_of_name_def atom_name_def Abs_name_inverse) lemma nat_of_name_name_eq [simp]: "nat_of_name (name_of_nat n) = n" by (simp add: name_of_nat_def) lemma name_of_nat_nat_of_name [simp]: "name_of_nat (nat_of_name i) = i" by (metis nat_of_name_inject nat_of_name_name_eq) lemma HPair_neq_ORD_OF [simp]: "HPair x y \ ORD_OF i" by (metis HPair_def ORD_OF.elims SUCC_def tm.distinct(3) tm.eq_iff(3)) 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 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 = 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\ class quot = - fixes quot :: "'a \ tm" ("\_\") + 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_tm_fresh [simp]: fixes t::tm shows "s \ \t\" +lemma quot_tm_fresh [simp]: fixes t::tm shows "s \ \t\" by (simp add: quot_tm_def) -lemma quot_Zero [simp]: "\Zero\ = Zero" +lemma quot_Zero [simp]: "\Zero\ = Zero" by (simp add: quot_tm_def) -lemma quot_Var: "\Var x\ = SUCC (ORD_OF (nat_of_name x))" +lemma quot_Var: "\Var x\ = SUCC (ORD_OF (nat_of_name x))" by (simp add: quot_tm_def) -lemma quot_Eats: "\Eats x y\ = HPair (HTuple 1) (HPair \x\ \y\)" +lemma quot_Eats: "\Eats x y\ = HPair (HTuple 1) (HPair \x\ \y\)" by (simp add: quot_tm_def) 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 quot_fm_fresh [simp]: fixes A::fm shows "s \ \A\" +lemma quot_fm_fresh [simp]: fixes A::fm shows "s \ \A\" by (simp add: quot_fm_def) -lemma quot_fm_permute [simp]: fixes A:: fm shows "p \ \A\ = \A\" +lemma quot_fm_permute [simp]: fixes A:: fm shows "p \ \A\ = \A\" by (metis fresh_star_def perm_supp_eq quot_fm_fresh) -lemma quot_Mem: "\x IN y\ = HPair (HTuple 0) (HPair (\x\) (\y\))" +lemma quot_Mem: "\x IN y\ = HPair (HTuple 0) (HPair (\x\) (\y\))" by (simp add: quot_fm_def quot_tm_def) -lemma quot_Eq: "\x EQ y\ = HPair (HTuple 2) (HPair (\x\) (\y\))" +lemma quot_Eq: "\x EQ y\ = HPair (HTuple 2) (HPair (\x\) (\y\))" by (simp add: quot_fm_def quot_tm_def) -lemma quot_Disj: "\A OR B\ = HPair (HTuple 3) (HPair (\A\) (\B\))" +lemma quot_Disj: "\A OR B\ = HPair (HTuple 3) (HPair (\A\) (\B\))" by (simp add: quot_fm_def) -lemma quot_Neg: "\Neg A\ = HPair (HTuple 4) (\A\)" +lemma quot_Neg: "\Neg A\ = HPair (HTuple 4) (\A\)" by (simp add: quot_fm_def) -lemma quot_Ex: "\Ex i A\ = HPair (HTuple 5) (quot_dbfm (trans_fm [i] A))" +lemma quot_Ex: "\Ex i A\ = HPair (HTuple 5) (quot_dbfm (trans_fm [i] A))" by (simp add: quot_fm_def) lemmas quot_simps = quot_Var quot_Eats quot_Eq quot_Mem quot_Disj quot_Neg quot_Ex section\Definitions Involving Coding\ abbreviation Q_Eats :: "tm \ tm \ tm" where "Q_Eats t u \ HPair (HTuple (Suc 0)) (HPair t u)" abbreviation Q_Succ :: "tm \ tm" where "Q_Succ t \ Q_Eats t t" -lemma quot_Succ: "\SUCC x\ = Q_Succ \x\" +lemma quot_Succ: "\SUCC x\ = Q_Succ \x\" by (auto simp: SUCC_def quot_Eats) abbreviation Q_HPair :: "tm \ tm \ tm" where "Q_HPair t u \ Q_Eats (Q_Eats Zero (Q_Eats (Q_Eats Zero u) t)) (Q_Eats (Q_Eats Zero t) t)" abbreviation Q_Mem :: "tm \ tm \ tm" where "Q_Mem t u \ HPair (HTuple 0) (HPair t u)" abbreviation Q_Eq :: "tm \ tm \ tm" where "Q_Eq t u \ HPair (HTuple 2) (HPair t u)" abbreviation Q_Disj :: "tm \ tm \ tm" where "Q_Disj t u \ HPair (HTuple 3) (HPair t u)" abbreviation Q_Neg :: "tm \ tm" where "Q_Neg t \ HPair (HTuple 4) t" abbreviation Q_Conj :: "tm \ tm \ tm" where "Q_Conj t u \ Q_Neg (Q_Disj (Q_Neg t) (Q_Neg u))" abbreviation Q_Imp :: "tm \ tm \ tm" where "Q_Imp t u \ Q_Disj (Q_Neg t) u" abbreviation Q_Ex :: "tm \ tm" where "Q_Ex t \ HPair (HTuple 5) t" abbreviation Q_All :: "tm \ tm" where "Q_All t \ Q_Neg (Q_Ex (Q_Neg t))" -lemma quot_subst_eq: "\A(i::=t)\ = quot_dbfm (subst_dbfm (trans_tm [] t) i (trans_fm [] A))" +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) 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 quot_dbtm_coding [simp]: "coding_tm (quot_dbtm t)" apply (induct t rule: dbtm.induct, auto) apply (metis ORD_OF.simps(2) Ord) done lemma quot_dbfm_coding [simp]: "coding_tm (quot_dbfm fm)" by (induct fm rule: dbfm.induct, auto) -lemma quot_fm_coding: fixes A::fm shows "coding_tm \A\" +lemma quot_fm_coding: fixes A::fm shows "coding_tm \A\" by (metis quot_dbfm_coding quot_fm_def) 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_tm_empty [simp]: fixes t::tm shows "\t\{} = \t\" +lemma vquot_tm_empty [simp]: fixes t::tm shows "\t\{} = \t\" by (simp add: vquot_tm_def quot_tm_def) 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_fm_empty [simp]: fixes A::fm shows "\A\{} = \A\" +lemma vquot_fm_empty [simp]: fixes A::fm shows "\A\{} = \A\" by (simp add: vquot_fm_def quot_fm_def) 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 diff --git a/thys/Goedel_HFSet_Semanticless/Goedel_I.thy b/thys/Goedel_HFSet_Semanticless/Goedel_I.thy --- a/thys/Goedel_HFSet_Semanticless/Goedel_I.thy +++ b/thys/Goedel_HFSet_Semanticless/Goedel_I.thy @@ -1,790 +1,790 @@ chapter \Section 6 Material and Gödel's First Incompleteness Theorem\ theory Goedel_I imports Pf_Predicates Functions II_Prelims begin section\The Function W and Lemma 6.1\ subsection\Predicate form, defined on sequences\ nominal_function SeqWRP :: "tm \ tm \ tm \ fm" where "\atom l \ (s,k,sl); atom sl \ (s)\ \ SeqWRP s k y = LstSeqP s k y AND HPair Zero Zero IN s AND All2 l k (Ex sl (HPair (Var l) (Var sl) IN s AND HPair (SUCC (Var l)) (Q_Succ (Var sl)) IN s))" by (auto simp: eqvt_def SeqWRP_graph_aux_def flip_fresh_fresh) (metis obtain_fresh) nominal_termination (eqvt) by lexicographic_order lemma shows SeqWRP_fresh_iff [simp]: "a \ SeqWRP s k y \ a \ s \ a \ k \ a \ y" (is ?thesis1) and SeqWRP_sf [iff]: "Sigma_fm (SeqWRP s k y)" (is ?thsf) and SeqWRP_imp_OrdP: "{SeqWRP s k t} \ OrdP k" (is ?thOrd) and SeqWRP_LstSeqP: "{SeqWRP s k t} \ LstSeqP s k t" (is ?thlstseq) proof - obtain l::name and sl::name where "atom l \ (s,k,sl)" "atom sl \ (s)" by (metis obtain_fresh) thus ?thesis1 ?thsf ?thOrd ?thlstseq by (auto intro: LstSeqP_OrdP[THEN cut1]) qed lemma SeqWRP_subst [simp]: "(SeqWRP s k y)(i::=t) = SeqWRP (subst i t s) (subst i t k) (subst i t y)" proof - obtain l::name and sl::name where "atom l \ (s,k,sl,t,i)" "atom sl \ (s,k,t,i)" by (metis obtain_fresh) thus ?thesis by (auto simp: SeqWRP.simps [where l=l and sl=sl]) qed lemma SeqWRP_cong: assumes "H \ s EQ s'" and "H \ k EQ k'" and "H \ y EQ y'" shows "H \ SeqWRP s k y IFF SeqWRP s' k' y'" by (rule P3_cong [OF _ assms], auto) declare SeqWRP.simps [simp del] subsection\Predicate form of W\ nominal_function WRP :: "tm \ tm \ fm" where "\atom s \ (x,y)\ \ WRP x y = Ex s (SeqWRP (Var s) x y)" by (auto simp: eqvt_def WRP_graph_aux_def flip_fresh_fresh) (metis obtain_fresh) nominal_termination (eqvt) by lexicographic_order lemma shows WRP_fresh_iff [simp]: "a \ WRP x y \ a \ x \ a \ y" (is ?thesis1) and sigma_fm_WRP [simp]: "Sigma_fm (WRP x y)" (is ?thsf) proof - obtain s::name where "atom s \ (x,y)" by (metis obtain_fresh) thus ?thesis1 ?thsf by auto qed lemma WRP_subst [simp]: "(WRP x y)(i::=t) = WRP (subst i t x) (subst i t y)" proof - obtain s::name where "atom s \ (x,y,t,i)" by (metis obtain_fresh) thus ?thesis by (auto simp: WRP.simps [of s]) qed lemma WRP_cong: "H \ t EQ t' \ H \ u EQ u' \ H \ WRP t u IFF WRP t' u'" by (rule P2_cong) auto declare WRP.simps [simp del] lemma ground_WRP [simp]: "ground_fm (WRP x y) \ ground x \ ground y" by (auto simp: ground_aux_def ground_fm_aux_def supp_conv_fresh) lemma SeqWRP_Zero: "{} \ SyntaxN.Ex s (SeqWRP (Var s) Zero Zero)" proof - obtain l sl :: name where "atom l \ (s, sl)" "atom sl \ s" by (metis obtain_fresh) then show ?thesis apply (subst SeqWRP.simps[of l _ _ sl]; simp) apply (rule Ex_I[where x="(Eats Zero (HPair Zero Zero))"], simp) apply (auto intro!: Mem_Eats_I2) done qed lemma WRP_Zero: "{} \ WRP Zero Zero" by (subst WRP.simps[of undefined]) (auto simp: SeqWRP_Zero) lemma SeqWRP_HPair_Zero_Zero: "{SeqWRP s k y} \ HPair Zero Zero IN s" proof - let ?vs = "(s,k,y)" obtain l::name and sl::name where "atom l \ (?vs,sl)" "atom sl \ (?vs)" by (metis obtain_fresh) then show ?thesis by (subst SeqWRP.simps[of l _ _ sl]) auto qed lemma SeqWRP_Succ: assumes "atom s \ (s1,k1,y)" shows "{SeqWRP s1 k1 y} \ SyntaxN.Ex s (SeqWRP (Var s) (SUCC k1) (Q_Succ y))" proof - let ?vs = "(s,s1,k1,y)" obtain l::name and sl::name and l1::name and sl1::name where atoms: "atom l \ (?vs,sl1,l1,sl)" "atom sl \ (?vs,sl1,l1)" "atom l1 \ (?vs,sl1)" "atom sl1 \ (?vs)" by (metis obtain_fresh) let ?hyp = "{RestrictedP s1 (SUCC k1) (Var s), OrdP k1, SeqWRP s1 k1 y}" show ?thesis using assms atoms apply (auto simp: SeqWRP.simps [of l "Var s" _ sl]) apply (rule cut_same [where A="OrdP k1"]) apply (rule SeqWRP_imp_OrdP) apply (rule cut_same [OF exists_RestrictedP [of s s1 "SUCC k1"]]) apply (rule AssumeH Ex_EH Conj_EH | simp)+ apply (rule Ex_I [where x="Eats (Var s) (HPair (SUCC k1) (Q_Succ y))"]) apply (simp_all (no_asm_simp)) apply (rule Conj_I) apply (blast intro: RestrictedP_LstSeqP_Eats[THEN cut2] SeqWRP_LstSeqP[THEN cut1]) apply (rule Conj_I) apply (rule Mem_Eats_I1) apply (blast intro: RestrictedP_Mem[THEN cut3] SeqWRP_HPair_Zero_Zero[THEN cut1] Zero_In_SUCC[THEN cut1]) proof (rule All2_SUCC_I, simp_all) show "?hyp \ SyntaxN.Ex sl (HPair k1 (Var sl) IN Eats (Var s) (HPair (SUCC k1) (Q_Succ y)) AND HPair (SUCC k1) (Q_Succ (Var sl)) IN Eats (Var s) (HPair (SUCC k1) (Q_Succ y)))" \ \verifying the final values\ apply (rule Ex_I [where x="y"]) using assms atoms apply simp apply (rule Conj_I[rotated]) apply (rule Mem_Eats_I2, rule Refl) apply (rule Mem_Eats_I1) apply (rule RestrictedP_Mem[THEN cut3]) apply (rule AssumeH) apply (simp add: LstSeqP_imp_Mem SeqWRP_LstSeqP thin1) apply (rule Mem_SUCC_Refl) done next show "?hyp \ All2 l k1 (SyntaxN.Ex sl (HPair (Var l) (Var sl) IN Eats (Var s) (HPair (SUCC k1) (Q_Succ y)) AND HPair (SUCC (Var l)) (Q_Succ (Var sl)) IN Eats (Var s) (HPair (SUCC k1) (Q_Succ y))))" \ \verifying the sequence buildup\ apply (rule All_I Imp_I)+ using assms atoms apply simp_all \ \... the sequence buildup via s1\ apply (simp add: SeqWRP.simps [of l s1 _ sl]) apply (rule AssumeH Ex_EH Conj_EH)+ apply (rule All2_E [THEN rotate2], auto del: Disj_EH) apply (rule Ex_I [where x="Var sl"], simp) apply (rule Conj_I) apply (blast intro: Mem_Eats_I1 [OF RestrictedP_Mem [THEN cut3]] Mem_SUCC_I1) apply (blast intro: Mem_Eats_I1 [OF RestrictedP_Mem [THEN cut3]] OrdP_IN_SUCC) done qed qed (*>*) lemma WRP_Succ: "{OrdP i, WRP i y} \ WRP (SUCC i) (Q_Succ y)" proof - obtain s t :: name where "atom s \ (i, y)" "atom t \ (s,i, y)" by (metis obtain_fresh) then show ?thesis by (subst WRP.simps[of s], simp, subst WRP.simps[of t], simp) (force intro: SeqWRP_Succ[THEN cut1]) qed -lemma WRP: "{} \ WRP (ORD_OF i) \ORD_OF i\" +lemma WRP: "{} \ WRP (ORD_OF i) \ORD_OF i\" by (induct i) (auto simp: WRP_Zero quot_Succ intro!: WRP_Succ[THEN cut2]) -lemma prove_WRP: "{} \ WRP \Var x\ \\Var x\\" +lemma prove_WRP: "{} \ WRP \Var x\ \\Var x\\" unfolding quot_Var quot_Succ by (rule WRP_Succ[THEN cut2]) (auto simp: WRP) subsection\Proving that these relations are functions\ lemma SeqWRP_Zero_E: assumes "insert (y EQ Zero) H \ A" "H \ k EQ Zero" shows "insert (SeqWRP s k y) H \ A" proof - obtain l::name and sl::name where "atom l \ (s,k,sl)" "atom sl \ (s)" by (metis obtain_fresh) thus ?thesis apply (auto simp: SeqWRP.simps [where s=s and l=l and sl=sl]) apply (rule cut_same [where A = "LstSeqP s Zero y"]) apply (blast intro: thin1 assms LstSeqP_cong [OF Refl _ Refl, THEN Iff_MP_same]) apply (rule cut_same [where A = "y EQ Zero"]) apply (blast intro: LstSeqP_EQ) apply (metis rotate2 assms(1) thin1) done qed lemma SeqWRP_SUCC_lemma: assumes y': "atom y' \ (s,k,y)" shows "{SeqWRP s (SUCC k) y} \ Ex y' (SeqWRP s k (Var y') AND y EQ Q_Succ (Var y'))" proof - obtain l::name and sl::name where atoms: "atom l \ (s,k,y,y',sl)" "atom sl \ (s,k,y,y')" by (metis obtain_fresh) thus ?thesis using y' apply (auto simp: SeqWRP.simps [where s=s and l=l and sl=sl]) apply (rule All2_SUCC_E' [where t=k, THEN rotate2], auto) apply (rule Ex_I [where x = "Var sl"], auto) apply (blast intro: LstSeqP_SUCC) \ \showing @{term"SeqWRP s k (Var sl)"}\ apply (blast intro: ContraProve LstSeqP_EQ) done qed lemma SeqWRP_SUCC_E: assumes y': "atom y' \ (s,k,y)" and k': "H \ k' EQ (SUCC k)" shows "insert (SeqWRP s k' y) H \ Ex y' (SeqWRP s k (Var y') AND y EQ Q_Succ (Var y'))" using SeqWRP_cong [OF Refl k' Refl] cut1 [OF SeqWRP_SUCC_lemma [of y' s k y]] by (metis Assume Iff_MP_left Iff_sym y') lemma SeqWRP_unique: "{OrdP x, SeqWRP s x y, SeqWRP s' x y'} \ y' EQ y" proof - obtain i::name and j::name and j'::name and k::name and sl::name and sl'::name and l::name and pi::name where i: "atom i \ (s,s',y,y')" and j: "atom j \ (s,s',i,x,y,y')" and j': "atom j' \ (s,s',i,j,x,y,y')" and atoms: "atom k \ (s,s',i,j,j')" "atom sl \ (s,s',i,j,j',k)" "atom sl' \ (s,s',i,j,j',k,sl)" "atom pi \ (s,s',i,j,j',k,sl,sl')" by (metis obtain_fresh) have "{OrdP (Var i)} \ All j (All j' (SeqWRP s (Var i) (Var j) IMP (SeqWRP s' (Var i) (Var j') IMP Var j' EQ Var j)))" apply (rule OrdIndH [where j=k]) using i j j' atoms apply auto apply (rule rotate4) apply (rule OrdP_cases_E [where k=pi], simp_all) \ \Zero case\ apply (rule SeqWRP_Zero_E [THEN rotate3]) prefer 2 apply blast apply (rule SeqWRP_Zero_E [THEN rotate4]) prefer 2 apply blast apply (blast intro: ContraProve [THEN rotate4] Sym Trans) \ \SUCC case\ apply (rule Ex_I [where x = "Var pi"], auto) apply (metis ContraProve EQ_imp_SUBS2 Mem_SUCC_I2 Refl Subset_D) apply (rule cut_same) apply (rule SeqWRP_SUCC_E [of sl' s' "Var pi", THEN rotate4], auto) apply (rule cut_same) apply (rule SeqWRP_SUCC_E [of sl s "Var pi", THEN rotate7], auto) apply (rule All_E [where x = "Var sl", THEN rotate5], simp) apply (rule All_E [where x = "Var sl'"], simp) apply (rule Imp_E, blast)+ apply (rule cut_same [OF Q_Succ_cong [OF Assume]]) apply (blast intro: Trans [OF Hyp Sym] HPair_cong) done hence "{OrdP (Var i)} \ (All j' (SeqWRP s (Var i) (Var j) IMP (SeqWRP s' (Var i) (Var j') IMP Var j' EQ Var j)))(j::=y)" by (metis All_D) hence "{OrdP (Var i)} \ (SeqWRP s (Var i) y IMP (SeqWRP s' (Var i) (Var j') IMP Var j' EQ y))(j'::=y')" using j j' by simp (drule All_D [where x=y'], simp) hence "{} \ OrdP (Var i) IMP (SeqWRP s (Var i) y IMP (SeqWRP s' (Var i) y' IMP y' EQ y))" using j j' by simp (metis Imp_I) hence "{} \ (OrdP (Var i) IMP (SeqWRP s (Var i) y IMP (SeqWRP s' (Var i) y' IMP y' EQ y)))(i::=x)" by (metis Subst emptyE) thus ?thesis using i by simp (metis anti_deduction insert_commute) qed theorem WRP_unique: "{OrdP x, WRP x y, WRP x y'} \ y' EQ y" proof - obtain s::name and s'::name where "atom s \ (x,y,y')" "atom s' \ (x,y,y',s)" by (metis obtain_fresh) thus ?thesis by (auto simp: SeqWRP_unique [THEN rotate3] WRP.simps [of s _ y] WRP.simps [of s' _ y']) qed section\The Function HF and Lemma 6.2\ subsection \Defining the syntax: quantified body\ nominal_function SeqHRP :: "tm \ tm \ tm \ tm \ fm" where "\atom l \ (s,k,sl,sl',m,n,sm,sm',sn,sn'); atom sl \ (s,sl',m,n,sm,sm',sn,sn'); atom sl' \ (s,m,n,sm,sm',sn,sn'); atom m \ (s,n,sm,sm',sn,sn'); atom n \ (s,sm,sm',sn,sn'); atom sm \ (s,sm',sn,sn'); atom sm' \ (s,sn,sn'); atom sn \ (s,sn'); atom sn' \ (s)\ \ SeqHRP x x' s k = LstSeqP s k (HPair x x') AND All2 l (SUCC k) (Ex sl (Ex sl' (HPair (Var l) (HPair (Var sl) (Var sl')) IN s AND ((OrdP (Var sl) AND WRP (Var sl) (Var sl')) OR Ex m (Ex n (Ex sm (Ex sm' (Ex sn (Ex sn' (Var m IN Var l AND Var n IN Var l AND HPair (Var m) (HPair (Var sm) (Var sm')) IN s AND HPair (Var n) (HPair (Var sn) (Var sn')) IN s AND Var sl EQ HPair (Var sm) (Var sn) AND Var sl' EQ Q_HPair (Var sm') (Var sn')))))))))))" by (auto simp: eqvt_def SeqHRP_graph_aux_def flip_fresh_fresh) (metis obtain_fresh) nominal_termination (eqvt) by lexicographic_order lemma shows SeqHRP_fresh_iff [simp]: "a \ SeqHRP x x' s k \ a \ x \ a \ x' \ a \ s \ a \ k" (is ?thesis1) and SeqHRP_sf [iff]: "Sigma_fm (SeqHRP x x' s k)" (is ?thsf) and SeqHRP_imp_OrdP: "{ SeqHRP x y s k } \ OrdP k" (is ?thord) and SeqHRP_imp_LstSeqP: "{ SeqHRP x y s k } \ LstSeqP s k (HPair x y)" (is ?thlstseq) proof - obtain l::name and sl::name and sl'::name and m::name and n::name and sm::name and sm'::name and sn::name and sn'::name where atoms: "atom l \ (s,k,sl,sl',m,n,sm,sm',sn,sn')" "atom sl \ (s,sl',m,n,sm,sm',sn,sn')" "atom sl' \ (s,m,n,sm,sm',sn,sn')" "atom m \ (s,n,sm,sm',sn,sn')" "atom n \ (s,sm,sm',sn,sn')" "atom sm \ (s,sm',sn,sn')" "atom sm' \ (s,sn,sn')" "atom sn \ (s,sn')" "atom sn' \ (s)" by (metis obtain_fresh) thus ?thesis1 ?thsf ?thord ?thlstseq by (auto intro: LstSeqP_OrdP) qed lemma SeqHRP_subst [simp]: "(SeqHRP x x' s k)(i::=t) = SeqHRP (subst i t x) (subst i t x') (subst i t s) (subst i t k)" proof - obtain l::name and sl::name and sl'::name and m::name and n::name and sm::name and sm'::name and sn::name and sn'::name where "atom l \ (s,k,t,i,sl,sl',m,n,sm,sm',sn,sn')" "atom sl \ (s,t,i,sl',m,n,sm,sm',sn,sn')" "atom sl' \ (s,t,i,m,n,sm,sm',sn,sn')" "atom m \ (s,t,i,n,sm,sm',sn,sn')" "atom n \ (s,t,i,sm,sm',sn,sn')" "atom sm \ (s,t,i,sm',sn,sn')" "atom sm' \ (s,t,i,sn,sn')" "atom sn \ (s,t,i,sn')" "atom sn' \ (s,t,i)" by (metis obtain_fresh) thus ?thesis by (auto simp: SeqHRP.simps [of l _ _ sl sl' m n sm sm' sn sn']) qed lemma SeqHRP_cong: assumes "H \ x EQ x'" and "H \ y EQ y'" "H \ s EQ s'" and "H \ k EQ k'" shows "H \ SeqHRP x y s k IFF SeqHRP x' y' s' k'" by (rule P4_cong [OF _ assms], auto) subsection \Defining the syntax: main predicate\ nominal_function HRP :: "tm \ tm \ fm" where "\atom s \ (x,x',k); atom k \ (x,x')\ \ HRP x x' = Ex s (Ex k (SeqHRP x x' (Var s) (Var k)))" by (auto simp: eqvt_def HRP_graph_aux_def flip_fresh_fresh) (metis obtain_fresh) nominal_termination (eqvt) by lexicographic_order lemma shows HRP_fresh_iff [simp]: "a \ HRP x x' \ a \ x \ a \ x'" (is ?thesis1) and HRP_sf [iff]: "Sigma_fm (HRP x x')" (is ?thsf) proof - obtain s::name and k::name where "atom s \ (x,x',k)" "atom k \ (x,x')" by (metis obtain_fresh) thus ?thesis1 ?thsf by auto qed lemma HRP_subst [simp]: "(HRP x x')(i::=t) = HRP (subst i t x) (subst i t x')" proof - obtain s::name and k::name where "atom s \ (x,x',t,i,k)" "atom k \ (x,x',t,i)" by (metis obtain_fresh) thus ?thesis by (auto simp: HRP.simps [of s _ _ k]) qed subsection\Proving that these relations are functions\ lemma SeqHRP_lemma: assumes "atom m \ (x,x',s,k,n,sm,sm',sn,sn')" "atom n \ (x,x',s,k,sm,sm',sn,sn')" "atom sm \ (x,x',s,k,sm',sn,sn')" "atom sm' \ (x,x',s,k,sn,sn')" "atom sn \ (x,x',s,k,sn')" "atom sn' \ (x,x',s,k)" shows "{ SeqHRP x x' s k } \ (OrdP x AND WRP x x') OR Ex m (Ex n (Ex sm (Ex sm' (Ex sn (Ex sn' (Var m IN k AND Var n IN k AND SeqHRP (Var sm) (Var sm') s (Var m) AND SeqHRP (Var sn) (Var sn') s (Var n) AND x EQ HPair (Var sm) (Var sn) AND x' EQ Q_HPair (Var sm') (Var sn')))))))" proof - obtain l::name and sl::name and sl'::name where atoms: "atom l \ (x,x',s,k,sl,sl',m,n,sm,sm',sn,sn')" "atom sl \ (x,x',s,k,sl',m,n,sm,sm',sn,sn')" "atom sl' \ (x,x',s,k,m,n,sm,sm',sn,sn')" by (metis obtain_fresh) thus ?thesis using atoms assms apply (simp add: SeqHRP.simps [of l s k sl sl' m n sm sm' sn sn']) apply (rule Conj_E) apply (rule All2_SUCC_E' [where t=k, THEN rotate2], simp_all) apply (rule rotate2) apply (rule Ex_E Conj_E)+ apply (rule cut_same [where A = "HPair x x' EQ HPair (Var sl) (Var sl')"]) apply (metis Assume LstSeqP_EQ rotate4, simp_all, clarify) apply (rule Disj_E [THEN rotate4]) apply (rule Disj_I1) apply (metis Assume AssumeH(3) Sym thin1 Iff_MP_same [OF Conj_cong [OF OrdP_cong WRP_cong] Assume]) \ \auto could be used but is VERY SLOW\ apply (rule Disj_I2) apply (rule Ex_E Conj_EH)+ apply simp_all apply (rule Ex_I [where x = "Var m"], simp) apply (rule Ex_I [where x = "Var n"], simp) apply (rule Ex_I [where x = "Var sm"], simp) apply (rule Ex_I [where x = "Var sm'"], simp) apply (rule Ex_I [where x = "Var sn"], simp) apply (rule Ex_I [where x = "Var sn'"], simp) apply (simp add: SeqHRP.simps [of l _ _ sl sl' m n sm sm' sn sn']) apply (rule Conj_I, blast)+ \ \first SeqHRP subgoal\ apply (rule Conj_I)+ apply (blast intro: LstSeqP_Mem) apply (rule All2_Subset [OF Hyp], blast) apply (blast intro!: SUCC_Subset_Ord LstSeqP_OrdP, blast, simp) \ \next SeqHRP subgoal\ apply (rule Conj_I)+ apply (blast intro: LstSeqP_Mem) apply (rule All2_Subset [OF Hyp], blast) apply (auto intro!: SUCC_Subset_Ord LstSeqP_OrdP) \ \finally, the equality pair\ apply (blast intro: Trans)+ done qed lemma SeqHRP_unique: "{SeqHRP x y s u, SeqHRP x y' s' u'} \ y' EQ y" proof - obtain i::name and j::name and j'::name and k::name and k'::name and l::name and m::name and n::name and sm::name and sn::name and sm'::name and sn'::name and m2::name and n2::name and sm2::name and sn2::name and sm2'::name and sn2'::name where atoms: "atom i \ (s,s',y,y')" "atom j \ (s,s',i,x,y,y')" "atom j' \ (s,s',i,j,x,y,y')" "atom k \ (s,s',x,y,y',u',i,j,j')" "atom k' \ (s,s',x,y,y',k,i,j,j')" "atom l \ (s,s',i,j,j',k,k')" "atom m \ (s,s',i,j,j',k,k',l)" "atom n \ (s,s',i,j,j',k,k',l,m)" "atom sm \ (s,s',i,j,j',k,k',l,m,n)" "atom sn \ (s,s',i,j,j',k,k',l,m,n,sm)" "atom sm' \ (s,s',i,j,j',k,k',l,m,n,sm,sn)" "atom sn' \ (s,s',i,j,j',k,k',l,m,n,sm,sn,sm')" "atom m2 \ (s,s',i,j,j',k,k',l,m,n,sm,sn,sm',sn')" "atom n2 \ (s,s',i,j,j',k,k',l,m,n,sm,sn,sm',sn',m2)" "atom sm2 \ (s,s',i,j,j',k,k',l,m,n,sm,sn,sm',sn',m2,n2)" "atom sn2 \ (s,s',i,j,j',k,k',l,m,n,sm,sn,sm',sn',m2,n2,sm2)" "atom sm2' \ (s,s',i,j,j',k,k',l,m,n,sm,sn,sm',sn',m2,n2,sm2,sn2)" "atom sn2' \ (s,s',i,j,j',k,k',l,m,n,sm,sn,sm',sn',m2,n2,sm2,sn2,sm2')" by (metis obtain_fresh) have "{OrdP (Var k)} \ All i (All j (All j' (All k' (SeqHRP (Var i) (Var j) s (Var k) IMP (SeqHRP (Var i) (Var j') s' (Var k') IMP Var j' EQ Var j)))))" apply (rule OrdIndH [where j=l]) using atoms apply auto apply (rule Swap) apply (rule cut_same) apply (rule cut1 [OF SeqHRP_lemma [of m "Var i" "Var j" s "Var k" n sm sm' sn sn']], simp_all, blast) apply (rule cut_same) apply (rule cut1 [OF SeqHRP_lemma [of m2 "Var i" "Var j'" s' "Var k'" n2 sm2 sm2' sn2 sn2']], simp_all, blast) apply (rule Disj_EH Conj_EH)+ \ \case 1, both are ordinals\ apply (blast intro: cut3 [OF WRP_unique]) \ \case 2, @{term "OrdP (Var i)"} but also a pair\ apply (rule Conj_EH Ex_EH)+ apply simp_all apply (rule cut_same [where A = "OrdP (HPair (Var sm) (Var sn))"]) apply (blast intro: OrdP_cong [OF Hyp, THEN Iff_MP_same], blast) \ \towards second two cases\ apply (rule Ex_E Disj_EH Conj_EH)+ \ \case 3, @{term "OrdP (Var i)"} but also a pair\ apply (rule cut_same [where A = "OrdP (HPair (Var sm2) (Var sn2))"]) apply (blast intro: OrdP_cong [OF Hyp, THEN Iff_MP_same], blast) \ \case 4, two pairs\ apply (rule Ex_E Disj_EH Conj_EH)+ apply (rule All_E' [OF Hyp, where x="Var m"], blast) apply (rule All_E' [OF Hyp, where x="Var n"], blast, simp_all) apply (rule Disj_EH, blast intro: thin1 ContraProve)+ apply (rule All_E [where x="Var sm"], simp) apply (rule All_E [where x="Var sm'"], simp) apply (rule All_E [where x="Var sm2'"], simp) apply (rule All_E [where x="Var m2"], simp) apply (rule All_E [where x="Var sn", THEN rotate2], simp) apply (rule All_E [where x="Var sn'"], simp) apply (rule All_E [where x="Var sn2'"], simp) apply (rule All_E [where x="Var n2"], simp) apply (rule cut_same [where A = "HPair (Var sm) (Var sn) EQ HPair (Var sm2) (Var sn2)"]) apply (blast intro: Sym Trans) apply (rule cut_same [where A = "SeqHRP (Var sn) (Var sn2') s' (Var n2)"]) apply (blast intro: SeqHRP_cong [OF Hyp Refl Refl, THEN Iff_MP2_same]) apply (rule cut_same [where A = "SeqHRP (Var sm) (Var sm2') s' (Var m2)"]) apply (blast intro: SeqHRP_cong [OF Hyp Refl Refl, THEN Iff_MP2_same]) apply (rule Disj_EH, blast intro: thin1 ContraProve)+ apply (blast intro: Trans [OF Hyp Sym] intro!: HPair_cong) done hence "{OrdP (Var k)} \ All j (All j' (All k' (SeqHRP x (Var j) s (Var k) IMP (SeqHRP x (Var j') s' (Var k') IMP Var j' EQ Var j))))" apply (rule All_D [where x = x, THEN cut_same]) using atoms by auto hence "{OrdP (Var k)} \ All j' (All k' (SeqHRP x y s (Var k) IMP (SeqHRP x (Var j') s' (Var k') IMP Var j' EQ y)))" apply (rule All_D [where x = y, THEN cut_same]) using atoms by auto hence "{OrdP (Var k)} \ All k' (SeqHRP x y s (Var k) IMP (SeqHRP x y' s' (Var k') IMP y' EQ y))" apply (rule All_D [where x = y', THEN cut_same]) using atoms by auto hence "{OrdP (Var k)} \ SeqHRP x y s (Var k) IMP (SeqHRP x y' s' u' IMP y' EQ y)" apply (rule All_D [where x = u', THEN cut_same]) using atoms by auto hence "{SeqHRP x y s (Var k)} \ SeqHRP x y s (Var k) IMP (SeqHRP x y' s' u' IMP y' EQ y)" by (metis SeqHRP_imp_OrdP cut1) hence "{} \ ((SeqHRP x y s (Var k) IMP (SeqHRP x y' s' u' IMP y' EQ y)))(k::=u)" by (metis Subst emptyE Assume MP_same Imp_I) hence "{} \ SeqHRP x y s u IMP (SeqHRP x y' s' u' IMP y' EQ y)" using atoms by simp thus ?thesis by (metis anti_deduction insert_commute) qed theorem HRP_unique: "{HRP x y, HRP x y'} \ y' EQ y" proof - obtain s::name and s'::name and k::name and k'::name where "atom s \ (x,y,y')" "atom s' \ (x,y,y',s)" "atom k \ (x,y,y',s,s')" "atom k' \ (x,y,y',s,s',k)" by (metis obtain_fresh) thus ?thesis by (auto simp: SeqHRP_unique HRP.simps [of s x y k] HRP.simps [of s' x y' k']) qed -lemma HRP_ORD_OF: "{} \ HRP (ORD_OF i) \ORD_OF i\" +lemma HRP_ORD_OF: "{} \ HRP (ORD_OF i) \ORD_OF i\" proof - let ?vs = "(i)" obtain s k l::name and sl::name and sl'::name and m::name and n::name and sm::name and sm'::name and sn::name and sn'::name where atoms: "atom s \ (?vs,sl,sl',m,n,sm,sm',sn,sn',l,k)" "atom k \ (?vs,sl,sl',m,n,sm,sm',sn,sn',l)" "atom l \ (?vs,sl,sl',m,n,sm,sm',sn,sn')" "atom sl \ (?vs,sl',m,n,sm,sm',sn,sn')" "atom sl' \ (?vs,m,n,sm,sm',sn,sn')" "atom m \ (?vs,n,sm,sm',sn,sn')" "atom n \ (?vs,sm,sm',sn,sn')" "atom sm \ (?vs,sm',sn,sn')" "atom sm' \ (?vs,sn,sn')" "atom sn \ (?vs,sn')" "atom sn' \ ?vs" by (metis obtain_fresh) then show ?thesis apply (subst HRP.simps[of s _ _ k]; simp) apply (subst SeqHRP.simps[of l _ _ sl sl' m n sm sm' sn sn']; simp?) - apply (rule Ex_I[where x="Eats Zero (HPair Zero (HPair (ORD_OF i) \ORD_OF i\))"]; simp) + apply (rule Ex_I[where x="Eats Zero (HPair Zero (HPair (ORD_OF i) \ORD_OF i\))"]; simp) apply (rule Ex_I[where x="Zero"]; simp) apply (rule Conj_I[OF LstSeqP_single]) apply (rule All2_SUCC_I, simp) apply auto [2] apply (rule Ex_I[where x="ORD_OF i"], simp) - apply (rule Ex_I[where x="\ORD_OF i\"], simp) + apply (rule Ex_I[where x="\ORD_OF i\"], simp) apply (auto intro!: Disj_I1 WRP Mem_Eats_I2) done qed lemma SeqHRP_HPair: assumes "atom s \ (k,s1,s2,k1,k2,x,y,x',y')" "atom k \ (s1,s2,k1,k2,x,y,x',y')" shows "{SeqHRP x x' s1 k1, SeqHRP y y' s2 k2} \ Ex s (Ex k (SeqHRP (HPair x y) (Q_HPair x' y') (Var s) (Var k)))" (*<*) proof - let ?vs = "(s1,s2,s,k1,k2,k,x,y,x',y')" obtain km::name and kn::name and j::name and k'::name and l::name and sl::name and sl'::name and m::name and n::name and sm::name and sm'::name and sn::name and sn'::name where atoms2: "atom km \ (kn,j,k',l,s1,s2,s,k1,k2,k,x,y,x',y',sl,sl',m,n,sm,sm',sn,sn')" "atom kn \ (j,k',l,s1,s2,s,k1,k2,k,x,y,x',y',sl,sl',m,n,sm,sm',sn,sn')" "atom j \ (k',l,s1,s2,s,k1,k2,k,x,y,x',y',sl,sl',m,n,sm,sm',sn,sn')" and atoms: "atom k' \ (l,s1,s2,s,k1,k2,k,x,y,x',y',sl,sl',m,n,sm,sm',sn,sn')" "atom l \ (s1,s2,s,k1,k2,k,x,y,x',y',sl,sl',m,n,sm,sm',sn,sn')" "atom sl \ (s1,s2,s,k1,k2,k,x,y,x',y',sl',m,n,sm,sm',sn,sn')" "atom sl' \ (s1,s2,s,k1,k2,k,x,y,x',y',m,n,sm,sm',sn,sn')" "atom m \ (s1,s2,s,k1,k2,k,x,y,x',y',n,sm,sm',sn,sn')" "atom n \ (s1,s2,s,k1,k2,k,x,y,x',y',sm,sm',sn,sn')" "atom sm \ (s1,s2,s,k1,k2,k,x,y,x',y',sm',sn,sn')" "atom sm' \ (s1,s2,s,k1,k2,k,x,y,x',y',sn,sn')" "atom sn \ (s1,s2,s,k1,k2,k,x,y,x',y',sn')" "atom sn' \ (s1,s2,s,k1,k2,k,x,y,x',y')" by (metis obtain_fresh) let ?hyp = "{HaddP k1 k2 (Var k'), OrdP k1, OrdP k2, SeqAppendP s1 (SUCC k1) s2 (SUCC k2) (Var s), SeqHRP x x' s1 k1, SeqHRP y y' s2 k2}" show ?thesis using assms atoms apply (auto simp: SeqHRP.simps [of l "Var s" _ sl sl' m n sm sm' sn sn']) apply (rule cut_same [where A="OrdP k1 AND OrdP k2"]) apply (metis Conj_I SeqHRP_imp_OrdP thin1 thin2) apply (rule cut_same [OF exists_SeqAppendP [of s s1 "SUCC k1" s2 "SUCC k2"]]) apply (rule AssumeH Ex_EH Conj_EH | simp)+ apply (rule cut_same [OF exists_HaddP [where j=k' and x=k1 and y=k2]]) apply (rule AssumeH Ex_EH Conj_EH | simp)+ apply (rule Ex_I [where x="Eats (Var s) (HPair (SUCC(SUCC(Var k'))) (HPair(HPair x y)(Q_HPair x' y')))"]) apply (simp_all (no_asm_simp)) apply (rule Ex_I [where x="SUCC (SUCC (Var k'))"], simp) apply (rule Conj_I) apply (blast intro: LstSeqP_SeqAppendP_Eats SeqHRP_imp_LstSeqP [THEN cut1]) proof (rule All2_SUCC_I, simp_all) show "?hyp \ SyntaxN.Ex sl (SyntaxN.Ex sl' (HPair (SUCC (SUCC (Var k'))) (HPair (Var sl) (Var sl')) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (HPair (HPair x y) (Q_HPair x' y'))) AND (OrdP (Var sl) AND WRP (Var sl) (Var sl') OR SyntaxN.Ex m (SyntaxN.Ex n (SyntaxN.Ex sm (SyntaxN.Ex sm' (SyntaxN.Ex sn (SyntaxN.Ex sn' (Var m IN SUCC (SUCC (Var k')) AND Var n IN SUCC (SUCC (Var k')) AND HPair (Var m) (HPair (Var sm) (Var sm')) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (HPair (HPair x y) (Q_HPair x' y'))) AND HPair (Var n) (HPair (Var sn) (Var sn')) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (HPair (HPair x y) (Q_HPair x' y'))) AND Var sl EQ HPair (Var sm) (Var sn) AND Var sl' EQ Q_HPair (Var sm') (Var sn'))))))))))" \ \verifying the final values\ apply (rule Ex_I [where x="HPair x y"]) using assms atoms apply simp apply (rule Ex_I [where x="Q_HPair x' y'"], simp) apply (rule Conj_I, metis Mem_Eats_I2 Refl) apply (rule Disj_I2) apply (rule Ex_I [where x=k1], simp) apply (rule Ex_I [where x="SUCC (Var k')"], simp) apply (rule Ex_I [where x=x], simp) apply (rule_tac x=x' in Ex_I, simp) apply (rule Ex_I [where x=y], simp) apply (rule_tac x=y' in Ex_I, simp) apply (rule Conj_I) apply (blast intro: HaddP_Mem_I LstSeqP_OrdP Mem_SUCC_I1) apply (rule Conj_I [OF Mem_SUCC_Refl]) apply (blast intro: Disj_I1 Mem_Eats_I1 Mem_SUCC_Refl SeqHRP_imp_LstSeqP [THEN cut1] LstSeqP_imp_Mem SeqAppendP_Mem1 [THEN cut3] SeqAppendP_Mem2 [THEN cut4] HaddP_SUCC1 [THEN cut1]) done next show "?hyp \ All2 l (SUCC (SUCC (Var k'))) (SyntaxN.Ex sl (SyntaxN.Ex sl' (HPair (Var l) (HPair (Var sl) (Var sl')) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (HPair (HPair x y) (Q_HPair x' y'))) AND (OrdP (Var sl) AND WRP (Var sl) (Var sl') OR SyntaxN.Ex m (SyntaxN.Ex n (SyntaxN.Ex sm (SyntaxN.Ex sm' (SyntaxN.Ex sn (SyntaxN.Ex sn' (Var m IN Var l AND Var n IN Var l AND HPair (Var m) (HPair (Var sm) (Var sm')) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (HPair (HPair x y) (Q_HPair x' y'))) AND HPair (Var n) (HPair (Var sn) (Var sn')) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (HPair (HPair x y) (Q_HPair x' y'))) AND Var sl EQ HPair (Var sm) (Var sn) AND Var sl' EQ Q_HPair (Var sm') (Var sn')))))))))))" \ \verifying the sequence buildup\ apply (rule cut_same [where A="HaddP (SUCC k1) (SUCC k2) (SUCC (SUCC (Var k')))"]) apply (blast intro: HaddP_SUCC1 [THEN cut1] HaddP_SUCC2 [THEN cut1]) apply (rule All_I Imp_I)+ apply (rule HaddP_Mem_cases [where i=j]) using assms atoms atoms2 apply simp_all apply (rule AssumeH) apply (blast intro: OrdP_SUCC_I LstSeqP_OrdP) \ \... the sequence buildup via s1\ apply (simp add: SeqHRP.simps [of l s1 _ sl sl' m n sm sm' sn sn']) apply (rule AssumeH Ex_EH Conj_EH)+ apply (rule All2_E [THEN rotate2]) apply (simp | rule AssumeH Ex_EH Conj_EH)+ apply (rule Ex_I [where x="Var sl"], simp) apply (rule Ex_I [where x="Var sl'"], simp) apply (rule Conj_I [OF Mem_Eats_I1]) apply (metis SeqAppendP_Mem1 rotate3 thin2 thin4) apply (rule AssumeH Disj_IE1H Ex_EH Conj_EH)+ apply (rule Ex_I [where x="Var m"], simp) apply (rule Ex_I [where x="Var n"], simp) apply (rule Ex_I [where x="Var sm"], simp) apply (rule Ex_I [where x="Var sm'"], simp) apply (rule Ex_I [where x="Var sn"], simp) apply (rule Ex_I [where x="Var sn'"], simp_all (no_asm_simp)) apply (rule Conj_I, rule AssumeH)+ apply (rule Conj_I) apply (blast intro: OrdP_Trans [OF OrdP_SUCC_I] Mem_Eats_I1 [OF SeqAppendP_Mem1 [THEN cut3]] Hyp) apply (blast intro: Disj_I1 Disj_I2 OrdP_Trans [OF OrdP_SUCC_I] Mem_Eats_I1 [OF SeqAppendP_Mem1 [THEN cut3]] Hyp) \ \... the sequence buildup via s2\ apply (simp add: SeqHRP.simps [of l s2 _ sl sl' m n sm sm' sn sn']) apply (rule AssumeH Ex_EH Conj_EH)+ apply (rule All2_E [THEN rotate2]) apply (simp | rule AssumeH Ex_EH Conj_EH)+ apply (rule Ex_I [where x="Var sl"], simp) apply (rule Ex_I [where x="Var sl'"], simp) apply (rule cut_same [where A="OrdP (Var j)"]) apply (metis HaddP_imp_OrdP rotate2 thin2) apply (rule Conj_I) apply (blast intro: Mem_Eats_I1 SeqAppendP_Mem2 [THEN cut4] del: Disj_EH) apply (rule AssumeH Disj_IE1H Ex_EH Conj_EH)+ apply (rule cut_same [OF exists_HaddP [where j=km and x="SUCC k1" and y="Var m"]]) apply (blast intro: Ord_IN_Ord, simp) apply (rule cut_same [OF exists_HaddP [where j=kn and x="SUCC k1" and y="Var n"]]) apply (metis AssumeH(6) Ord_IN_Ord0 rotate8, simp) apply (rule AssumeH Ex_EH Conj_EH | simp)+ apply (rule Ex_I [where x="Var km"], simp) apply (rule Ex_I [where x="Var kn"], simp) apply (rule Ex_I [where x="Var sm"], simp) apply (rule Ex_I [where x="Var sm'"], simp) apply (rule Ex_I [where x="Var sn"], simp) apply (rule Ex_I [where x="Var sn'"], simp_all (no_asm_simp)) apply (rule Conj_I [OF _ Conj_I]) apply (blast intro!: HaddP_Mem_cancel_left [THEN Iff_MP2_same] OrdP_SUCC_I intro: LstSeqP_OrdP Hyp)+ apply (blast del: Disj_EH intro: OrdP_Trans Hyp intro!: Mem_Eats_I1 SeqAppendP_Mem2 [THEN cut4] HaddP_imp_OrdP [THEN cut1]) done qed qed (*>*) lemma HRP_HPair: "{HRP x x', HRP y y'} \ HRP (HPair x y) (Q_HPair x' y')" proof - obtain k1::name and s1::name and k2::name and s2::name and k::name and s::name where "atom s1 \ (x,y,x',y')" "atom k1 \ (x,y,x',y',s1)" "atom s2 \ (x,y,x',y',k1,s1)" "atom k2 \ (x,y,x',y',s2,k1,s1)" "atom s \ (x,y,x',y',k2,s2,k1,s1)" "atom k \ (x,y,x',y',s,k2,s2,k1,s1)" by (metis obtain_fresh) thus ?thesis by (force simp: HRP.simps [of s "HPair x y" _ k] HRP.simps [of s1 x _ k1] HRP.simps [of s2 y _ k2] intro: SeqHRP_HPair [THEN cut2]) qed -lemma HRP_HPair_quot: "{HRP x \x\, HRP y \y\} \ HRP (HPair x y) \HPair x y\" - using HRP_HPair[of x "\x\" y "\y\"] +lemma HRP_HPair_quot: "{HRP x \x\, HRP y \y\} \ HRP (HPair x y) \HPair x y\" + using HRP_HPair[of x "\x\" y "\y\"] unfolding HPair_def quot_simps by auto -lemma prove_HRP_coding_tm: fixes t::tm shows "coding_tm t \ {} \ HRP t \t\" +lemma prove_HRP_coding_tm: fixes t::tm shows "coding_tm t \ {} \ HRP t \t\" by (induct t rule: coding_tm.induct) (auto simp: quot_simps HRP_ORD_OF HRP_HPair_quot[THEN cut2]) lemmas prove_HRP = prove_HRP_coding_tm[OF quot_fm_coding] section\The Function K and Lemma 6.3\ nominal_function KRP :: "tm \ tm \ tm \ fm" where "atom y \ (v,x,x') \ KRP v x x' = Ex y (HRP x (Var y) AND SubstFormP v (Var y) x x')" by (auto simp: eqvt_def KRP_graph_aux_def flip_fresh_fresh) (metis obtain_fresh) nominal_termination (eqvt) by lexicographic_order lemma KRP_fresh_iff [simp]: "a \ KRP v x x' \ a \ v \ a \ x \ a \ x'" proof - obtain y::name where "atom y \ (v,x,x')" by (metis obtain_fresh) thus ?thesis by auto qed lemma KRP_subst [simp]: "(KRP v x x')(i::=t) = KRP (subst i t v) (subst i t x) (subst i t x')" proof - obtain y::name where "atom y \ (v,x,x',t,i)" by (metis obtain_fresh) thus ?thesis by (auto simp: KRP.simps [of y]) qed declare KRP.simps [simp del] -lemma prove_SubstFormP: "{} \ SubstFormP \Var i\ \\A\\ \A\ \A(i::=\A\)\" +lemma prove_SubstFormP: "{} \ SubstFormP \Var i\ \\A\\ \A\ \A(i::=\A\)\" using SubstFormP by blast -lemma prove_KRP: "{} \ KRP \Var i\ \A\ \A(i::=\A\)\" +lemma prove_KRP: "{} \ KRP \Var i\ \A\ \A(i::=\A\)\" by (auto simp: KRP.simps [of y] - intro!: Ex_I [where x="\\A\\"] prove_HRP prove_SubstFormP) + intro!: Ex_I [where x="\\A\\"] prove_HRP prove_SubstFormP) lemma KRP_unique: "{KRP v x y, KRP v x y'} \ y' EQ y" proof - obtain u::name and u'::name where "atom u \ (v,x,y,y')" "atom u' \ (v,x,y,y',u)" by (metis obtain_fresh) thus ?thesis by (auto simp: KRP.simps [of u v x y] KRP.simps [of u' v x y'] intro: SubstFormP_cong [THEN Iff_MP2_same] SubstFormP_unique [THEN cut2] HRP_unique [THEN cut2]) qed -lemma KRP_subst_fm: "{KRP \Var i\ \\\ (Var j)} \ Var j EQ \\(i::=\\\)\" +lemma KRP_subst_fm: "{KRP \Var i\ \\\ (Var j)} \ Var j EQ \\(i::=\\\)\" by (metis KRP_unique cut0 prove_KRP) end diff --git a/thys/Goedel_HFSet_Semanticless/II_Prelims.thy b/thys/Goedel_HFSet_Semanticless/II_Prelims.thy --- a/thys/Goedel_HFSet_Semanticless/II_Prelims.thy +++ b/thys/Goedel_HFSet_Semanticless/II_Prelims.thy @@ -1,4582 +1,4582 @@ chapter\Syntactic Preliminaries for the Second Incompleteness Theorem\ theory II_Prelims imports Pf_Predicates begin declare IndP.simps [simp del] lemma OrdP_ORD_OF [intro]: "H \ OrdP (ORD_OF n)" proof - have "{} \ OrdP (ORD_OF n)" by (induct n) (auto simp: OrdP_SUCC_I) thus ?thesis by (rule thin0) qed -lemma VarP_Var [intro]: "H \ VarP \Var i\" +lemma VarP_Var [intro]: "H \ VarP \Var i\" unfolding VarP_def by (auto simp: quot_Var OrdP_ORD_OF intro!: OrdP_SUCC_I cut1[OF Zero_In_SUCC]) lemma VarP_neq_IndP: "{t EQ v, VarP v, IndP t} \ Fls" proof - obtain m::name where "atom m \ (t,v)" by (metis obtain_fresh) thus ?thesis apply (auto simp: VarP_def IndP.simps [of m]) apply (rule cut_same [of _ "OrdP (Q_Ind (Var m))"]) apply (blast intro: Sym Trans OrdP_cong [THEN Iff_MP_same]) by (metis OrdP_HPairE) qed lemma Mem_HFun_Sigma_OrdP: "{HPair t u IN f, HFun_Sigma f} \ OrdP t" proof - obtain x::name and y::name and z::name and x'::name and y'::name and z'::name where "atom z \ (f,t,u,z',x,y,x',y')" "atom z' \ (f,t,u,x,y,x',y')" "atom x \ (f,t,u,y,x',y')" "atom y \ (f,t,u,x',y')" "atom x' \ (f,t,u,y')" "atom y' \ (f,t,u)" by (metis obtain_fresh) thus ?thesis apply (simp add: HFun_Sigma.simps [of z f z' x y x' y']) apply (rule All2_E [where x="HPair t u", THEN rotate2], auto) apply (rule All2_E [where x="HPair t u"], auto intro: OrdP_cong [THEN Iff_MP2_same]) done qed section \NotInDom\ nominal_function NotInDom :: "tm \ tm \ fm" where "atom z \ (t, r) \ NotInDom t r = All z (Neg (HPair t (Var z) IN r))" by (auto simp: eqvt_def NotInDom_graph_aux_def flip_fresh_fresh) (metis obtain_fresh) nominal_termination (eqvt) by lexicographic_order lemma NotInDom_fresh_iff [simp]: "a \ NotInDom t r \ a \ (t, r)" proof - obtain j::name where "atom j \ (t,r)" by (rule obtain_fresh) thus ?thesis by auto qed lemma subst_fm_NotInDom [simp]: "(NotInDom t r)(i::=x) = NotInDom (subst i x t) (subst i x r)" proof - obtain j::name where "atom j \ (i,x,t,r)" by (rule obtain_fresh) thus ?thesis by (auto simp: NotInDom.simps [of j]) qed lemma NotInDom_cong: "H \ t EQ t' \ H \ r EQ r' \ H \ NotInDom t r IFF NotInDom t' r'" by (rule P2_cong) auto lemma NotInDom_Zero: "H \ NotInDom t Zero" proof - obtain z::name where "atom z \ t" by (metis obtain_fresh) hence "{} \ NotInDom t Zero" by (auto simp: fresh_Pair) thus ?thesis by (rule thin0) qed lemma NotInDom_Fls: "{HPair d d' IN r, NotInDom d r} \ A" proof - obtain z::name where "atom z \ (d,r)" by (metis obtain_fresh) hence "{HPair d d' IN r, NotInDom d r} \ Fls" by (auto intro!: Ex_I [where x=d']) thus ?thesis by (metis ExFalso) qed lemma NotInDom_Contra: "H \ NotInDom d r \ H \ HPair x y IN r \ insert (x EQ d) H \ A" by (rule NotInDom_Fls [THEN cut2, THEN ExFalso]) (auto intro: thin1 NotInDom_cong [OF Assume Refl, THEN Iff_MP2_same]) section \Restriction of a Sequence to a Domain\ nominal_function RestrictedP :: "tm \ tm \ tm \ fm" where "\atom x \ (y,f,k,g); atom y \ (f,k,g)\ \ RestrictedP f k g = g SUBS f AND All x (All y (HPair (Var x) (Var y) IN g IFF (Var x) IN k AND HPair (Var x) (Var y) IN f))" by (auto simp: eqvt_def RestrictedP_graph_aux_def flip_fresh_fresh) (metis obtain_fresh) nominal_termination (eqvt) by lexicographic_order lemma RestrictedP_fresh_iff [simp]: "a \ RestrictedP f k g \ a \ f \ a \ k \ a \ g" proof - obtain x::name and y::name where "atom x \ (y,f,k,g)" "atom y \ (f,k,g)" by (metis obtain_fresh) thus ?thesis by auto qed lemma subst_fm_RestrictedP [simp]: "(RestrictedP f k g)(i::=u) = RestrictedP (subst i u f) (subst i u k) (subst i u g)" proof - obtain x::name and y::name where "atom x \ (y,f,k,g,i,u)" "atom y \ (f,k,g,i,u)" by (metis obtain_fresh) thus ?thesis by (auto simp: RestrictedP.simps [of x y]) qed lemma RestrictedP_cong: "\H \ f EQ f'; H \ k EQ A'; H \ g EQ g'\ \ H \ RestrictedP f k g IFF RestrictedP f' A' g'" by (rule P3_cong) auto lemma RestrictedP_Zero: "H \ RestrictedP Zero k Zero" proof - obtain x::name and y::name where "atom x \ (y,k)" "atom y \ (k)" by (metis obtain_fresh) hence "{} \ RestrictedP Zero k Zero" by (auto simp: RestrictedP.simps [of x y]) thus ?thesis by (rule thin0) qed lemma RestrictedP_Mem: "{ RestrictedP s k s', HPair a b IN s, a IN k } \ HPair a b IN s'" proof - obtain x::name and y::name where "atom x \ (y,s,k,s',a,b)" "atom y \ (s,k,s',a,b)" by (metis obtain_fresh) thus ?thesis apply (auto simp: RestrictedP.simps [of x y]) apply (rule All_E [where x=a, THEN rotate2], auto) apply (rule All_E [where x=b], auto intro: Iff_E2) done qed lemma RestrictedP_imp_Subset: "{RestrictedP s k s'} \ s' SUBS s" proof - obtain x::name and y::name where "atom x \ (y,s,k,s')" "atom y \ (s,k,s')" by (metis obtain_fresh) thus ?thesis by (auto simp: RestrictedP.simps [of x y]) qed lemma RestrictedP_Mem2: "{ RestrictedP s k s', HPair a b IN s' } \ HPair a b IN s AND a IN k" proof - obtain x::name and y::name where "atom x \ (y,s,k,s',a,b)" "atom y \ (s,k,s',a,b)" by (metis obtain_fresh) thus ?thesis apply (auto simp: RestrictedP.simps [of x y] intro: Subset_D) apply (rule All_E [where x=a, THEN rotate2], auto) apply (rule All_E [where x=b], auto intro: Iff_E1) done qed lemma RestrictedP_Mem_D: "H \ RestrictedP s k t \ H \ a IN t \ insert (a IN s) H \ A \ H \ A" by (metis RestrictedP_imp_Subset Subset_E cut1) lemma RestrictedP_Eats: "{ RestrictedP s k s', a IN k } \ RestrictedP (Eats s (HPair a b)) k (Eats s' (HPair a b))" (*<*) proof - obtain x::name and y::name where "atom x \ (y,s,k,s',a,b)" "atom y \ (s,k,s',a,b)" by (metis obtain_fresh) thus ?thesis apply (auto simp: RestrictedP.simps [of x y]) apply (metis Assume Subset_Eats_I Subset_trans) apply (metis Mem_Eats_I2 Refl) apply (rule Swap, auto) apply (rule All_E [where x="Var x", THEN rotate2], auto) apply (rule All_E [where x="Var y"], simp) apply (metis Assume Conj_E Iff_E1) apply (blast intro: Subset_D) apply (blast intro: Mem_cong [THEN Iff_MP2_same]) apply (metis Assume AssumeH(2) HPair_cong Mem_Eats_I2) apply (rule All_E [where x="Var x", THEN rotate3], auto) apply (rule All_E [where x="Var y"], simp) apply (metis Assume AssumeH(2) Conj_I Iff_E2 Mem_Eats_I1) apply (blast intro: Mem_Eats_I2 HPair_cong) done qed (*>*) lemma exists_RestrictedP: assumes s: "atom s \ (f,k)" shows "H \ Ex s (RestrictedP f k (Var s))" (*<*) proof - obtain j::name and x::name and y::name and z::name where atoms: "atom j \ (k,z,s)" "atom x \ (j,k,z,s)" "atom y \ (x,j,k,z,s)" "atom z \ (s,k)" by (metis obtain_fresh) have "{} \ Ex s (RestrictedP (Var z) k (Var s))" apply (rule Ind [of j z]) using atoms s apply simp_all apply (rule Ex_I [where x=Zero], simp add: RestrictedP_Zero) apply (rule All_I)+ apply (auto del: Ex_EH) apply (rule thin1) apply (rule Ex_E) proof (rule Cases [where A="Ex x (Ex y ((Var x) IN k AND Var j EQ HPair (Var x) (Var y)))"], auto) show "{Var x IN k, Var j EQ HPair (Var x) (Var y), RestrictedP (Var z) k (Var s)} \ Ex s (RestrictedP (Eats (Var z) (Var j)) k (Var s))" apply (rule Ex_I [where x="Eats (Var s) (HPair (Var x) (Var y))"]) using atoms s apply auto apply (rule RestrictedP_cong [OF _ Refl Refl, THEN Iff_MP2_same]) apply (blast intro: Eats_cong [OF Refl]) apply (rule Var_Eq_subst_Iff [THEN rotate2, THEN Iff_MP_same]) apply (auto intro: RestrictedP_Eats [THEN cut2]) done next obtain u::name and v::name where uv: "atom u \ (x,y,z,s,j,k)" "atom v \ (u,x,y,z,s,j,k)" by (metis obtain_fresh) show "{Neg (Ex x (Ex y (Var x IN k AND Var j EQ HPair (Var x) (Var y)))), RestrictedP (Var z) k (Var s)} \ Ex s (RestrictedP (Eats (Var z) (Var j)) k (Var s))" apply (rule Ex_I [where x="Var s"]) using uv atoms apply (auto simp: RestrictedP.simps [of u v]) apply (metis Assume Subset_Eats_I Subset_trans) apply (rule Swap, auto) apply (rule All_E [THEN rotate4, of _ _ "Var u"], auto) apply (rule All_E [where x="Var v"], simp) apply (metis Assume Conj_E Iff_E1) apply (rule Mem_Eats_I1) apply (metis Assume AssumeH(3) Subset_D) apply (rule All_E [where x="Var u", THEN rotate5], auto) apply (rule All_E [where x="Var v"], simp) apply (metis Assume AssumeH(2) Conj_I Iff_E2) apply (rule ContraProve [THEN rotate3]) apply (rule Ex_I [where x="Var u"], simp) apply (rule Ex_I [where x="Var v"], auto intro: Sym) done qed hence "{} \ (Ex s (RestrictedP (Var z) k (Var s)))(z::=f)" by (rule Subst) simp thus ?thesis using atoms s by simp (rule thin0) qed (*>*) lemma cut_RestrictedP: assumes s: "atom s \ (f,k,A)" and "\C \ H. atom s \ C" shows "insert (RestrictedP f k (Var s)) H \ A \ H \ A" apply (rule cut_same [OF exists_RestrictedP [of s]]) using assms apply auto done lemma RestrictedP_NotInDom: "{ RestrictedP s k s', Neg (j IN k) } \ NotInDom j s'" proof - obtain x::name and y::name and z::name where "atom x \ (y,s,j,k,s')" "atom y \ (s,j,k,s')" "atom z \ (s,j,k,s')" by (metis obtain_fresh) thus ?thesis apply (auto simp: RestrictedP.simps [of x y] NotInDom.simps [of z]) apply (rule All_E [where x=j, THEN rotate3], auto) apply (rule All_E, auto intro: Conj_E1 Iff_E1) done qed declare RestrictedP.simps [simp del] section \Applications to LstSeqP\ lemma HFun_Sigma_Eats: assumes "H \ HFun_Sigma r" "H \ NotInDom d r" "H \ OrdP d" shows "H \ HFun_Sigma (Eats r (HPair d d'))" (*<*) proof - obtain x::name and y::name and z::name and x'::name and y'::name and z'::name and z''::name where "atom z'' \ (r,d,d',z,z',x,y,x',y')" and "atom z \ (r,d,d',z',x,y,x',y')" and "atom z' \ (r,d,d',x,y,x',y')" and "atom x \ (r,d,d',y,x',y')" and "atom y \ (r,d,d',x',y')" and "atom x' \ (r,d,d',y')" and "atom y' \ (r,d,d')" by (metis obtain_fresh) hence "{ HFun_Sigma r, NotInDom d r, OrdP d } \ HFun_Sigma (Eats r (HPair d d'))" apply (auto simp: HFun_Sigma.simps [of z _ z' x y x' y']) \ \case 1\ apply (rule Ex_I [where x = "Var z"], simp) apply (rule Neg_Imp_I, blast) apply (rule All_E [where x = "Var z'"], auto) \ \case 2\ apply (rule Ex_I [where x = "Var z"], simp) apply (rule Neg_Imp_I, blast) apply (rule All_E [where x = "Var z"], simp) apply (rule Imp_E, auto del: Disj_EH) apply (rule thin1) apply (rule thin1) apply (rule Ex_I [where x = "Var x"], simp) apply (rule Ex_I [where x = "Var y"], simp) apply (rule Ex_I [where x = d], simp) apply (rule Ex_I [where x = d'], auto) apply (blast intro: Disj_I1 OrdNotEqP_I NotInDom_Contra Mem_cong [THEN Iff_MP_same]) \ \case 3\ apply (rule Ex_I [where x = "Var z'"]) apply (subst subst_fm_Ex_with_renaming [where i'=z''] | subst subst_fm.simps)+ apply (auto simp add: flip_fresh_fresh) apply (rule Ex_I [where x = "Var z'", THEN Swap], simp) apply (rule Neg_I) apply (rule Imp_E, auto del: Disj_EH) apply (rule thin1) apply (rule thin1) apply (rule Ex_I [where x = d], simp) apply (rule Ex_I [where x = d'], simp) apply (rule Ex_I [where x = "Var x"], simp) apply (rule Ex_I [where x = "Var y"], auto) apply (blast intro: Disj_I1 Sym_L OrdNotEqP_I NotInDom_Contra Mem_cong [THEN Iff_MP_same]) \ \case 4\ apply (rule rotate2 [OF Swap]) apply (rule Ex_I [where x = d], auto) apply (rule Ex_I [where x = d'], auto) apply (rule Ex_I [where x = d], auto) apply (rule Ex_I [where x = d'], auto intro: Disj_I2) done thus ?thesis using assms by (rule cut3) qed (*>*) lemma HFun_Sigma_single [iff]: "H \ OrdP d \ H \ HFun_Sigma (Eats Zero (HPair d d'))" by (metis HFun_Sigma_Eats HFun_Sigma_Zero NotInDom_Zero) lemma LstSeqP_single [iff]: "H \ LstSeqP (Eats Zero (HPair Zero x)) Zero x" by (auto simp: LstSeqP.simps intro!: OrdP_SUCC_I HDomain_Incl_Eats_I Mem_Eats_I2) lemma NotInDom_LstSeqP_Eats: "{ NotInDom (SUCC k) s, LstSeqP s k y } \ LstSeqP (Eats s (HPair (SUCC k) z)) (SUCC k) z" by (auto simp: LstSeqP.simps intro: HDomain_Incl_Eats_I Mem_Eats_I2 OrdP_SUCC_I HFun_Sigma_Eats) lemma RestrictedP_HDomain_Incl: "{HDomain_Incl s k, RestrictedP s k s'} \ HDomain_Incl s' k" proof - obtain u::name and v::name and x::name and y::name and z::name where "atom u \ (v,s,k,s')" "atom v \ (s,k,s')" "atom x \ (s,k,s',u,v,y,z)" "atom y \ (s,k,s',u,v,z)" "atom z \ (s,k,s',u,v)" by (metis obtain_fresh) thus ?thesis apply (auto simp: HDomain_Incl.simps [of x _ _ y z]) apply (rule Ex_I [where x="Var x"], auto) apply (rule Ex_I [where x="Var y"], auto) apply (rule Ex_I [where x="Var z"], simp) apply (rule Var_Eq_subst_Iff [THEN Iff_MP_same, THEN rotate2]) apply (auto simp: RestrictedP.simps [of u v]) apply (rule All_E [where x="Var x", THEN rotate2], auto) apply (rule All_E [where x="Var y"]) apply (auto intro: Iff_E ContraProve Mem_cong [THEN Iff_MP_same]) done qed lemma RestrictedP_HFun_Sigma: "{HFun_Sigma s, RestrictedP s k s'} \ HFun_Sigma s'" by (metis Assume RestrictedP_imp_Subset Subset_HFun_Sigma rcut2) lemma RestrictedP_LstSeqP: "{ RestrictedP s (SUCC k) s', LstSeqP s k y } \ LstSeqP s' k y" by (auto simp: LstSeqP.simps intro: Mem_Neg_refl cut2 [OF RestrictedP_HDomain_Incl] cut2 [OF RestrictedP_HFun_Sigma] cut3 [OF RestrictedP_Mem]) lemma RestrictedP_LstSeqP_Eats: "{ RestrictedP s (SUCC k) s', LstSeqP s k y } \ LstSeqP (Eats s' (HPair (SUCC k) z)) (SUCC k) z" by (blast intro: Mem_Neg_refl cut2 [OF NotInDom_LstSeqP_Eats] cut2 [OF RestrictedP_NotInDom] cut2 [OF RestrictedP_LstSeqP]) section\Ordinal Addition\ subsection\Predicate form, defined on sequences\ nominal_function SeqHaddP :: "tm \ tm \ tm \ tm \ fm" where "\atom l \ (sl,s,k,j); atom sl \ (s,j)\ \ SeqHaddP s j k y = LstSeqP s k y AND HPair Zero j IN s AND All2 l k (Ex sl (HPair (Var l) (Var sl) IN s AND HPair (SUCC (Var l)) (SUCC (Var sl)) IN s))" by (auto simp: eqvt_def SeqHaddP_graph_aux_def flip_fresh_fresh) (metis obtain_fresh) nominal_termination (eqvt) by lexicographic_order lemma SeqHaddP_fresh_iff [simp]: "a \ SeqHaddP s j k y \ a \ s \ a \ j \ a \ k \ a \ y" proof - obtain l::name and sl::name where "atom l \ (sl,s,k,j)" "atom sl \ (s,j)" by (metis obtain_fresh) thus ?thesis by force qed lemma SeqHaddP_subst [simp]: "(SeqHaddP s j k y)(i::=t) = SeqHaddP (subst i t s) (subst i t j) (subst i t k) (subst i t y)" proof - obtain l::name and sl::name where "atom l \ (s,k,j,sl,t,i)" "atom sl \ (s,k,j,t,i)" by (metis obtain_fresh) thus ?thesis by (auto simp: SeqHaddP.simps [where l=l and sl=sl]) qed declare SeqHaddP.simps [simp del] nominal_function HaddP :: "tm \ tm \ tm \ fm" where "\atom s \ (x,y,z)\ \ HaddP x y z = Ex s (SeqHaddP (Var s) x y z)" by (auto simp: eqvt_def HaddP_graph_aux_def flip_fresh_fresh) (metis obtain_fresh) nominal_termination (eqvt) by lexicographic_order lemma HaddP_fresh_iff [simp]: "a \ HaddP x y z \ a \ x \ a \ y \ a \ z" proof - obtain s::name where "atom s \ (x,y,z)" by (metis obtain_fresh) thus ?thesis by force qed lemma HaddP_subst [simp]: "(HaddP x y z)(i::=t) = HaddP (subst i t x) (subst i t y) (subst i t z)" proof - obtain s::name where "atom s \ (x,y,z,t,i)" by (metis obtain_fresh) thus ?thesis by (auto simp: HaddP.simps [of s]) qed lemma HaddP_cong: "\H \ t EQ t'; H \ u EQ u'; H \ v EQ v'\ \ H \ HaddP t u v IFF HaddP t' u' v'" by (rule P3_cong) auto declare HaddP.simps [simp del] lemma HaddP_Zero2: "H \ HaddP x Zero x" proof - obtain s::name and l::name and sl::name where "atom l \ (sl,s,x)" "atom sl \ (s,x)" "atom s \ x" by (metis obtain_fresh) hence "{} \ HaddP x Zero x" by (auto simp: HaddP.simps [of s] SeqHaddP.simps [of l sl] intro!: Mem_Eats_I2 Ex_I [where x="Eats Zero (HPair Zero x)"]) thus ?thesis by (rule thin0) qed lemma HaddP_imp_OrdP: "{HaddP x y z} \ OrdP y" proof - obtain s::name and l::name and sl::name where "atom l \ (sl,s,x,y,z)" "atom sl \ (s,x,y,z)" "atom s \ (x,y,z)" by (metis obtain_fresh) thus ?thesis by (auto simp: HaddP.simps [of s] SeqHaddP.simps [of l sl] LstSeqP.simps) qed lemma HaddP_SUCC2: "{HaddP x y z} \ HaddP x (SUCC y) (SUCC z)" (*<*) proof - obtain s::name and s'::name and l::name and sl::name where "atom s' \ (l,sl,s,x,y,z)" "atom l \ (sl,s,x,y,z)" "atom sl \ (s,x,y,z)" "atom s \ (x,y,z)" by (metis obtain_fresh) hence "{HaddP x y z, OrdP y} \ HaddP x (SUCC y) (SUCC z)" apply (auto simp: HaddP.simps [of s] SeqHaddP.simps [of l sl]) apply (rule cut_RestrictedP [of s' "Var s" "SUCC y"], auto) apply (rule Ex_I [where x="Eats (Var s') (HPair (SUCC y) (SUCC z))"]) apply (auto intro!: Mem_SUCC_EH) apply (metis rotate2 RestrictedP_LstSeqP_Eats rotate3 thin1) apply (blast intro: Mem_Eats_I1 cut3 [OF RestrictedP_Mem] cut1 [OF Zero_In_SUCC]) apply (rule Ex_I [where x="Var l"], auto) apply (rule Ex_I [where x="Var sl"], auto) apply (blast intro: Mem_Eats_I1 cut3 [OF RestrictedP_Mem] Mem_SUCC_I1) apply (blast intro: Mem_Eats_I1 cut3 [OF RestrictedP_Mem] OrdP_IN_SUCC) apply (rule ContraProve [THEN rotate2]) apply (rule Var_Eq_subst_Iff [THEN Iff_MP_same], simp add: LstSeqP.simps) apply (rule Ex_I [where x=z]) apply (force intro: Mem_Eats_I1 Mem_Eats_I2 cut3 [OF RestrictedP_Mem] Mem_SUCC_I2) done thus ?thesis by (metis Assume HaddP_imp_OrdP cut2) qed (*>*) subsection\Proving that these relations are functions\ lemma SeqHaddP_Zero_E: "{SeqHaddP s w Zero z} \ w EQ z" proof - obtain l::name and sl::name where "atom l \ (s,w,z,sl)" "atom sl \ (s,w)" by (metis obtain_fresh) thus ?thesis by (auto simp: SeqHaddP.simps [of l sl] LstSeqP.simps intro: HFun_Sigma_E) qed lemma SeqHaddP_SUCC_lemma: assumes y': "atom y' \ (s,j,k,y)" shows "{SeqHaddP s j (SUCC k) y} \ Ex y' (SeqHaddP s j k (Var y') AND y EQ SUCC (Var y'))" proof - obtain l::name and sl::name where "atom l \ (s,j,k,y,y',sl)" "atom sl \ (s,j,k,y,y')" by (metis obtain_fresh) thus ?thesis using y' apply (auto simp: SeqHaddP.simps [where s=s and l=l and sl=sl]) apply (rule All2_SUCC_E' [where t=k, THEN rotate2], auto) apply (auto intro!: Ex_I [where x="Var sl"]) apply (blast intro: LstSeqP_SUCC) \ \showing @{term"SeqHaddP s j k (Var sl)"}\ apply (blast intro: LstSeqP_EQ) done qed lemma SeqHaddP_SUCC: assumes "H \ SeqHaddP s j (SUCC k) y" "atom y' \ (s,j,k,y)" shows "H \ Ex y' (SeqHaddP s j k (Var y') AND y EQ SUCC (Var y'))" by (metis SeqHaddP_SUCC_lemma [THEN cut1] assms) lemma SeqHaddP_unique: "{OrdP x, SeqHaddP s w x y, SeqHaddP s' w x y'} \ y' EQ y" (*<*) proof - obtain i::name and j::name and j'::name and k::name and sl::name and sl'::name and l::name and ji::name and ji'::name where ij: "atom i \ (s,s',w,y,y')" "atom j \ (s,s',w,i,x,y,y')" "atom j' \ (s,s',w,i,j,x,y,y')" and atoms: "atom k \ (s,s',w,i,j,j')" "atom sl \ (s,s',w,i,j,j',k)" "atom sl' \ (s,s',w,i,j,j',k,sl)" "atom ji \ (s,s',w,i,j,j',k,sl,sl')" "atom ji' \ (s,s',w,i,j,j',k,sl,sl',ji)" by (metis obtain_fresh) have "{OrdP (Var i)} \ All j (All j' (SeqHaddP s w (Var i) (Var j) IMP (SeqHaddP s' w (Var i) (Var j') IMP Var j' EQ Var j)))" apply (rule OrdInd2H) using ij atoms apply auto apply (metis SeqHaddP_Zero_E [THEN cut1] Assume AssumeH(2) Sym Trans) \ \SUCC case\ apply (rule cut_same [OF SeqHaddP_SUCC [where y' = ji and s=s]], auto) apply (rule cut_same [OF SeqHaddP_SUCC [where y' = ji' and s=s']], auto) apply (rule Ex_I [where x = "Var ji"], auto) apply (rule All_E [where x = "Var ji'"], auto) apply (blast intro: Trans [OF Hyp] Sym intro!: SUCC_cong) done hence "{OrdP (Var i)} \ (All j' (SeqHaddP s w (Var i) (Var j) IMP (SeqHaddP s' w (Var i) (Var j') IMP Var j' EQ Var j)))(j::=y)" by (metis All_D) hence "{OrdP (Var i)} \ All j' (SeqHaddP s w (Var i) y IMP (SeqHaddP s' w (Var i) (Var j') IMP Var j' EQ y))" using ij by simp hence "{OrdP (Var i)} \ (SeqHaddP s w (Var i) y IMP (SeqHaddP s' w (Var i) (Var j') IMP Var j' EQ y))(j'::=y')" by (metis All_D) hence "{OrdP (Var i)} \ SeqHaddP s w (Var i) y IMP (SeqHaddP s' w (Var i) y' IMP y' EQ y)" using ij by simp hence "{} \ (OrdP (Var i) IMP SeqHaddP s w (Var i) y IMP (SeqHaddP s' w (Var i) y' IMP y' EQ y))(i::=x)" by (metis Imp_I Subst emptyE) thus ?thesis using ij by simp (metis DisjAssoc2 Disj_commute anti_deduction) qed (*>*) lemma HaddP_unique: "{HaddP w x y, HaddP w x y'} \ y' EQ y" proof - obtain s::name and s'::name where "atom s \ (w,x,y,y')" "atom s' \ (w,x,y,y',s)" by (metis obtain_fresh) hence "{OrdP x, HaddP w x y, HaddP w x y'} \ y' EQ y" by (auto simp: HaddP.simps [of s _ _ y] HaddP.simps [of s' _ _ y'] intro: SeqHaddP_unique [THEN cut3]) thus ?thesis by (metis HaddP_imp_OrdP cut_same thin1) qed lemma HaddP_Zero1: assumes "H \ OrdP x" shows "H \ HaddP Zero x x" proof - fix k::name have "{ OrdP (Var k) } \ HaddP Zero (Var k) (Var k)" by (rule OrdInd2H [where i=k]) (auto intro: HaddP_Zero2 HaddP_SUCC2 [THEN cut1]) hence "{} \ OrdP (Var k) IMP HaddP Zero (Var k) (Var k)" by (metis Imp_I) hence "{} \ (OrdP (Var k) IMP HaddP Zero (Var k) (Var k))(k::=x)" by (rule Subst) auto hence "{} \ OrdP x IMP HaddP Zero x x" by simp thus ?thesis using assms by (metis MP_same thin0) qed lemma HaddP_Zero_D1: "insert (HaddP Zero x y) H \ x EQ y" by (metis Assume HaddP_imp_OrdP HaddP_Zero1 HaddP_unique [THEN cut2] rcut1) lemma HaddP_Zero_D2: "insert (HaddP x Zero y) H \ x EQ y" by (metis Assume HaddP_Zero2 HaddP_unique [THEN cut2]) lemma HaddP_SUCC_Ex2: assumes "H \ HaddP x (SUCC y) z" "atom z' \ (x,y,z)" shows "H \ Ex z' (HaddP x y (Var z') AND z EQ SUCC (Var z'))" proof - obtain s::name and s'::name where "atom s \ (x,y,z,z')" "atom s' \ (x,y,z,z',s)" by (metis obtain_fresh) hence "{ HaddP x (SUCC y) z } \ Ex z' (HaddP x y (Var z') AND z EQ SUCC (Var z'))" using assms apply (auto simp: HaddP.simps [of s _ _ ] HaddP.simps [of s' _ _ ]) apply (rule cut_same [OF SeqHaddP_SUCC_lemma [of z']], auto) apply (rule Ex_I, auto)+ done thus ?thesis by (metis assms(1) cut1) qed lemma HaddP_SUCC1: "{ HaddP x y z } \ HaddP (SUCC x) y (SUCC z)" (*<*) proof - obtain i::name and j::name and z'::name where atoms: "atom i \ (x,y,z)" "atom j \ (i,x,y,z)" "atom z' \ (x,i,j)" by (metis obtain_fresh) have "{OrdP (Var i)} \ All j (HaddP x (Var i) (Var j) IMP HaddP (SUCC x) (Var i) (SUCC (Var j)))" (is "_ \ ?scheme") proof (rule OrdInd2H) show "{} \ ?scheme(i::=Zero)" using atoms apply auto apply (rule cut_same [OF HaddP_Zero_D2]) apply (rule Var_Eq_subst_Iff [THEN Sym_L, THEN Iff_MP_same], auto intro: HaddP_Zero2) done next show "{} \ All i (OrdP (Var i) IMP ?scheme IMP ?scheme(i::=SUCC (Var i)))" using atoms apply auto apply (rule cut_same [OF HaddP_SUCC_Ex2 [where z'=z']], auto) apply (rule Ex_I [where x="Var z'"], auto) apply (rule Var_Eq_subst_Iff [THEN Iff_MP_same, THEN rotate3], simp) by (metis Assume HaddP_SUCC2 cut1 thin1) qed hence "{OrdP (Var i)} \ (HaddP x (Var i) (Var j) IMP HaddP (SUCC x) (Var i) (SUCC (Var j)))(j::=z)" by (rule All_D) hence "{OrdP (Var i)} \ HaddP x (Var i) z IMP HaddP (SUCC x) (Var i) (SUCC z)" using atoms by auto hence "{} \ HaddP x (Var i) z IMP HaddP (SUCC x) (Var i) (SUCC z)" by (metis HaddP_imp_OrdP Imp_cut) hence "{} \ (HaddP x (Var i) z IMP HaddP (SUCC x) (Var i) (SUCC z))(i::=y)" using atoms by (force intro!: Subst) thus ?thesis using atoms by simp (metis anti_deduction) qed (*>*) lemma HaddP_commute: "{HaddP x y z, OrdP x} \ HaddP y x z" (*<*) proof - obtain i::name and j::name and z'::name where atoms: "atom i \ (x,y,z)" "atom j \ (i,x,y,z)" "atom z' \ (x,i,j)" by (metis obtain_fresh) have "{OrdP (Var i), OrdP x} \ All j (HaddP x (Var i) (Var j) IMP HaddP (Var i) x (Var j))" (is "_ \ ?scheme") proof (rule OrdInd2H) show "{OrdP x} \ ?scheme(i::=Zero)" using atoms apply auto apply (rule cut_same [OF HaddP_Zero_D2]) apply (rule Var_Eq_subst_Iff [THEN Sym_L, THEN Iff_MP_same], auto intro: HaddP_Zero1) done next show "{OrdP x} \ All i (OrdP (Var i) IMP ?scheme IMP ?scheme(i::=SUCC (Var i)))" using atoms apply auto apply (rule cut_same [OF HaddP_SUCC_Ex2 [where z'=z']], auto) apply (rule Ex_I [where x="Var z'"], auto) apply (rule rotate3) apply (rule Var_Eq_subst_Iff [THEN Iff_MP_same], simp) by (metis Assume HaddP_SUCC1 cut1 thin1) qed hence "{OrdP (Var i), OrdP x} \ (HaddP x (Var i) (Var j) IMP HaddP (Var i) x (Var j))(j::=z)" by (rule All_D) hence "{OrdP (Var i), OrdP x} \ HaddP x (Var i) z IMP HaddP (Var i) x z" using atoms by auto hence "{OrdP x} \ HaddP x (Var i) z IMP HaddP (Var i) x z" by (metis HaddP_imp_OrdP Imp_cut) hence "{OrdP x} \ (HaddP x (Var i) z IMP HaddP (Var i) x z)(i::=y)" using atoms by (force intro!: Subst) thus ?thesis using atoms by simp (metis anti_deduction) qed (*>*) lemma HaddP_SUCC_Ex1: assumes "atom i \ (x,y,z)" shows "insert (HaddP (SUCC x) y z) (insert (OrdP x) H) \ Ex i (HaddP x y (Var i) AND z EQ SUCC (Var i))" proof - have "{ HaddP (SUCC x) y z, OrdP x } \ Ex i (HaddP x y (Var i) AND z EQ SUCC (Var i))" apply (rule cut_same [OF HaddP_commute [THEN cut2]]) apply (blast intro: OrdP_SUCC_I)+ apply (rule cut_same [OF HaddP_SUCC_Ex2 [where z'=i]], blast) using assms apply auto apply (auto intro!: Ex_I [where x="Var i"]) by (metis AssumeH(2) HaddP_commute [THEN cut2] HaddP_imp_OrdP rotate2 thin1) thus ?thesis by (metis Assume AssumeH(2) cut2) qed lemma HaddP_inv2: "{HaddP x y z, HaddP x y' z, OrdP x} \ y' EQ y" (*<*) proof - obtain i::name and j::name and u::name and u'::name where atoms: "atom i \ (x,y,y',z)" "atom j \ (i,x,y,y',z)" "atom u \ (x,y,y',i,j)" "atom u' \ (x,y,y',u,i,j)" by (metis obtain_fresh) have "{OrdP (Var i)} \ All j (HaddP (Var i) y (Var j) IMP HaddP (Var i) y' (Var j) IMP y' EQ y)" (is "_ \ ?scheme") proof (rule OrdInd2H) show "{} \ ?scheme(i::=Zero)" using atoms by auto (metis HaddP_Zero_D1 Sym Trans thin1) next show "{} \ All i (OrdP (Var i) IMP ?scheme IMP ?scheme(i::=SUCC (Var i)))" using atoms apply auto apply (rule cut_same [OF HaddP_SUCC_Ex1 [where y=y and i=u, THEN cut2]], auto) apply (rule Ex_I [where x="Var u"], auto) apply (rule cut_same [OF HaddP_SUCC_Ex1 [where y=y' and i=u', THEN cut2]], auto) apply (rule cut_same [where A="SUCC (Var u) EQ SUCC (Var u')"]) apply (auto intro: Sym Trans) apply (rule rotate4 [OF ContraProve]) apply (rule Var_Eq_subst_Iff [THEN Iff_MP_same], force) done qed hence "{OrdP (Var i)} \ (HaddP (Var i) y (Var j) IMP HaddP (Var i) y' (Var j) IMP y' EQ y)(j::=z)" by (rule All_D) hence "{OrdP (Var i)} \ HaddP (Var i) y z IMP HaddP (Var i) y' z IMP y' EQ y" using atoms by auto hence "{} \ OrdP (Var i) IMP HaddP (Var i) y z IMP HaddP (Var i) y' z IMP y' EQ y" by (metis Imp_I) hence "{} \ (OrdP (Var i) IMP HaddP (Var i) y z IMP HaddP (Var i) y' z IMP y' EQ y)(i::=x)" using atoms by (force intro!: Subst) thus ?thesis using atoms by simp (metis DisjAssoc2 Disj_commute anti_deduction) qed (*>*) lemma Mem_imp_subtract: (*<*) assumes "H \ x IN y" "H \ OrdP y" and k: "atom (k::name) \ (x,y)" shows "H \ Ex k (HaddP x (Var k) y AND Zero IN (Var k))" proof - obtain i::name where atoms: "atom i \ (x,y,k)" by (metis obtain_fresh) have "{OrdP (Var i)} \ x IN Var i IMP Ex k (HaddP x (Var k) (Var i) AND Zero IN (Var k))" (is "_ \ ?scheme") proof (rule OrdInd2H) show "{} \ ?scheme(i::=Zero)" by auto next show "{} \ All i (OrdP (Var i) IMP ?scheme IMP ?scheme(i::=SUCC (Var i)))" using atoms k apply (auto intro!: Mem_SUCC_EH) apply (rule Ex_I [where x="SUCC (Var k)"], auto) apply (metis AssumeH(4) HaddP_SUCC2 cut1 insert_commute) apply (blast intro: Mem_SUCC_I1) apply (rule Ex_I [where x="SUCC Zero"], auto) apply (rule thin1) apply (rule Var_Eq_subst_Iff [THEN Sym_L, THEN Iff_MP_same], simp) apply (metis HaddP_SUCC2 HaddP_Zero2 cut1) apply (rule Ex_I [where x="SUCC (Var k)"], auto intro: Mem_SUCC_I1) apply (metis AssumeH(4) HaddP_SUCC2 cut1 insert_commute) done qed hence "{} \ OrdP (Var i) IMP x IN Var i IMP Ex k (HaddP x (Var k) (Var i) AND Zero IN (Var k))" by (metis Imp_I) hence "{} \ (OrdP (Var i) IMP x IN Var i IMP Ex k (HaddP x (Var k) (Var i) AND Zero IN (Var k)))(i::=y)" by (force intro!: Subst) thus ?thesis using assms atoms by simp (metis (no_types) anti_deduction cut2) qed (*>*) lemma HaddP_OrdP: assumes "H \ HaddP x y z" "H \ OrdP x" shows "H \ OrdP z" (*<*) proof - obtain i::name and j::name and k::name where atoms: "atom i \ (x,y,z)" "atom j \ (i,x,y,z)" "atom k \ (i,j,x,y,z)" by (metis obtain_fresh) have "{OrdP (Var i), OrdP x} \ All j (HaddP x (Var i) (Var j) IMP OrdP (Var j))" (is "_ \ ?scheme") proof (rule OrdInd2H) show "{OrdP x} \ ?scheme(i::=Zero)" using atoms by (auto intro: HaddP_Zero_D2 OrdP_cong [THEN Iff_MP_same]) next show "{OrdP x} \ All i (OrdP (Var i) IMP ?scheme IMP ?scheme(i::=SUCC (Var i)))" using atoms apply auto apply (rule cut_same [OF HaddP_SUCC_Ex2 [where z'=k]], auto) apply (rule Ex_I [where x="Var k"], auto) apply (rule Var_Eq_subst_Iff [THEN Iff_MP_same, THEN rotate3], auto intro: OrdP_SUCC_I) done qed hence "{OrdP (Var i), OrdP x} \ (HaddP x (Var i) (Var j) IMP OrdP (Var j))(j::=z)" by (rule All_D) hence "{OrdP (Var i), OrdP x} \ (HaddP x (Var i) z IMP OrdP z)" using atoms by simp hence "{OrdP x} \ HaddP x (Var i) z IMP OrdP z" by (metis HaddP_imp_OrdP Imp_cut) hence "{OrdP x} \ (HaddP x (Var i) z IMP OrdP z)(i::=y)" using atoms by (force intro!: Subst) thus ?thesis using assms atoms by simp (metis anti_deduction cut2) qed (*>*) lemma HaddP_Mem_cancel_left: assumes "H \ HaddP x y' z'" "H \ HaddP x y z" "H \ OrdP x" shows "H \ z' IN z IFF y' IN y" (*<*) proof - obtain i::name and j::name and j'::name and k::name and k'::name where atoms: "atom i \ (x,y,y',z,z')" "atom j \ (i,x,y,y',z,z')" "atom j' \ (i,j,x,y,y',z,z')" "atom k \ (i,j,j',x,y,y',z,z')" "atom k' \ (i,j,j',k,x,y,y',z,z')" by (metis obtain_fresh) have "{OrdP (Var i)} \ All j (All j' (HaddP (Var i) y' (Var j') IMP (HaddP (Var i) y (Var j) IMP ((Var j') IN (Var j) IFF y' IN y))))" (is "_ \ ?scheme") proof (rule OrdInd2H) show "{} \ ?scheme(i::=Zero)" using atoms apply simp apply (rule All_I Imp_I Ex_EH)+ apply (rule cut_same [where A="Var j EQ y"]) apply (metis HaddP_Zero_D1 Sym) apply (rule cut_same [where A="Var j' EQ y'"]) apply (metis HaddP_Zero_D1 Sym thin1) apply (rule Var_Eq_subst_Iff [THEN Iff_MP_same], simp) apply (rule thin1) apply (rule Var_Eq_subst_Iff [THEN Iff_MP_same], auto) done next show "{} \ All i (OrdP (Var i) IMP ?scheme IMP ?scheme(i::=SUCC (Var i)))" using atoms apply simp apply (rule All_I Imp_I Ex_EH)+ apply (rule cut_same [OF HaddP_SUCC_Ex1 [of k "Var i" y "Var j", THEN cut2]], simp_all) apply (rule AssumeH Conj_EH Ex_EH)+ apply (rule cut_same [OF HaddP_SUCC_Ex1 [of k' "Var i" y' "Var j'", THEN cut2]], simp_all) apply (rule AssumeH Conj_EH Ex_EH)+ apply (rule rotate7) apply (rule All_E [where x = "Var k"], simp) apply (rule All_E [where x = "Var k'"], simp_all) apply (rule Imp_E AssumeH)+ apply (rule Iff_trans) prefer 2 apply (rule AssumeH) apply (rule Var_Eq_subst_Iff [THEN Iff_MP_same, THEN rotate3], simp) apply (rule Var_Eq_subst_Iff [THEN Iff_MP_same, THEN rotate5], simp) apply (blast intro!: HaddP_OrdP OrdP_IN_SUCC_Iff) done qed hence "{OrdP (Var i)} \ (All j' (HaddP (Var i) y' (Var j') IMP (HaddP (Var i) y (Var j) IMP ((Var j') IN (Var j) IFF y' IN y))))(j::=z)" by (metis All_D) hence "{OrdP (Var i)} \ (All j' (HaddP (Var i) y' (Var j') IMP (HaddP (Var i) y z IMP ((Var j') IN z IFF y' IN y))))" using atoms by simp hence "{OrdP (Var i)} \ (HaddP (Var i) y' (Var j') IMP (HaddP (Var i) y z IMP ((Var j') IN z IFF y' IN y)))(j'::=z')" by (metis All_D) hence "{OrdP (Var i)} \ HaddP (Var i) y' z' IMP (HaddP (Var i) y z IMP (z' IN z IFF y' IN y))" using atoms by simp hence "{} \ (OrdP (Var i) IMP HaddP (Var i) y' z' IMP (HaddP (Var i) y z IMP (z' IN z IFF y' IN y)))(i::=x)" by (metis Imp_I Subst emptyE) thus ?thesis using atoms by simp (metis assms MP_null MP_same) qed (*>*) lemma HaddP_Mem_cancel_right_Mem: assumes "H \ HaddP x' y z'" "H \ HaddP x y z" "H \ x' IN x" "H \ OrdP x" shows "H \ z' IN z" proof - have "H \ OrdP x'" by (metis Ord_IN_Ord assms(3) assms(4)) hence "H \ HaddP y x' z'" "H \ HaddP y x z" by (blast intro: assms HaddP_commute [THEN cut2])+ thus ?thesis by (blast intro: assms HaddP_imp_OrdP [THEN cut1] HaddP_Mem_cancel_left [THEN Iff_MP2_same]) qed lemma HaddP_Mem_cases: assumes "H \ HaddP k1 k2 k" "H \ OrdP k1" "insert (x IN k1) H \ A" "insert (Var i IN k2) (insert (HaddP k1 (Var i) x) H) \ A" and i: "atom (i::name) \ (k1,k2,k,x,A)" and "\C \ H. atom i \ C" shows "insert (x IN k) H \ A" (*<*) proof - obtain j::name where j: "atom j \ (k1,k2,k,x)" by (metis obtain_fresh) have seq: "{HaddP k1 k2 k, x IN k, OrdP k1} \ x IN k1 OR (Ex i (HaddP k1 (Var i) x AND Var i IN k2))" apply (rule cut_same [OF HaddP_OrdP]) apply (rule AssumeH)+ apply (rule cut_same [OF Ord_IN_Ord]) apply (rule AssumeH)+ apply (rule OrdP_linear [of _ x k1], (rule AssumeH)+) proof - show "{x IN k1, OrdP x, OrdP k, HaddP k1 k2 k, x IN k, OrdP k1} \ x IN k1 OR Ex i (HaddP k1 (Var i) x AND Var i IN k2)" by (blast intro: Disj_I1) next show "{x EQ k1, OrdP x, OrdP k, HaddP k1 k2 k, x IN k, OrdP k1} \ x IN k1 OR Ex i (HaddP k1 (Var i) x AND Var i IN k2)" apply (rule cut_same [OF Zero_In_OrdP [of k2, THEN cut1]]) apply (metis AssumeH(4) HaddP_imp_OrdP cut1) apply auto apply (rule cut_same [where A="HaddP x Zero k"]) apply (blast intro: HaddP_cong [THEN Iff_MP_same] Sym) apply (rule cut_same [where A="x EQ k"]) apply (metis HaddP_Zero_D2) apply (blast intro: Mem_non_refl Mem_cong [THEN Iff_MP_same]) apply (rule Disj_I2) apply (rule Ex_I [where x=Zero]) using i apply auto apply (rule HaddP_cong [THEN Iff_MP_same]) apply (rule AssumeH Refl HaddP_Zero2)+ done next show "{k1 IN x, OrdP x, OrdP k, HaddP k1 k2 k, x IN k, OrdP k1} \ x IN k1 OR Ex i (HaddP k1 (Var i) x AND Var i IN k2)" apply (rule Disj_I2) apply (rule cut_same [OF Mem_imp_subtract [of _ k1 x j]]) apply (rule AssumeH)+ using i j apply auto apply (rule Ex_I [where x="Var j"], auto intro: HaddP_Mem_cancel_left [THEN Iff_MP_same]) done qed show ?thesis using assms by (force intro: cut_same [OF seq [THEN cut3]] thin1 simp: insert_commute) qed (*>*) lemma HaddP_Mem_contra: assumes "H \ HaddP x y z" "H \ z IN x" "H \ OrdP x" shows "H \ A" proof - obtain i::name and j::name and k::name where atoms: "atom i \ (x,y,z)" "atom j \ (i,x,y,z)" "atom k \ (i,j,x,y,z)" by (metis obtain_fresh) have "{OrdP (Var i)} \ All j (HaddP (Var i) y (Var j) IMP Neg ((Var j) IN (Var i)))" (is "_ \ ?scheme") proof (rule OrdInd2H) show "{} \ ?scheme(i::=Zero)" using atoms by auto next show "{} \ All i (OrdP (Var i) IMP ?scheme IMP ?scheme(i::=SUCC (Var i)))" using atoms apply auto apply (rule cut_same [OF HaddP_SUCC_Ex1 [of k "Var i" y "Var j", THEN cut2]], auto) apply (rule Ex_I [where x="Var k"], auto) apply (blast intro: OrdP_IN_SUCC_D Mem_cong [OF _ Refl, THEN Iff_MP_same]) done qed hence "{OrdP (Var i)} \ (HaddP (Var i) y (Var j) IMP Neg ((Var j) IN (Var i)))(j::=z)" by (metis All_D) hence "{} \ OrdP (Var i) IMP HaddP (Var i) y z IMP Neg (z IN (Var i))" using atoms by simp (metis Imp_I) hence "{} \ (OrdP (Var i) IMP HaddP (Var i) y z IMP Neg (z IN (Var i)))(i::=x)" by (metis Subst emptyE) thus ?thesis using atoms by simp (metis MP_same MP_null Neg_D assms) qed (*>*) lemma exists_HaddP: assumes "H \ OrdP y" "atom j \ (x,y)" shows "H \ Ex j (HaddP x y (Var j))" proof - obtain i::name where atoms: "atom i \ (j,x,y)" by (metis obtain_fresh) have "{OrdP (Var i)} \ Ex j (HaddP x (Var i) (Var j))" (is "_ \ ?scheme") proof (rule OrdInd2H) show "{} \ ?scheme(i::=Zero)" using atoms assms by (force intro!: Ex_I [where x=x] HaddP_Zero2) next show "{} \ All i (OrdP (Var i) IMP ?scheme IMP ?scheme(i::=SUCC (Var i)))" using atoms assms apply auto apply (auto intro!: Ex_I [where x="SUCC (Var j)"] HaddP_SUCC2) apply (metis HaddP_SUCC2 insert_commute thin1) done qed hence "{} \ OrdP (Var i) IMP Ex j (HaddP x (Var i) (Var j))" by (metis Imp_I) hence "{} \ (OrdP (Var i) IMP Ex j (HaddP x (Var i) (Var j)))(i::=y)" using atoms by (force intro!: Subst) thus ?thesis using atoms assms by simp (metis MP_null assms(1)) qed lemma HaddP_Mem_I: assumes "H \ HaddP x y z" "H \ OrdP x" shows "H \ x IN SUCC z" proof - have "{HaddP x y z, OrdP x} \ x IN SUCC z" apply (rule OrdP_linear [of _ x "SUCC z"]) apply (auto intro: OrdP_SUCC_I HaddP_OrdP) apply (rule HaddP_Mem_contra, blast) apply (metis Assume Mem_SUCC_I2 OrdP_IN_SUCC_D Sym_L thin1 thin2, blast) apply (blast intro: HaddP_Mem_contra Mem_SUCC_Refl OrdP_Trans) done thus ?thesis by (rule cut2) (auto intro: assms) qed section \A Shifted Sequence\ nominal_function ShiftP :: "tm \ tm \ tm \ tm \ fm" where "\atom x \ (x',y,z,f,del,k); atom x' \ (y,z,f,del,k); atom y \ (z,f,del,k); atom z \ (f,del,g,k)\ \ ShiftP f k del g = All z (Var z IN g IFF (Ex x (Ex x' (Ex y ((Var z) EQ HPair (Var x') (Var y) AND HaddP del (Var x) (Var x') AND HPair (Var x) (Var y) IN f AND Var x IN k)))))" by (auto simp: eqvt_def ShiftP_graph_aux_def flip_fresh_fresh) (metis obtain_fresh) nominal_termination (eqvt) by lexicographic_order lemma ShiftP_fresh_iff [simp]: "a \ ShiftP f k del g \ a \ f \ a \ k \ a \ del \ a \ g" proof - obtain x::name and x'::name and y::name and z::name where "atom x \ (x',y,z,f,del,k)" "atom x' \ (y,z,f,del,k)" "atom y \ (z,f,del,k)" "atom z \ (f,del,g,k)" by (metis obtain_fresh) thus ?thesis by auto qed lemma subst_fm_ShiftP [simp]: "(ShiftP f k del g)(i::=u) = ShiftP (subst i u f) (subst i u k) (subst i u del) (subst i u g)" proof - obtain x::name and x'::name and y::name and z::name where "atom x \ (x',y,z,f,del,k,i,u)" "atom x' \ (y,z,f,del,k,i,u)" "atom y \ (z,f,del,k,i,u)" "atom z \ (f,del,g,k,i,u)" by (metis obtain_fresh) thus ?thesis by (auto simp: ShiftP.simps [of x x' y z]) qed lemma ShiftP_Zero: "{} \ ShiftP Zero k d Zero" proof - obtain x::name and x'::name and y::name and z::name where "atom x \ (x',y,z,k,d)" "atom x' \ (y,z,k,d)" "atom y \ (z,k,d)" "atom z \ (k,d)" by (metis obtain_fresh) thus ?thesis by (auto simp: ShiftP.simps [of x x' y z]) qed lemma ShiftP_Mem1: "{ShiftP f k del g, HPair a b IN f, HaddP del a a', a IN k} \ HPair a' b IN g" proof - obtain x::name and x'::name and y::name and z::name where "atom x \ (x',y,z,f,del,k,a,a',b)" "atom x' \ (y,z,f,del,k,a,a',b)" "atom y \ (z,f,del,k,a,a',b)" "atom z \ (f,del,g,k,a,a',b)" by (metis obtain_fresh) thus ?thesis apply (auto simp: ShiftP.simps [of x x' y z]) apply (rule All_E [where x="HPair a' b"], auto intro!: Iff_E2) apply (rule Ex_I [where x=a], simp) apply (rule Ex_I [where x="a'"], simp) apply (rule Ex_I [where x=b], auto intro: Mem_Eats_I1) done qed lemma ShiftP_Mem2: assumes "atom u \ (f,k,del,a,b)" shows "{ShiftP f k del g, HPair a b IN g} \ Ex u ((Var u) IN k AND HaddP del (Var u) a AND HPair (Var u) b IN f)" proof - obtain x::name and x'::name and y::name and z::name where atoms: "atom x \ (x',y,z,f,del,g,k,a,u,b)" "atom x' \ (y,z,f,del,g,k,a,u,b)" "atom y \ (z,f,del,g,k,a,u,b)" "atom z \ (f,del,g,k,a,u,b)" by (metis obtain_fresh) thus ?thesis using assms apply (auto simp: ShiftP.simps [of x x' y z]) apply (rule All_E [where x="HPair a b"]) apply (auto intro!: Iff_E1 [OF Assume]) apply (rule Ex_I [where x="Var x"]) apply (auto intro: Mem_cong [OF HPair_cong Refl, THEN Iff_MP2_same]) apply (blast intro: HaddP_cong [OF Refl Refl, THEN Iff_MP2_same]) done qed lemma ShiftP_Mem_D: assumes "H \ ShiftP f k del g" "H \ a IN g" "atom x \ (x',y,a,f,del,k)" "atom x' \ (y,a,f,del,k)" "atom y \ (a,f,del,k)" shows "H \ (Ex x (Ex x' (Ex y (a EQ HPair (Var x') (Var y) AND HaddP del (Var x) (Var x') AND HPair (Var x) (Var y) IN f AND Var x IN k))))" (is "_ \ ?concl") proof - obtain z::name where "atom z \ (x,x',y,f,del,g,k,a)" by (metis obtain_fresh) hence "{ShiftP f k del g, a IN g} \ ?concl" using assms by (auto simp: ShiftP.simps [of x x' y z]) (rule All_E [where x=a], auto intro: Iff_E1) thus ?thesis by (rule cut2) (rule assms)+ qed lemma ShiftP_Eats_Eats: "{ShiftP f k del g, HaddP del a a', a IN k} \ ShiftP (Eats f (HPair a b)) k del (Eats g (HPair a' b))" (*<*) proof - obtain x::name and x'::name and y::name and z::name where "atom x \ (x',y,z,f,del,g,k,a,a',b)" "atom x' \ (y,z,f,del,g,k,a,a',b)" "atom y \ (z,f,del,g,k,a,a',b)" "atom z \ (f,del,g,k,a,a',b)" by (metis obtain_fresh) thus ?thesis apply (auto simp: ShiftP.simps [of x x' y z] intro!: Iff_I [THEN Swap]) apply (rule All_E [where x="Var z", THEN rotate2], simp) apply (rule Iff_E) apply auto [1] apply (rule Ex_I [where x="Var x"], simp) apply (rule Ex_I [where x="Var x'"], simp) apply (rule Ex_I [where x="Var y"], simp) apply (blast intro: Mem_Eats_I1, blast) apply (rule Ex_I [where x=a], simp) apply (rule Ex_I [where x="a'"], simp) apply (rule Ex_I [where x=b], simp) apply (metis Assume AssumeH(3) AssumeH(4) Conj_I Mem_Eats_I2 Refl) apply (rule All_E [where x="Var z", THEN rotate5], auto) apply (rule Mem_Eats_I1) apply (rule Iff_MP2_same [OF Hyp], blast) apply (rule Ex_I [where x="Var x"], simp) apply (rule Ex_I [where x="Var x'"], simp) apply (rule Ex_I [where x="Var y"], auto) apply (rule Var_Eq_subst_Iff [THEN Iff_MP_same, THEN rotate5], simp) apply (blast intro: Mem_Eats_I2 HaddP_cong [THEN Iff_MP_same] HaddP_unique [THEN cut2] HPair_cong) done qed (*>*) lemma ShiftP_Eats_Neg: assumes "atom u \ (u',v,f,k,del,g,c)" "atom u' \ (v,f,k,del,g,c)" "atom v \ (f,k,del,g,c)" shows "{ShiftP f k del g, Neg (Ex u (Ex u' (Ex v (c EQ HPair (Var u) (Var v) AND Var u IN k AND HaddP del (Var u) (Var u')))))} \ ShiftP (Eats f c) k del g" (*<*) proof - obtain x::name and x'::name and y::name and z::name where atoms: "atom x \ (x',y,z,u,u',v,f,k,del,g,c)" "atom x' \ (y,z,u,u',v,f,k,del,g,c)" "atom y \ (z,u,u',v,f,k,del,g,c)" "atom z \ (u,u',v,f,k,del,g,c)" by (metis obtain_fresh) thus ?thesis using assms apply (auto simp: ShiftP.simps [of x x' y z] intro!: Iff_I [THEN Swap]) apply (rule All_E [where x="Var z", THEN rotate3]) apply (auto intro!: Iff_E1 [OF Assume]) apply (rule Ex_I [where x="Var x"], simp) apply (rule Ex_I [where x="Var x'"], simp) apply (rule Ex_I [where x="Var y"], simp) apply (blast intro: Mem_Eats_I1) apply (rule All_E [where x="Var z", THEN rotate6], simp) apply (rule Iff_E2) apply (rule Ex_I [where x="Var x"], simp) apply (rule Ex_I [where x="Var x'"], simp) apply (rule Ex_I [where x="Var y"]) apply (auto intro: Mem_Eats_I1) apply (rule Swap [THEN rotate5]) apply (rule Ex_I [where x="Var x"], simp) apply (rule Ex_I [where x="Var x'"], simp) apply (rule Ex_I [where x="Var y"], simp) apply (blast intro: Sym Mem_Eats_I1) done qed (*>*) lemma exists_ShiftP: assumes t: "atom t \ (s,k,del)" shows "H \ Ex t (ShiftP s k del (Var t))" (*<*) proof - obtain i::name and j::name where i: "atom (i::name) \ (s,t,k,del)" and j: "atom (j::name) \ (i,s,t,k,del)" by (metis obtain_fresh) have "{} \ Ex t (ShiftP (Var i) k del (Var t))" (is "{} \ ?scheme") proof (rule Ind [of j]) show "atom j \ (i, ?scheme)" using j by simp next show "{} \ ?scheme(i::=Zero)" using i t by (auto intro!: Ex_I [where x=Zero] simp: ShiftP_Zero) next obtain x::name and x'::name and y::name where atoms: "atom x \ (x',y,s,k,del,t,i,j)" "atom x' \ (y,s,k,del,t,i,j)" "atom y \ (s,k,del,t,i,j)" by (metis obtain_fresh) let ?caseA = "Ex x (Ex x' (Ex y ((Var j) EQ HPair (Var x) (Var y) AND Var x IN k AND HaddP del (Var x) (Var x'))))" show "{} \ All i (All j (?scheme IMP ?scheme(i::=Var j) IMP ?scheme(i::=Eats (Var i) (Var j))))" using i j atoms apply (auto del: Ex_EH) apply (rule Ex_E) apply (auto del: Ex_EH) apply (rule Ex_E) apply (auto del: Ex_EH) apply (rule thin1, auto) proof (rule Cases [where A="?caseA"]) show "{?caseA, ShiftP (Var i) k del (Var t)} \ Ex t (ShiftP (Eats (Var i) (Var j)) k del (Var t))" using i j t atoms apply (auto simp del: ShiftP.simps) apply (rule Ex_I [where x="Eats (Var t) (HPair (Var x') (Var y))"], auto) apply (rule Var_Eq_subst_Iff [THEN Iff_MP_same, THEN rotate3]) apply (auto intro: ShiftP_Eats_Eats [THEN cut3]) done next show "{Neg ?caseA, ShiftP (Var i) k del (Var t)} \ Ex t (ShiftP (Eats (Var i) (Var j)) k del (Var t))" using atoms by (auto intro!: Ex_I [where x="Var t"] ShiftP_Eats_Neg [of x x' y, THEN cut2] simp: ShiftP_Zero) qed qed hence "{} \ (Ex t (ShiftP (Var i) k del (Var t)))(i::=s)" by (blast intro: Subst) thus ?thesis using i t by (auto intro: thin0) qed (*>*) section \Union of Two Sets\ nominal_function UnionP :: "tm \ tm \ tm \ fm" where "atom i \ (x,y,z) \ UnionP x y z = All i (Var i IN z IFF (Var i IN x OR Var i IN y))" by (auto simp: eqvt_def UnionP_graph_aux_def flip_fresh_fresh) (metis obtain_fresh) nominal_termination (eqvt) by lexicographic_order lemma UnionP_fresh_iff [simp]: "a \ UnionP x y z \ a \ x \ a \ y \ a \ z" proof - obtain i::name where "atom i \ (x,y,z)" by (metis obtain_fresh) thus ?thesis by auto qed lemma subst_fm_UnionP [simp]: "(UnionP x y z)(i::=u) = UnionP (subst i u x) (subst i u y) (subst i u z)" proof - obtain j::name where "atom j \ (x,y,z,i,u)" by (metis obtain_fresh) thus ?thesis by (auto simp: UnionP.simps [of j]) qed lemma Union_Zero1: "H \ UnionP Zero x x" proof - obtain i::name where "atom i \ x" by (metis obtain_fresh) hence "{} \ UnionP Zero x x" by (auto simp: UnionP.simps [of i] intro: Disj_I2) thus ?thesis by (metis thin0) qed lemma Union_Eats: "{UnionP x y z} \ UnionP (Eats x a) y (Eats z a)" proof - obtain i::name where "atom i \ (x,y,z,a)" by (metis obtain_fresh) thus ?thesis apply (auto simp: UnionP.simps [of i]) apply (rule Ex_I [where x="Var i"]) apply (auto intro: Iff_E1 [THEN rotate2] Iff_E2 [THEN rotate2] Mem_Eats_I1 Mem_Eats_I2 Disj_I1 Disj_I2) done qed lemma exists_Union_lemma: assumes z: "atom z \ (i,y)" and i: "atom i \ y" shows "{} \ Ex z (UnionP (Var i) y (Var z))" proof - obtain j::name where j: "atom j \ (y,z,i)" by (metis obtain_fresh) show "{} \ Ex z (UnionP (Var i) y (Var z))" apply (rule Ind [of j i]) using j z i apply simp_all apply (rule Ex_I [where x=y], simp add: Union_Zero1) apply (auto del: Ex_EH) apply (rule Ex_E) apply (rule NegNeg_E) apply (rule Ex_E) apply (auto del: Ex_EH) apply (rule thin1, force intro: Ex_I [where x="Eats (Var z) (Var j)"] Union_Eats) done qed lemma exists_UnionP: assumes z: "atom z \ (x,y)" shows "H \ Ex z (UnionP x y (Var z))" proof - obtain i::name where i: "atom i \ (y,z)" by (metis obtain_fresh) hence "{} \ Ex z (UnionP (Var i) y (Var z))" by (metis exists_Union_lemma fresh_Pair fresh_at_base(2) z) hence "{} \ (Ex z (UnionP (Var i) y (Var z)))(i::=x)" by (metis Subst empty_iff) thus ?thesis using i z by (simp add: thin0) qed lemma UnionP_Mem1: "{ UnionP x y z, a IN x } \ a IN z" proof - obtain i::name where "atom i \ (x,y,z,a)" by (metis obtain_fresh) thus ?thesis by (force simp: UnionP.simps [of i] intro: All_E [where x=a] Disj_I1 Iff_E2) qed lemma UnionP_Mem2: "{ UnionP x y z, a IN y } \ a IN z" proof - obtain i::name where "atom i \ (x,y,z,a)" by (metis obtain_fresh) thus ?thesis by (force simp: UnionP.simps [of i] intro: All_E [where x=a] Disj_I2 Iff_E2) qed lemma UnionP_Mem: "{ UnionP x y z, a IN z } \ a IN x OR a IN y" proof - obtain i::name where "atom i \ (x,y,z,a)" by (metis obtain_fresh) thus ?thesis by (force simp: UnionP.simps [of i] intro: All_E [where x=a] Iff_E1) qed lemma UnionP_Mem_E: assumes "H \ UnionP x y z" and "insert (a IN x) H \ A" and "insert (a IN y) H \ A" shows "insert (a IN z) H \ A" using assms by (blast intro: rotate2 cut_same [OF UnionP_Mem [THEN cut2]] thin1) section \Append on Sequences\ nominal_function SeqAppendP :: "tm \ tm \ tm \ tm \ tm \ fm" where "\atom g1 \ (g2,f1,k1,f2,k2,g); atom g2 \ (f1,k1,f2,k2,g)\ \ SeqAppendP f1 k1 f2 k2 g = (Ex g1 (Ex g2 (RestrictedP f1 k1 (Var g1) AND ShiftP f2 k2 k1 (Var g2) AND UnionP (Var g1) (Var g2) g)))" by (auto simp: eqvt_def SeqAppendP_graph_aux_def flip_fresh_fresh) (metis obtain_fresh) nominal_termination (eqvt) by lexicographic_order lemma SeqAppendP_fresh_iff [simp]: "a \ SeqAppendP f1 k1 f2 k2 g \ a \ f1 \ a \ k1 \ a \ f2 \ a \ k2 \ a \ g" proof - obtain g1::name and g2::name where "atom g1 \ (g2,f1,k1,f2,k2,g)" "atom g2 \ (f1,k1,f2,k2,g)" by (metis obtain_fresh) thus ?thesis by auto qed lemma subst_fm_SeqAppendP [simp]: "(SeqAppendP f1 k1 f2 k2 g)(i::=u) = SeqAppendP (subst i u f1) (subst i u k1) (subst i u f2) (subst i u k2) (subst i u g)" proof - obtain g1::name and g2::name where "atom g1 \ (g2,f1,k1,f2,k2,g,i,u)" "atom g2 \ (f1,k1,f2,k2,g,i,u)" by (metis obtain_fresh) thus ?thesis by (auto simp: SeqAppendP.simps [of g1 g2]) qed lemma exists_SeqAppendP: assumes "atom g \ (f1,k1,f2,k2)" shows "H \ Ex g (SeqAppendP f1 k1 f2 k2 (Var g))" proof - obtain g1::name and g2::name where atoms: "atom g1 \ (g2,f1,k1,f2,k2,g)" "atom g2 \ (f1,k1,f2,k2,g)" by (metis obtain_fresh) hence "{} \ Ex g (SeqAppendP f1 k1 f2 k2 (Var g))" using assms apply (auto simp: SeqAppendP.simps [of g1 g2]) apply (rule cut_same [OF exists_RestrictedP [of g1 f1 k1]], auto) apply (rule cut_same [OF exists_ShiftP [of g2 f2 k2 k1]], auto) apply (rule cut_same [OF exists_UnionP [of g "Var g1" "Var g2"]], auto) apply (rule Ex_I [where x="Var g"], simp) apply (rule Ex_I [where x="Var g1"], simp) apply (rule Ex_I [where x="Var g2"], auto) done thus ?thesis using assms by (metis thin0) qed lemma SeqAppendP_Mem1: "{SeqAppendP f1 k1 f2 k2 g, HPair x y IN f1, x IN k1} \ HPair x y IN g" proof - obtain g1::name and g2::name where "atom g1 \ (g2,f1,k1,f2,k2,g,x,y)" "atom g2 \ (f1,k1,f2,k2,g,x,y)" by (metis obtain_fresh) thus ?thesis by (auto simp: SeqAppendP.simps [of g1 g2] intro: UnionP_Mem1 [THEN cut2] RestrictedP_Mem [THEN cut3]) qed lemma SeqAppendP_Mem2: "{SeqAppendP f1 k1 f2 k2 g, HaddP k1 x x', x IN k2, HPair x y IN f2} \ HPair x' y IN g" proof - obtain g1::name and g2::name where "atom g1 \ (g2,f1,k1,f2,k2,g,x,x',y)" "atom g2 \ (f1,k1,f2,k2,g,x,x',y)" by (metis obtain_fresh) thus ?thesis by (auto simp: SeqAppendP.simps [of g1 g2] intro: UnionP_Mem2 [THEN cut2] ShiftP_Mem1 [THEN cut4]) qed lemma SeqAppendP_Mem_E: assumes "H \ SeqAppendP f1 k1 f2 k2 g" and "insert (HPair x y IN f1) (insert (x IN k1) H) \ A" and "insert (HPair (Var u) y IN f2) (insert (HaddP k1 (Var u) x) (insert (Var u IN k2) H)) \ A" and u: "atom u \ (f1,k1,f2,k2,x,y,g,A)" "\C \ H. atom u \ C" shows "insert (HPair x y IN g) H \ A" (*<*) proof - obtain g1::name and g2::name where atoms: "atom g1 \ (g2,f1,k1,f2,k2,g,x,y,u)" "atom g2 \ (f1,k1,f2,k2,g,x,y,u)" by (metis obtain_fresh) hence "{SeqAppendP f1 k1 f2 k2 g, HPair x y IN g} \ (HPair x y IN f1 AND x IN k1) OR Ex u ((Var u) IN k2 AND HaddP k1 (Var u) x AND HPair (Var u) y IN f2)" using u apply (auto simp: SeqAppendP.simps [of g1 g2]) apply (rule UnionP_Mem_E [THEN rotate4]) apply (rule AssumeH)+ apply (blast intro: Disj_I1 cut_same [OF RestrictedP_Mem2 [THEN cut2]]) apply (rule Disj_I2) apply (rule cut_same [OF ShiftP_Mem2 [where u=u, THEN cut2]]) defer 1 apply force+ done thus ?thesis apply (rule cut_same [OF _ [THEN cut2]]) using assms apply (auto intro: thin1 rotate2 thin3 thin4) done qed (*>*) section \LstSeqP and SeqAppendP\ lemma HDomain_Incl_SeqAppendP: \ \The And eliminates the need to prove @{text cut5}\ "{SeqAppendP f1 k1 f2 k2 g, HDomain_Incl f1 k1 AND HDomain_Incl f2 k2, HaddP k1 k2 k, OrdP k1} \ HDomain_Incl g k" (*<*) proof - obtain x::name and y::name and z::name and i::name where "atom x \ (f1,k1,f2,k2,g,k,y,z,i)" "atom y \ (f1,k1,f2,k2,g,k,z,i)" "atom z \ (f1,k1,f2,k2,g,k,i)" "atom i \ (f1,k1,f2,k2,g,k)" by (metis obtain_fresh) thus ?thesis apply (auto simp: HDomain_Incl.simps [of x _ _ y z]) apply (rule HaddP_Mem_cases [where i=i, THEN rotate2], auto) \ \case 1\ apply (rule All_E' [where x = "Var x"], blast, auto) apply (rule ContraProve [THEN rotate4]) apply (rule Ex_I [where x = "Var y"], auto) apply (rule Ex_I [where x = "Var z"], auto) apply (rule Var_Eq_subst_Iff [THEN Iff_MP_same, THEN rotate2], simp) apply (rule SeqAppendP_Mem1 [THEN cut3], auto) apply (rule Mem_cong [OF Assume Refl, THEN Iff_MP_same], auto) \ \case 2\ apply (rule Ex_I [where x = "Var i"], auto) apply (rule ContraProve [THEN rotate5]) apply (rule Ex_I [where x = "Var y"], simp) apply (rule Ex_I [where x = "HPair (Var x) (Var y)"], auto) apply (blast intro: SeqAppendP_Mem2 [THEN cut4] Mem_cong [OF _ Refl, THEN Iff_MP_same]) done qed (*>*) declare SeqAppendP.simps [simp del] lemma HFun_Sigma_SeqAppendP: "{SeqAppendP f1 k1 f2 k2 g, HFun_Sigma f1, HFun_Sigma f2, OrdP k1} \ HFun_Sigma g" (*<*) proof - obtain x::name and y::name and z::name and x'::name and y'::name and z'::name and g1::name and g2::name and v::name and v'::name and w::name where atoms: "atom v \ (v',w,g1,g2,z,z',x,y,x',y',f1,k1,f2,k2,g)" "atom v' \ (w,g1,g2,z,z',x,y,x',y',f1,k1,f2,k2,g)" "atom w \ (g1,g2,z,z',x,y,x',y',f1,k1,f2,k2,g)" "atom g1 \ (g2,z,z',x,y,x',y',f1,k1,f2,k2,g)" "atom g2 \ (z,z',x,y,x',y',f1,k1,f2,k2,g)" "atom z \ (z',x,y,x',y',f1,k1,f2,k2,g)" "atom z' \ (x,y,x',y',f1,k1,f2,k2,g)" "atom x \ (y,x',y',f1,k1,f2,k2,g)" "atom y \ (x',y',f1,k1,f2,k2,g)" "atom x' \ (y',f1,k1,f2,k2,g)" "atom y' \ (f1,k1,f2,k2,g)" by (metis obtain_fresh) thus ?thesis apply (simp add: HFun_Sigma.simps [of z g z' x y x' y'] SeqAppendP.simps [of g1 g2]) apply (rule Ex_EH Conj_EH All_I Imp_I)+ apply (rule cut_same [OF UnionP_Mem [where a = "Var z", THEN cut2]]) apply (rule AssumeH)+ apply (rule Disj_E) apply (rule cut_same [OF UnionP_Mem [where a = "Var z'", THEN cut2]]) apply (rule AssumeH)+ apply (rule thin1 [where A="UnionP (Var g1) (Var g2) g", THEN rotate6]) apply (rule Disj_E) \ \case 1/1\ apply (rule thin1 [where A="ShiftP f2 k2 k1 (Var g2)", THEN rotate5]) apply (rule RestrictedP_Mem_D [where a = "Var z"]) apply (rule AssumeH)+ apply (rule RestrictedP_Mem_D [where a = "Var z'"]) apply (rule AssumeH)+ apply (simp add: HFun_Sigma.simps [of z f1 z' x y x' y']) apply (rule All2_E [where x = "Var z", THEN rotate8], simp_all, blast) apply (rule All2_E [where x = "Var z'"], simp_all, blast) apply (rule Ex_EH Conj_EH)+ apply simp_all apply (rule Ex_I [where x="Var x"], simp) apply (rule Ex_I [where x="Var y"], simp) apply (rule Ex_I [where x="Var x'"], simp) apply (rule Ex_I [where x="Var y'"], simp) apply (rule Conj_I, blast)+ apply blast \ \case 1/2\ apply (rule RestrictedP_Mem_D [where a = "Var z"]) apply (rule AssumeH)+ apply (rule thin1 [where A="Var z IN g", THEN rotate5]) apply (rule thin1 [where A="Var z' IN g", THEN rotate4]) apply (rule cut_same [OF HFun_Sigma_Mem_imp_HPair [of _ f1 "Var z" x y]], simp_all) apply (rule AssumeH)+ apply (rule cut_same [OF ShiftP_Mem_D [where x=v and x'=v' and y=w]]) apply (rule AssumeH Ex_EH Conj_EH)+ apply auto [3] apply (rule AssumeH Ex_EH Conj_EH)+ apply simp_all apply (rule Ex_I [where x="Var x"], simp) apply (rule Ex_I [where x="Var y"], simp) apply (rule Ex_I [where x="Var v'"], simp) apply (rule Ex_I [where x="Var w"], simp) apply auto [1] apply (blast intro: Mem_HFun_Sigma_OrdP [THEN cut2] Mem_cong [OF _ Refl, THEN Iff_MP_same]) apply (blast intro: Hyp HaddP_OrdP) apply (rule cut_same [OF RestrictedP_Mem2 [THEN cut2]]) apply (rule AssumeH)+ apply (blast intro: Mem_cong [OF _ Refl, THEN Iff_MP_same]) apply (blast intro: Hyp Mem_cong [OF _ Refl, THEN Iff_MP_same] HaddP_Mem_contra) \ \END of case 1/2\ apply (rule cut_same [OF UnionP_Mem [where a = "Var z'", THEN cut2]]) apply (rule AssumeH)+ apply (rule thin1 [where A="UnionP (Var g1) (Var g2) g", THEN rotate6]) apply (rule Disj_E) \ \case 2/1\ apply (rule RestrictedP_Mem_D [where a = "Var z'"]) apply (rule AssumeH)+ apply (rule thin1 [where A="Var z IN g", THEN rotate5]) apply (rule thin1 [where A="Var z' IN g", THEN rotate4]) apply (rule cut_same [OF HFun_Sigma_Mem_imp_HPair [of _ f1 "Var z'" x y]], simp_all) apply (rule AssumeH)+ apply (rule cut_same [OF ShiftP_Mem_D [where x=v and x'=v' and y=w]]) apply (rule AssumeH Ex_EH Conj_EH)+ apply auto [3] apply (rule AssumeH Ex_EH Conj_EH)+ apply simp_all apply (rule Ex_I [where x="Var v'"], simp) apply (rule Ex_I [where x="Var w"], simp) apply (rule Ex_I [where x="Var x"], simp) apply (rule Ex_I [where x="Var y"], simp) apply auto [1] apply (blast intro: Hyp HaddP_OrdP) apply (blast intro: Mem_HFun_Sigma_OrdP [THEN cut2] Mem_cong [OF _ Refl, THEN Iff_MP_same]) apply (rule cut_same [OF RestrictedP_Mem2 [THEN cut2]]) apply (rule AssumeH)+ apply (blast intro: Mem_cong [OF _ Refl, THEN Iff_MP_same]) apply (blast intro: Mem_cong [OF _ Refl, THEN Iff_MP2_same] HaddP_Mem_contra Hyp) \ \case 2/2\ apply (rule cut_same [OF ShiftP_Mem_D [where x=x and x'=x' and y=y and a = "Var z"]]) apply (rule AssumeH Ex_EH Conj_EH)+ apply simp_all apply (rule cut_same [OF ShiftP_Mem_D [where x=v and x'=v' and y=w and a = "Var z'"]]) apply (rule AssumeH Ex_EH Conj_EH)+ apply simp_all apply (rule thin1 [where A="ShiftP f2 k2 k1 (Var g2)", THEN rotate7]) apply (rule thin1 [where A="RestrictedP f1 k1 (Var g1)", THEN rotate7]) apply (rule AssumeH Ex_EH Conj_EH)+ apply simp_all apply (rule Ex_I [where x="Var x'"], simp) apply (rule Ex_I [where x="Var y"], simp) apply (rule Ex_I [where x="Var v'"], simp) apply (rule Ex_I [where x="Var w"], auto intro: Hyp HaddP_OrdP) apply (rule cut_same [where A="Var x EQ Var v"]) apply (blast intro: HaddP_inv2 [THEN cut3] HaddP_cong [OF Refl Refl, THEN Iff_MP_same] Hyp) apply (rule HFun_Sigma_E [where r=f2]) apply (auto intro: Hyp Var_Eq_subst_Iff [THEN Iff_MP_same]) done qed (*>*) lemma LstSeqP_SeqAppendP: assumes "H \ SeqAppendP f1 (SUCC k1) f2 (SUCC k2) g" "H \ LstSeqP f1 k1 y1" "H \ LstSeqP f2 k2 y2" "H \ HaddP k1 k2 k" shows "H \ LstSeqP g (SUCC k) y2" proof - have "{SeqAppendP f1 (SUCC k1) f2 (SUCC k2) g, LstSeqP f1 k1 y1, LstSeqP f2 k2 y2, HaddP k1 k2 k} \ LstSeqP g (SUCC k) y2" apply (auto simp: LstSeqP.simps intro: HaddP_OrdP OrdP_SUCC_I) apply (rule HDomain_Incl_SeqAppendP [THEN cut4]) apply (rule AssumeH Conj_I)+ apply (blast intro: HaddP_SUCC1 [THEN cut1] HaddP_SUCC2 [THEN cut1]) apply (blast intro: HaddP_OrdP OrdP_SUCC_I) apply (rule HFun_Sigma_SeqAppendP [THEN cut4]) apply (auto intro: HaddP_OrdP OrdP_SUCC_I) apply (blast intro: Mem_SUCC_Refl HaddP_SUCC1 [THEN cut1] HaddP_SUCC2 [THEN cut1] SeqAppendP_Mem2 [THEN cut4]) done thus ?thesis using assms by (rule cut4) qed lemma SeqAppendP_NotInDom: "{SeqAppendP f1 k1 f2 k2 g, HaddP k1 k2 k, OrdP k1} \ NotInDom k g" proof - obtain x::name and z::name where "atom x \ (z,f1,k1,f2,k2,g,k)" "atom z \ (f1,k1,f2,k2,g,k)" by (metis obtain_fresh) thus ?thesis apply (auto simp: NotInDom.simps [of z]) apply (rule SeqAppendP_Mem_E [where u=x]) apply (rule AssumeH)+ apply (blast intro: HaddP_Mem_contra, simp_all) apply (rule cut_same [where A="(Var x) EQ k2"]) apply (blast intro: HaddP_inv2 [THEN cut3]) apply (blast intro: Mem_non_refl [where x=k2] Mem_cong [OF _ Refl, THEN Iff_MP_same]) done qed lemma LstSeqP_SeqAppendP_Eats: assumes "H \ SeqAppendP f1 (SUCC k1) f2 (SUCC k2) g" "H \ LstSeqP f1 k1 y1" "H \ LstSeqP f2 k2 y2" "H \ HaddP k1 k2 k" shows "H \ LstSeqP (Eats g (HPair (SUCC (SUCC k)) z)) (SUCC (SUCC k)) z" proof - have "{SeqAppendP f1 (SUCC k1) f2 (SUCC k2) g, LstSeqP f1 k1 y1, LstSeqP f2 k2 y2, HaddP k1 k2 k} \ LstSeqP (Eats g (HPair (SUCC (SUCC k)) z)) (SUCC (SUCC k)) z" apply (rule cut2 [OF NotInDom_LstSeqP_Eats]) apply (rule SeqAppendP_NotInDom [THEN cut3]) apply (rule AssumeH) apply (metis HaddP_SUCC1 HaddP_SUCC2 cut1 thin1) apply (metis Assume LstSeqP_OrdP OrdP_SUCC_I insert_commute) apply (blast intro: LstSeqP_SeqAppendP) done thus ?thesis using assms by (rule cut4) qed section \Substitution and Abstraction on Terms\ subsection \Atomic cases\ lemma SeqStTermP_Var_same: assumes "atom s \ (k,v,i)" "atom k \ (v,i)" shows "{VarP v} \ Ex s (Ex k (SeqStTermP v i v i (Var s) (Var k)))" proof - obtain l::name and sl::name and sl'::name and m::name and sm::name and sm'::name and n::name and sn::name and sn'::name where "atom l \ (v,i,s,k,sl,sl',m,n,sm,sm',sn,sn')" "atom sl \ (v,i,s,k,sl',m,n,sm,sm',sn,sn')" "atom sl' \ (v,i,s,k,m,n,sm,sm',sn,sn')" "atom m \ (v,i,s,k,n,sm,sm',sn,sn')" "atom n \ (v,i,s,k,sm,sm',sn,sn')" "atom sm \ (v,i,s,k,sm',sn,sn')" "atom sm' \ (v,i,s,k,sn,sn')" "atom sn \ (v,i,s,k,sn')" "atom sn' \ (v,i,s,k)" by (metis obtain_fresh) thus ?thesis using assms apply (simp add: SeqStTermP.simps [of l _ _ v i sl sl' m n sm sm' sn sn']) apply (rule Ex_I [where x = "Eats Zero (HPair Zero (HPair v i))"], simp) apply (rule Ex_I [where x = Zero], auto intro!: Mem_SUCC_EH) apply (rule Ex_I [where x = v], simp) apply (rule Ex_I [where x = i], auto intro: Disj_I1 Mem_Eats_I2 HPair_cong) done qed lemma SeqStTermP_Var_diff: assumes "atom s \ (k,v,w,i)" "atom k \ (v,w,i)" shows "{VarP v, VarP w, Neg (v EQ w) } \ Ex s (Ex k (SeqStTermP v i w w (Var s) (Var k)))" proof - obtain l::name and sl::name and sl'::name and m::name and sm::name and sm'::name and n::name and sn::name and sn'::name where "atom l \ (v,w,i,s,k,sl,sl',m,n,sm,sm',sn,sn')" "atom sl \ (v,w,i,s,k,sl',m,n,sm,sm',sn,sn')" "atom sl' \ (v,w,i,s,k,m,n,sm,sm',sn,sn')" "atom m \ (v,w,i,s,k,n,sm,sm',sn,sn')" "atom n \ (v,w,i,s,k,sm,sm',sn,sn')" "atom sm \ (v,w,i,s,k,sm',sn,sn')" "atom sm' \ (v,w,i,s,k,sn,sn')" "atom sn \ (v,w,i,s,k,sn')" "atom sn' \ (v,w,i,s,k)" by (metis obtain_fresh) thus ?thesis using assms apply (simp add: SeqStTermP.simps [of l _ _ v i sl sl' m n sm sm' sn sn']) apply (rule Ex_I [where x = "Eats Zero (HPair Zero (HPair w w))"], simp) apply (rule Ex_I [where x = Zero], auto intro!: Mem_SUCC_EH) apply (rule rotate2 [OF Swap]) apply (rule Ex_I [where x = w], simp) apply (rule Ex_I [where x = w], auto simp: VarP_def) apply (blast intro: HPair_cong Mem_Eats_I2) apply (blast intro: Sym OrdNotEqP_I Disj_I1 Disj_I2) done qed lemma SeqStTermP_Zero: assumes "atom s \ (k,v,i)" "atom k \ (v,i)" shows "{VarP v} \ Ex s (Ex k (SeqStTermP v i Zero Zero (Var s) (Var k)))" (*<*) proof - obtain l::name and sl::name and sl'::name and m::name and sm::name and sm'::name and n::name and sn::name and sn'::name where "atom l \ (v,i,s,k,sl,sl',m,n,sm,sm',sn,sn')" "atom sl \ (v,i,s,k,sl',m,n,sm,sm',sn,sn')" "atom sl' \ (v,i,s,k,m,n,sm,sm',sn,sn')" "atom m \ (v,i,s,k,n,sm,sm',sn,sn')" "atom n \ (v,i,s,k,sm,sm',sn,sn')" "atom sm \ (v,i,s,k,sm',sn,sn')" "atom sm' \ (v,i,s,k,sn,sn')" "atom sn \ (v,i,s,k,sn')" "atom sn' \ (v,i,s,k)" by (metis obtain_fresh) thus ?thesis using assms apply (simp add: SeqStTermP.simps [of l _ _ v i sl sl' m n sm sm' sn sn']) apply (rule Ex_I [where x = "Eats Zero (HPair Zero (HPair Zero Zero))"], simp) apply (rule Ex_I [where x = Zero], auto intro!: Mem_SUCC_EH) apply (rule Ex_I [where x = Zero], simp) apply (rule Ex_I [where x = Zero], simp) apply (rule Conj_I) apply (force intro: Var_Eq_subst_Iff [THEN Iff_MP_same] Mem_Eats_I2) apply (force simp: VarP_def OrdNotEqP.simps intro: Disj_I1 Disj_I2) done qed (*>*) -corollary SubstTermP_Zero: "{TermP t} \ SubstTermP \Var v\ t Zero Zero" +corollary SubstTermP_Zero: "{TermP t} \ SubstTermP \Var v\ t Zero Zero" proof - obtain s::name and k::name where "atom s \ (v,t,k)" "atom k \ (v,t)" by (metis obtain_fresh) thus ?thesis by (auto simp: SubstTermP.simps [of s _ _ _ _ k] intro: SeqStTermP_Zero [THEN cut1]) qed corollary SubstTermP_Var_same: "{VarP v, TermP t} \ SubstTermP v t v t" proof - obtain s::name and k::name where "atom s \ (v,t,k)" "atom k \ (v,t)" by (metis obtain_fresh) thus ?thesis by (auto simp: SubstTermP.simps [of s _ _ _ _ k] intro: SeqStTermP_Var_same [THEN cut1]) qed corollary SubstTermP_Var_diff: "{VarP v, VarP w, Neg (v EQ w), TermP t} \ SubstTermP v t w w" proof - obtain s::name and k::name where "atom s \ (v,w,t,k)" "atom k \ (v,w,t)" by (metis obtain_fresh) thus ?thesis by (auto simp: SubstTermP.simps [of s _ _ _ _ k] intro: SeqStTermP_Var_diff [THEN cut3]) qed lemma SeqStTermP_Ind: assumes "atom s \ (k,v,t,i)" "atom k \ (v,t,i)" shows "{VarP v, IndP t} \ Ex s (Ex k (SeqStTermP v i t t (Var s) (Var k)))" proof - obtain l::name and sl::name and sl'::name and m::name and sm::name and sm'::name and n::name and sn::name and sn'::name where "atom l \ (v,t,i,s,k,sl,sl',m,n,sm,sm',sn,sn')" "atom sl \ (v,t,i,s,k,sl',m,n,sm,sm',sn,sn')" "atom sl' \ (v,t,i,s,k,m,n,sm,sm',sn,sn')" "atom m \ (v,t,i,s,k,n,sm,sm',sn,sn')" "atom n \ (v,t,i,s,k,sm,sm',sn,sn')" "atom sm \ (v,t,i,s,k,sm',sn,sn')" "atom sm' \ (v,t,i,s,k,sn,sn')" "atom sn \ (v,t,i,s,k,sn')" "atom sn' \ (v,t,i,s,k)" by (metis obtain_fresh) thus ?thesis using assms apply (simp add: SeqStTermP.simps [of l _ _ v i sl sl' m n sm sm' sn sn']) apply (rule Ex_I [where x = "Eats Zero (HPair Zero (HPair t t))"], simp) apply (rule Ex_I [where x = Zero], auto intro!: Mem_SUCC_EH) apply (rule Ex_I [where x = t], simp) apply (rule Ex_I [where x = t], auto intro: HPair_cong Mem_Eats_I2) apply (blast intro: Disj_I1 Disj_I2 VarP_neq_IndP) done qed corollary SubstTermP_Ind: "{VarP v, IndP w, TermP t} \ SubstTermP v t w w" proof - obtain s::name and k::name where "atom s \ (v,w,t,k)" "atom k \ (v,w,t)" by (metis obtain_fresh) thus ?thesis by (force simp: SubstTermP.simps [of s _ _ _ _ k] intro: SeqStTermP_Ind [THEN cut2]) qed subsection \Non-atomic cases\ lemma SeqStTermP_Eats: assumes sk: "atom s \ (k,s1,s2,k1,k2,t1,t2,u1,u2,v,i)" "atom k \ (t1,t2,u1,u2,v,i)" shows "{SeqStTermP v i t1 u1 s1 k1, SeqStTermP v i t2 u2 s2 k2} \ Ex s (Ex k (SeqStTermP v i (Q_Eats t1 t2) (Q_Eats u1 u2) (Var s) (Var k)))" (*<*) proof - obtain km::name and kn::name and j::name and k'::name and l::name and sl::name and sl'::name and m::name and n::name and sm::name and sm'::name and sn::name and sn'::name where atoms2: "atom km \ (s1,s2,s,k1,k2,k,t1,t2,u1,u2,v,i,kn,j,k',l,sl,sl',m,n,sm,sm',sn,sn')" "atom kn \ (s1,s2,s,k1,k2,k,t1,t2,u1,u2,v,i,j,k',l,sl,sl',m,n,sm,sm',sn,sn')" "atom j \ (s1,s2,s,k1,k2,k,t1,t2,u1,u2,v,i,k',l,sl,sl',m,n,sm,sm',sn,sn')" and atoms: "atom k' \ (s1,s2,s,k1,k2,k,t1,t2,u1,u2,v,i,l,sl,sl',m,n,sm,sm',sn,sn')" "atom l \ (s1,s2,s,k1,k2,k,t1,t2,u1,u2,v,i,sl,sl',m,n,sm,sm',sn,sn')" "atom sl \ (s1,s2,s,k1,k2,k,t1,t2,u1,u2,v,i,sl',m,n,sm,sm',sn,sn')" "atom sl'\ (s1,s2,s,k1,k2,k,t1,t2,u1,u2,v,i,m,n,sm,sm',sn,sn')" "atom m \ (s1,s2,s,k1,k2,k,t1,t2,u1,u2,v,i,n,sm,sm',sn,sn')" "atom n \ (s1,s2,s,k1,k2,k,t1,t2,u1,u2,v,i,sm,sm',sn,sn')" "atom sm \ (s1,s2,s,k1,k2,k,t1,t2,u1,u2,v,i,sm',sn,sn')" "atom sm'\ (s1,s2,s,k1,k2,k,t1,t2,u1,u2,v,i,sn,sn')" "atom sn \ (s1,s2,s,k1,k2,k,t1,t2,u1,u2,v,i,sn')" "atom sn'\ (s1,s2,s,k1,k2,k,t1,t2,u1,u2,v,i)" by (metis obtain_fresh) let ?hyp = "{HaddP k1 k2 (Var k'), OrdP k1, OrdP k2, SeqAppendP s1 (SUCC k1) s2 (SUCC k2) (Var s), SeqStTermP v i t1 u1 s1 k1, SeqStTermP v i t2 u2 s2 k2}" show ?thesis using sk atoms apply (auto simp: SeqStTermP.simps [of l "Var s" _ _ _ sl sl' m n sm sm' sn sn']) apply (rule cut_same [where A="OrdP k1 AND OrdP k2"]) apply (metis Conj_I SeqStTermP_imp_OrdP thin1 thin2) apply (rule cut_same [OF exists_SeqAppendP [of s s1 "SUCC k1" s2 "SUCC k2"]]) apply (rule AssumeH Ex_EH Conj_EH | simp)+ apply (rule cut_same [OF exists_HaddP [where j=k' and x=k1 and y=k2]]) apply (rule AssumeH Ex_EH Conj_EH | simp)+ apply (rule Ex_I [where x="Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (HPair (Q_Eats t1 t2) (Q_Eats u1 u2)))"]) apply (simp_all (no_asm_simp)) apply (rule Ex_I [where x="SUCC (SUCC (Var k'))"], simp) apply (rule Conj_I [OF _ Conj_I]) apply (metis SeqStTermP_imp_VarP thin1) apply (blast intro: LstSeqP_SeqAppendP_Eats SeqStTermP_imp_LstSeqP [THEN cut1]) proof (rule All2_SUCC_I, simp_all) show "?hyp \ Ex sl (Ex sl' (HPair (SUCC (SUCC (Var k'))) (HPair (Var sl) (Var sl')) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (HPair (Q_Eats t1 t2) (Q_Eats u1 u2))) AND ((Var sl EQ v AND Var sl' EQ i OR (IndP (Var sl) OR Var sl NEQ v) AND Var sl' EQ Var sl) OR Ex m (Ex n (Ex sm (Ex sm' (Ex sn (Ex sn' (Var m IN SUCC (SUCC (Var k')) AND Var n IN SUCC (SUCC (Var k')) AND HPair (Var m) (HPair (Var sm) (Var sm')) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (HPair (Q_Eats t1 t2) (Q_Eats u1 u2))) AND HPair (Var n) (HPair (Var sn) (Var sn')) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (HPair (Q_Eats t1 t2) (Q_Eats u1 u2))) AND Var sl EQ Q_Eats (Var sm) (Var sn) AND Var sl' EQ Q_Eats (Var sm') (Var sn'))))))))))" \ \verifying the final values\ apply (rule Ex_I [where x="Q_Eats t1 t2"]) using sk atoms apply simp apply (rule Ex_I [where x="Q_Eats u1 u2"], simp) apply (rule Conj_I, metis Mem_Eats_I2 Refl) apply (rule Disj_I2) apply (rule Ex_I [where x=k1], simp) apply (rule Ex_I [where x="SUCC (Var k')"], simp) apply (rule Ex_I [where x=t1], simp) apply (rule Ex_I [where x=u1], simp) apply (rule Ex_I [where x=t2], simp) apply (rule Ex_I [where x=u2], simp) apply (rule Conj_I) apply (blast intro: HaddP_Mem_I LstSeqP_OrdP Mem_SUCC_I1) apply (rule Conj_I [OF Mem_SUCC_Refl Conj_I]) apply (blast intro: Mem_Eats_I1 SeqAppendP_Mem1 [THEN cut3] Mem_SUCC_Refl SeqStTermP_imp_LstSeqP [THEN cut1] LstSeqP_imp_Mem) apply (blast intro: Mem_Eats_I1 SeqAppendP_Mem2 [THEN cut4] Mem_SUCC_Refl SeqStTermP_imp_LstSeqP [THEN cut1] HaddP_SUCC1 [THEN cut1] LstSeqP_imp_Mem) done next show "?hyp \ All2 l (SUCC (SUCC (Var k'))) (Ex sl (Ex sl' (HPair (Var l) (HPair (Var sl) (Var sl')) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (HPair (Q_Eats t1 t2) (Q_Eats u1 u2))) AND ((Var sl EQ v AND Var sl' EQ i OR (IndP (Var sl) OR Var sl NEQ v) AND Var sl' EQ Var sl) OR Ex m (Ex n (Ex sm (Ex sm' (Ex sn (Ex sn' (Var m IN Var l AND Var n IN Var l AND HPair (Var m) (HPair (Var sm) (Var sm')) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (HPair (Q_Eats t1 t2) (Q_Eats u1 u2))) AND HPair (Var n) (HPair (Var sn) (Var sn')) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (HPair (Q_Eats t1 t2) (Q_Eats u1 u2))) AND Var sl EQ Q_Eats (Var sm) (Var sn) AND Var sl' EQ Q_Eats (Var sm') (Var sn')))))))))))" \ \verifying the sequence buildup\ apply (rule cut_same [where A="HaddP (SUCC k1) (SUCC k2) (SUCC (SUCC (Var k')))"]) apply (blast intro: HaddP_SUCC1 [THEN cut1] HaddP_SUCC2 [THEN cut1]) apply (rule All_I Imp_I)+ apply (rule HaddP_Mem_cases [where i=j]) using sk atoms atoms2 apply simp_all apply (rule AssumeH) apply (blast intro: OrdP_SUCC_I LstSeqP_OrdP) \ \... the sequence buildup via s1\ apply (simp add: SeqStTermP.simps [of l s1 _ _ _ sl sl' m n sm sm' sn sn']) apply (rule AssumeH Ex_EH Conj_EH)+ apply (rule All2_E [THEN rotate2]) apply (simp | rule AssumeH Ex_EH Conj_EH)+ apply (rule Ex_I [where x="Var sl"], simp) apply (rule Ex_I [where x="Var sl'"], simp) apply (rule Conj_I) apply (metis Mem_Eats_I1 SeqAppendP_Mem1 rotate3 thin2 thin4) apply (rule AssumeH Disj_IE1H Ex_EH Conj_EH)+ apply (rule Ex_I [where x="Var m"], simp) apply (rule Ex_I [where x="Var n"], simp) apply (rule Ex_I [where x="Var sm"], simp) apply (rule Ex_I [where x="Var sm'"], simp) apply (rule Ex_I [where x="Var sn"], simp) apply (rule Ex_I [where x="Var sn'"], simp_all) apply (rule Conj_I, rule AssumeH)+ apply (blast del: Disj_EH intro: OrdP_Trans [OF OrdP_SUCC_I] Mem_Eats_I1 [OF SeqAppendP_Mem1 [THEN cut3]] Hyp) \ \... the sequence buildup via s2\ apply (simp add: SeqStTermP.simps [of l s2 _ _ _ sl sl' m n sm sm' sn sn']) apply (rule AssumeH Ex_EH Conj_EH)+ apply (rule All2_E [THEN rotate2]) apply (simp | rule AssumeH Ex_EH Conj_EH)+ apply (rule Ex_I [where x="Var sl"], simp) apply (rule Ex_I [where x="Var sl'"], simp) apply (rule cut_same [where A="OrdP (Var j)"]) apply (metis HaddP_imp_OrdP rotate2 thin2) apply (rule Conj_I) apply (blast intro: Mem_Eats_I1 SeqAppendP_Mem2 [THEN cut4] del: Disj_EH) apply (rule AssumeH Disj_IE1H Ex_EH Conj_EH)+ apply simp_all apply (rule cut_same [OF exists_HaddP [where j=km and x="SUCC k1" and y="Var m"]]) apply (blast intro!: Ord_IN_Ord, simp) apply (rule cut_same [OF exists_HaddP [where j=kn and x="SUCC k1" and y="Var n"]]) apply (blast intro!: Ord_IN_Ord, simp) apply (rule AssumeH Ex_EH Conj_EH | simp)+ apply (rule Ex_I [where x="Var km"], simp) apply (rule Ex_I [where x="Var kn"], simp) apply (rule Ex_I [where x="Var sm"], simp) apply (rule Ex_I [where x="Var sm'"], simp) apply (rule Ex_I [where x="Var sn"], simp) apply (rule Ex_I [where x="Var sn'"], simp_all) apply (rule Conj_I [OF _ Conj_I]) apply (blast intro!: HaddP_Mem_cancel_left [THEN Iff_MP2_same] OrdP_SUCC_I intro: LstSeqP_OrdP Hyp)+ apply (blast intro: OrdP_Trans Hyp Mem_Eats_I1 SeqAppendP_Mem2 [THEN cut4] HaddP_imp_OrdP [THEN cut1]) done qed qed (*>*) theorem SubstTermP_Eats: "{SubstTermP v i t1 u1, SubstTermP v i t2 u2} \ SubstTermP v i (Q_Eats t1 t2) (Q_Eats u1 u2)" proof - obtain k1::name and s1::name and k2::name and s2::name and k::name and s::name where "atom s1 \ (v,i,t1,u1,t2,u2)" "atom k1 \ (v,i,t1,u1,t2,u2,s1)" "atom s2 \ (v,i,t1,u1,t2,u2,k1,s1)" "atom k2 \ (v,i,t1,u1,t2,u2,s2,k1,s1)" "atom s \ (v,i,t1,u1,t2,u2,k2,s2,k1,s1)" "atom k \ (v,i,t1,u1,t2,u2,s,k2,s2,k1,s1)" by (metis obtain_fresh) thus ?thesis by (auto intro!: SeqStTermP_Eats [THEN cut2] simp: SubstTermP.simps [of s _ _ _ "(Q_Eats u1 u2)" k] SubstTermP.simps [of s1 v i t1 u1 k1] SubstTermP.simps [of s2 v i t2 u2 k2]) qed subsection \Substitution over a constant\ lemma SeqConstP_lemma: assumes "atom m \ (s,k,c,n,sm,sn)" "atom n \ (s,k,c,sm,sn)" "atom sm \ (s,k,c,sn)" "atom sn \ (s,k,c)" shows "{ SeqConstP s k c } \ c EQ Zero OR Ex m (Ex n (Ex sm (Ex sn (Var m IN k AND Var n IN k AND SeqConstP s (Var m) (Var sm) AND SeqConstP s (Var n) (Var sn) AND c EQ Q_Eats (Var sm) (Var sn)))))" (*<*) proof - obtain l::name and sl::name where "atom l \ (s,k,c,sl,m,n,sm,sn)" "atom sl \ (s,k,c,m,n,sm,sn)" by (metis obtain_fresh) thus ?thesis using assms apply (simp add: SeqCTermP.simps [of l s k sl m n sm sn]) apply (rule Conj_EH)+ apply (rule All2_SUCC_E [THEN rotate2], auto del: Disj_EH) apply (rule cut_same [where A = "c EQ (Var sl)"]) apply (metis Assume AssumeH(4) LstSeqP_EQ) apply (rule Disj_EH) apply (blast intro: Disj_I1 Sym Trans) \ \now the quantified case\ apply (auto intro!: Disj_I2) apply (rule Ex_I [where x = "Var m"], simp) apply (rule Ex_I [where x = "Var n"], simp) apply (rule Ex_I [where x = "Var sm"], simp) apply (rule Ex_I [where x = "Var sn"], simp) apply (simp_all add: SeqCTermP.simps [of l s _ sl m n sm sn]) apply ((rule Conj_I)+, blast intro: LstSeqP_Mem)+ \ \first SeqCTermP subgoal\ apply (rule All2_Subset [OF Hyp], blast) apply (blast intro!: SUCC_Subset_Ord LstSeqP_OrdP, blast, simp) \ \next SeqCTermP subgoal\ apply ((rule Conj_I)+, blast intro: LstSeqP_Mem)+ apply (rule All2_Subset [OF Hyp], blast) apply (blast intro!: SUCC_Subset_Ord LstSeqP_OrdP, blast, simp) \ \finally, the equality pair\ apply (blast intro: Trans) done qed (*>*) -lemma SeqConstP_imp_SubstTermP: "{SeqConstP s kk c, TermP t} \ SubstTermP \Var w\ t c c" (*<*) +lemma SeqConstP_imp_SubstTermP: "{SeqConstP s kk c, TermP t} \ SubstTermP \Var w\ t c c" (*<*) proof - obtain j::name and k::name and l::name and sl::name and m::name and n::name and sm::name and sn::name where atoms: "atom j \ (s,kk,c,t,k,l,sl,m,n,sm,sn)" "atom k \ (s,kk,c,t,l,sl,m,n,sm,sn)" "atom l \ (s,kk,c,t,sl,m,n,sm,sn)" "atom sl \ (s,kk,c,t,m,n,sm,sn)" "atom m \ (s,kk,c,t,n,sm,sn)" "atom n \ (s,kk,c,t,sm,sn)" "atom sm \ (s,kk,c,t,sn)" "atom sn \ (s,kk,c,t)" by (metis obtain_fresh) - have "{ OrdP (Var k), TermP t } \ All j (SeqConstP s (Var k) (Var j) IMP SubstTermP \Var w\ t (Var j) (Var j))" + have "{ OrdP (Var k), TermP t } \ All j (SeqConstP s (Var k) (Var j) IMP SubstTermP \Var w\ t (Var j) (Var j))" (is "_ \ ?scheme") proof (rule OrdIndH [where j=l]) show "atom l \ (k, ?scheme)" using atoms by simp next show "{TermP t} \ All k (OrdP (Var k) IMP (All2 l (Var k) (?scheme(k::= Var l)) IMP ?scheme))" using atoms apply auto apply (rule Swap) apply (rule cut_same) apply (rule cut1 [OF SeqConstP_lemma [of m s "Var k" "Var j" n sm sn]], auto) \ \case 1, @{term Zero}\ apply (rule Var_Eq_subst_Iff [THEN Iff_MP_same]) apply (auto intro: SubstTermP_Zero [THEN cut1]) \ \case 2, @{term Q_Eats}\ apply (rule Var_Eq_subst_Iff [THEN Iff_MP_same, THEN rotate2], simp) apply (rule SubstTermP_Eats [THEN cut2]) \ \First argument\ apply (rule All2_E' [OF Hyp, where x="Var m"], blast+, simp_all) apply (force intro: All_E [where x="Var sm"]) \ \Second argument\ apply (rule All2_E' [OF Hyp, where x="Var n"], blast+, simp_all) apply (rule All_E [where x="Var sn"], auto) done qed - hence "{OrdP (Var k), TermP t} \ (SeqConstP s (Var k) (Var j) IMP SubstTermP \Var w\ t (Var j) (Var j))(j::=c)" + hence "{OrdP (Var k), TermP t} \ (SeqConstP s (Var k) (Var j) IMP SubstTermP \Var w\ t (Var j) (Var j))(j::=c)" by (metis All_D) - hence "{TermP t} \ (SeqConstP s (Var k) c IMP SubstTermP \Var w\ t c c)" + hence "{TermP t} \ (SeqConstP s (Var k) c IMP SubstTermP \Var w\ t c c)" using atoms by simp (metis Imp_cut SeqCTermP_imp_OrdP) - hence "{TermP t} \ (SeqConstP s (Var k) c IMP SubstTermP \Var w\ t c c)(k::=kk)" + hence "{TermP t} \ (SeqConstP s (Var k) c IMP SubstTermP \Var w\ t c c)(k::=kk)" using atoms by (force intro!: Subst) thus ?thesis using atoms by (simp add: anti_deduction) qed (*>*) -theorem SubstTermP_Const: "{ConstP c, TermP t} \ SubstTermP \Var w\ t c c" +theorem SubstTermP_Const: "{ConstP c, TermP t} \ SubstTermP \Var w\ t c c" proof - obtain s::name and k::name where "atom s \ (c,t,w,k)" "atom k \ (c,t,w)" by (metis obtain_fresh) thus ?thesis by (auto simp: CTermP.simps [of k s c] SeqConstP_imp_SubstTermP) qed section \Substitution on Formulas\ subsection \Membership\ lemma SubstAtomicP_Mem: "{SubstTermP v i x x', SubstTermP v i y y'} \ SubstAtomicP v i (Q_Mem x y) (Q_Mem x' y')" proof - obtain t::name and u::name and t'::name and u'::name where "atom t \ (v,i,x,x',y,y',t',u,u')" "atom t' \ (v,i,x,x',y,y',u,u')" "atom u \ (v,i,x,x',y,y',u')" "atom u' \ (v,i,x,x',y,y')" by (metis obtain_fresh) thus ?thesis apply (simp add: SubstAtomicP.simps [of t _ _ _ _ t' u u']) apply (rule Ex_I [where x = x], simp) apply (rule Ex_I [where x = y], simp) apply (rule Ex_I [where x = x'], simp) apply (rule Ex_I [where x = y'], auto intro: Disj_I2) done qed lemma SeqSubstFormP_Mem: assumes "atom s \ (k,x,y,x',y',v,i)" "atom k \ (x,y,x',y',v,i)" shows "{SubstTermP v i x x', SubstTermP v i y y'} \ Ex s (Ex k (SeqSubstFormP v i (Q_Mem x y) (Q_Mem x' y') (Var s) (Var k)))" proof - let ?vs = "(s,k,x,y,x',y',v,i)" obtain l::name and sl::name and sl'::name and m::name and n::name and sm::name and sm'::name and sn::name and sn'::name where "atom l \ (?vs,sl,sl',m,n,sm,sm',sn,sn')" "atom sl \ (?vs,sl',m,n,sm,sm',sn,sn')" "atom sl' \ (?vs,m,n,sm,sm',sn,sn')" "atom m \ (?vs,n,sm,sm',sn,sn')" "atom n \ (?vs,sm,sm',sn,sn')" "atom sm \ (?vs,sm',sn,sn')" "atom sm' \ (?vs,sn,sn')" "atom sn \ (?vs,sn')" "atom sn' \ ?vs" by (metis obtain_fresh) thus ?thesis using assms apply (auto simp: SeqSubstFormP.simps [of l "Var s" _ _ _ sl sl' m n sm sm' sn sn']) apply (rule Ex_I [where x = "Eats Zero (HPair Zero (HPair (Q_Mem x y) (Q_Mem x' y')))"], simp) apply (rule Ex_I [where x = Zero], auto intro!: Mem_SUCC_EH) apply (rule Ex_I [where x = "Q_Mem x y"], simp) apply (rule Ex_I [where x = "Q_Mem x' y'"], auto intro: Mem_Eats_I2 HPair_cong) apply (blast intro: SubstAtomicP_Mem [THEN cut2] Disj_I1) done qed lemma SubstFormP_Mem: "{SubstTermP v i x x', SubstTermP v i y y'} \ SubstFormP v i (Q_Mem x y) (Q_Mem x' y')" proof - obtain k1::name and s1::name and k2::name and s2::name and k::name and s::name where "atom s1 \ (v,i,x,y,x',y')" "atom k1 \ (v,i,x,y,x',y',s1)" "atom s2 \ (v,i,x,y,x',y',k1,s1)" "atom k2 \ (v,i,x,y,x',y',s2,k1,s1)" "atom s \ (v,i,x,y,x',y',k2,s2,k1,s1)" "atom k \ (v,i,x,y,x',y',s,k2,s2,k1,s1)" by (metis obtain_fresh) thus ?thesis by (auto simp: SubstFormP.simps [of s v i "(Q_Mem x y)" _ k] SubstFormP.simps [of s1 v i x x' k1] SubstFormP.simps [of s2 v i y y' k2] intro: SubstTermP_imp_TermP SubstTermP_imp_VarP SeqSubstFormP_Mem thin1) qed subsection \Equality\ lemma SubstAtomicP_Eq: "{SubstTermP v i x x', SubstTermP v i y y'} \ SubstAtomicP v i (Q_Eq x y) (Q_Eq x' y')" proof - obtain t::name and u::name and t'::name and u'::name where "atom t \ (v,i,x,x',y,y',t',u,u')" "atom t' \ (v,i,x,x',y,y',u,u')" "atom u \ (v,i,x,x',y,y',u')" "atom u' \ (v,i,x,x',y,y')" by (metis obtain_fresh) thus ?thesis apply (simp add: SubstAtomicP.simps [of t _ _ _ _ t' u u']) apply (rule Ex_I [where x = x], simp) apply (rule Ex_I [where x = y], simp) apply (rule Ex_I [where x = x'], simp) apply (rule Ex_I [where x = y'], auto intro: Disj_I1) done qed lemma SeqSubstFormP_Eq: assumes sk: "atom s \ (k,x,y,x',y',v,i)" "atom k \ (x,y,x',y',v,i)" shows "{SubstTermP v i x x', SubstTermP v i y y'} \ Ex s (Ex k (SeqSubstFormP v i (Q_Eq x y) (Q_Eq x' y') (Var s) (Var k)))" proof - let ?vs = "(s,k,x,y,x',y',v,i)" obtain l::name and sl::name and sl'::name and m::name and n::name and sm::name and sm'::name and sn::name and sn'::name where "atom l \ (?vs,sl,sl',m,n,sm,sm',sn,sn')" "atom sl \ (?vs,sl',m,n,sm,sm',sn,sn')" "atom sl' \ (?vs,m,n,sm,sm',sn,sn')" "atom m \ (?vs,n,sm,sm',sn,sn')" "atom n \ (?vs,sm,sm',sn,sn')" "atom sm \ (?vs,sm',sn,sn')" "atom sm' \ (?vs,sn,sn')" "atom sn \ (?vs,sn')" "atom sn' \ ?vs" by (metis obtain_fresh) thus ?thesis using sk apply (auto simp: SeqSubstFormP.simps [of l "Var s" _ _ _ sl sl' m n sm sm' sn sn']) apply (rule Ex_I [where x = "Eats Zero (HPair Zero (HPair (Q_Eq x y) (Q_Eq x' y')))"], simp) apply (rule Ex_I [where x = Zero], auto intro!: Mem_SUCC_EH) apply (rule Ex_I [where x = "Q_Eq x y"], simp) apply (rule Ex_I [where x = "Q_Eq x' y'"], auto) apply (metis Mem_Eats_I2 Assume HPair_cong Refl) apply (blast intro: SubstAtomicP_Eq [THEN cut2] Disj_I1) done qed lemma SubstFormP_Eq: "{SubstTermP v i x x', SubstTermP v i y y'} \ SubstFormP v i (Q_Eq x y) (Q_Eq x' y')" proof - obtain k1::name and s1::name and k2::name and s2::name and k::name and s::name where "atom s1 \ (v,i,x,y,x',y')" "atom k1 \ (v,i,x,y,x',y',s1)" "atom s2 \ (v,i,x,y,x',y',k1,s1)" "atom k2 \ (v,i,x,y,x',y',s2,k1,s1)" "atom s \ (v,i,x,y,x',y',k2,s2,k1,s1)" "atom k \ (v,i,x,y,x',y',s,k2,s2,k1,s1)" by (metis obtain_fresh) thus ?thesis by (auto simp: SubstFormP.simps [of s v i "(Q_Eq x y)" _ k] SubstFormP.simps [of s1 v i x x' k1] SubstFormP.simps [of s2 v i y y' k2] intro: SeqSubstFormP_Eq SubstTermP_imp_TermP SubstTermP_imp_VarP thin1) qed subsection \Negation\ lemma SeqSubstFormP_Neg: assumes "atom s \ (k,s1,k1,x,x',v,i)" "atom k \ (s1,k1,x,x',v,i)" shows "{SeqSubstFormP v i x x' s1 k1, TermP i, VarP v} \ Ex s (Ex k (SeqSubstFormP v i (Q_Neg x) (Q_Neg x') (Var s) (Var k)))" (*<*) proof - let ?vs = "(s1,k1,s,k,x,x',v,i)" obtain l::name and sl::name and sl'::name and m::name and n::name and sm::name and sm'::name and sn::name and sn'::name where atoms: "atom l \ (?vs,sl,sl',m,n,sm,sm',sn,sn')" "atom sl \ (?vs,sl',m,n,sm,sm',sn,sn')" "atom sl' \ (?vs,m,n,sm,sm',sn,sn')" "atom m \ (?vs,n,sm,sm',sn,sn')" "atom n \ (?vs,sm,sm',sn,sn')" "atom sm \ (?vs,sm',sn,sn')" "atom sm' \ (?vs,sn,sn')" "atom sn \ (?vs,sn')" "atom sn' \ ?vs" by (metis obtain_fresh) let ?hyp = "{RestrictedP s1 (SUCC k1) (Var s), OrdP k1, SeqSubstFormP v i x x' s1 k1, TermP i, VarP v}" show ?thesis using assms atoms apply (auto simp: SeqSubstFormP.simps [of l "Var s" _ _ _ sl sl' m n sm sm' sn sn']) apply (rule cut_same [where A="OrdP k1"]) apply (metis SeqSubstFormP_imp_OrdP thin2) apply (rule cut_same [OF exists_RestrictedP [of s s1 "SUCC k1"]]) apply (rule AssumeH Ex_EH Conj_EH | simp)+ apply (rule Ex_I [where x="Eats (Var s) (HPair (SUCC k1) (HPair (Q_Neg x) (Q_Neg x')))"]) apply (simp_all (no_asm_simp)) apply (rule Ex_I [where x="(SUCC k1)"]) apply (simp add: flip_fresh_fresh) apply (rule Conj_I) apply (blast intro: RestrictedP_LstSeqP_Eats [THEN cut2] SeqSubstFormP_imp_LstSeqP [THEN cut1]) proof (rule All2_SUCC_I, simp_all) show "?hyp \ Ex sl (Ex sl' (HPair (SUCC k1) (HPair (Var sl) (Var sl')) IN Eats (Var s) (HPair (SUCC k1) (HPair (Q_Neg x) (Q_Neg x'))) AND (SubstAtomicP v i (Var sl) (Var sl') OR Ex m (Ex n (Ex sm (Ex sm' (Ex sn (Ex sn' (Var m IN SUCC k1 AND Var n IN SUCC k1 AND HPair (Var m) (HPair (Var sm) (Var sm')) IN Eats (Var s) (HPair (SUCC k1) (HPair (Q_Neg x) (Q_Neg x'))) AND HPair (Var n) (HPair (Var sn) (Var sn')) IN Eats (Var s) (HPair (SUCC k1) (HPair (Q_Neg x) (Q_Neg x'))) AND (Var sl EQ Q_Disj (Var sm) (Var sn) AND Var sl' EQ Q_Disj (Var sm') (Var sn') OR Var sl EQ Q_Neg (Var sm) AND Var sl' EQ Q_Neg (Var sm') OR Var sl EQ Q_Ex (Var sm) AND Var sl' EQ Q_Ex (Var sm')))))))))))" \ \verifying the final values\ apply (rule Ex_I [where x="Q_Neg x"]) using assms atoms apply simp apply (rule Ex_I [where x="Q_Neg x'"], simp) apply (rule Conj_I, metis Mem_Eats_I2 Refl) apply (rule Disj_I2) apply (rule Ex_I [where x=k1], simp) apply (rule Ex_I [where x=k1], simp) apply (rule Ex_I [where x=x], simp) apply (rule_tac x=x' in Ex_I, simp) apply (rule Ex_I [where x=x], simp) apply (rule_tac x=x' in Ex_I, simp) apply (rule Conj_I [OF Mem_SUCC_Refl])+ apply (blast intro: Disj_I1 Disj_I2 Mem_Eats_I1 RestrictedP_Mem [THEN cut3] Mem_SUCC_Refl SeqSubstFormP_imp_LstSeqP [THEN cut1] LstSeqP_imp_Mem) done next show "?hyp \ All2 l (SUCC k1) (Ex sl (Ex sl' (HPair (Var l) (HPair (Var sl) (Var sl')) IN Eats (Var s) (HPair (SUCC k1) (HPair (Q_Neg x) (Q_Neg x'))) AND (SubstAtomicP v i (Var sl) (Var sl') OR Ex m (Ex n (Ex sm (Ex sm' (Ex sn (Ex sn' (Var m IN Var l AND Var n IN Var l AND HPair (Var m) (HPair (Var sm) (Var sm')) IN Eats (Var s) (HPair (SUCC k1) (HPair (Q_Neg x) (Q_Neg x'))) AND HPair (Var n) (HPair (Var sn) (Var sn')) IN Eats (Var s) (HPair (SUCC k1) (HPair (Q_Neg x) (Q_Neg x'))) AND (Var sl EQ Q_Disj (Var sm) (Var sn) AND Var sl' EQ Q_Disj (Var sm') (Var sn') OR Var sl EQ Q_Neg (Var sm) AND Var sl' EQ Q_Neg (Var sm') OR Var sl EQ Q_Ex (Var sm) AND Var sl' EQ Q_Ex (Var sm'))))))))))))" \ \verifying the sequence buildup\ apply (rule All_I Imp_I)+ using assms atoms apply simp_all \ \... the sequence buildup via s1\ apply (simp add: SeqSubstFormP.simps [of l s1 _ _ _ sl sl' m n sm sm' sn sn']) apply (rule AssumeH Ex_EH Conj_EH)+ apply (rule All2_E [THEN rotate2], auto del: Disj_EH) apply (rule Ex_I [where x="Var sl"], simp) apply (rule Ex_I [where x="Var sl'"], simp) apply (rule Conj_I) apply (blast intro: Mem_Eats_I1 [OF RestrictedP_Mem [THEN cut3]] del: Disj_EH) apply (rule AssumeH Disj_IE1H Ex_EH Conj_EH)+ apply (rule Ex_I [where x="Var m"], simp) apply (rule Ex_I [where x="Var n"], simp) apply (rule Ex_I [where x="Var sm"], simp) apply (rule Ex_I [where x="Var sm'"], simp) apply (rule Ex_I [where x="Var sn"], simp) apply (rule Ex_I [where x="Var sn'"], auto del: Disj_EH) apply (blast intro: Mem_Eats_I1 [OF RestrictedP_Mem [THEN cut3]] OrdP_Trans [OF OrdP_SUCC_I])+ done qed qed (*>*) theorem SubstFormP_Neg: "{SubstFormP v i x x'} \ SubstFormP v i (Q_Neg x) (Q_Neg x')" proof - obtain k1::name and s1::name and k::name and s::name where "atom s1 \ (v,i,x,x')" "atom k1 \ (v,i,x,x',s1)" "atom s \ (v,i,x,x',k1,s1)" "atom k \ (v,i,x,x',s,k1,s1)" by (metis obtain_fresh) thus ?thesis by (force simp: SubstFormP.simps [of s v i "Q_Neg x" _ k] SubstFormP.simps [of s1 v i x x' k1] intro: SeqSubstFormP_Neg [THEN cut3]) qed subsection \Disjunction\ lemma SeqSubstFormP_Disj: assumes "atom s \ (k,s1,s2,k1,k2,x,y,x',y',v,i)" "atom k \ (s1,s2,k1,k2,x,y,x',y',v,i)" shows "{SeqSubstFormP v i x x' s1 k1, SeqSubstFormP v i y y' s2 k2, TermP i, VarP v} \ Ex s (Ex k (SeqSubstFormP v i (Q_Disj x y) (Q_Disj x' y') (Var s) (Var k)))" (*<*) proof - let ?vs = "(s1,s2,s,k1,k2,k,x,y,x',y',v,i)" obtain km::name and kn::name and j::name and k'::name and l::name and sl::name and sl'::name and m::name and n::name and sm::name and sm'::name and sn::name and sn'::name where atoms2: "atom km \ (kn,j,k',l,s1,s2,s,k1,k2,k,x,y,x',y',v,i,sl,sl',m,n,sm,sm',sn,sn')" "atom kn \ (j,k',l,s1,s2,s,k1,k2,k,x,y,x',y',v,i,sl,sl',m,n,sm,sm',sn,sn')" "atom j \ (k',l,s1,s2,s,k1,k2,k,x,y,x',y',v,i,sl,sl',m,n,sm,sm',sn,sn')" and atoms: "atom k' \ (l,s1,s2,s,k1,k2,k,x,y,x',y',v,i,sl,sl',m,n,sm,sm',sn,sn')" "atom l \ (s1,s2,s,k1,k2,k,x,y,x',y',v,i,sl,sl',m,n,sm,sm',sn,sn')" "atom sl \ (s1,s2,s,k1,k2,k,x,y,x',y',v,i,sl',m,n,sm,sm',sn,sn')" "atom sl' \ (s1,s2,s,k1,k2,k,x,y,x',y',v,i,m,n,sm,sm',sn,sn')" "atom m \ (s1,s2,s,k1,k2,k,x,y,x',y',v,i,n,sm,sm',sn,sn')" "atom n \ (s1,s2,s,k1,k2,k,x,y,x',y',v,i,sm,sm',sn,sn')" "atom sm \ (s1,s2,s,k1,k2,k,x,y,x',y',v,i,sm',sn,sn')" "atom sm' \ (s1,s2,s,k1,k2,k,x,y,x',y',v,i,sn,sn')" "atom sn \ (s1,s2,s,k1,k2,k,x,y,x',y',v,i,sn')" "atom sn' \ (s1,s2,s,k1,k2,k,x,y,x',y',v,i)" by (metis obtain_fresh) let ?hyp = "{HaddP k1 k2 (Var k'), OrdP k1, OrdP k2, SeqAppendP s1 (SUCC k1) s2 (SUCC k2) (Var s), SeqSubstFormP v i x x' s1 k1, SeqSubstFormP v i y y' s2 k2, TermP i, VarP v}" show ?thesis using assms atoms apply (auto simp: SeqSubstFormP.simps [of l "Var s" _ _ _ sl sl' m n sm sm' sn sn']) apply (rule cut_same [where A="OrdP k1 AND OrdP k2"]) apply (metis Conj_I SeqSubstFormP_imp_OrdP thin1 thin2) apply (rule cut_same [OF exists_SeqAppendP [of s s1 "SUCC k1" s2 "SUCC k2"]]) apply (rule AssumeH Ex_EH Conj_EH | simp)+ apply (rule cut_same [OF exists_HaddP [where j=k' and x=k1 and y=k2]]) apply (rule AssumeH Ex_EH Conj_EH | simp)+ apply (rule Ex_I [where x="Eats (Var s) (HPair (SUCC(SUCC(Var k'))) (HPair(Q_Disj x y)(Q_Disj x' y')))"]) apply (simp_all (no_asm_simp)) apply (rule Ex_I [where x="SUCC (SUCC (Var k'))"], simp) apply (rule Conj_I) apply (blast intro: LstSeqP_SeqAppendP_Eats SeqSubstFormP_imp_LstSeqP [THEN cut1]) proof (rule All2_SUCC_I, simp_all) show "?hyp \ Ex sl (Ex sl' (HPair (SUCC (SUCC (Var k'))) (HPair (Var sl) (Var sl')) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (HPair (Q_Disj x y) (Q_Disj x' y'))) AND (SubstAtomicP v i (Var sl) (Var sl') OR Ex m (Ex n (Ex sm (Ex sm' (Ex sn (Ex sn' (Var m IN SUCC (SUCC (Var k')) AND Var n IN SUCC (SUCC (Var k')) AND HPair (Var m) (HPair (Var sm) (Var sm')) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (HPair (Q_Disj x y) (Q_Disj x' y'))) AND HPair (Var n) (HPair (Var sn) (Var sn')) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (HPair (Q_Disj x y) (Q_Disj x' y'))) AND (Var sl EQ Q_Disj (Var sm) (Var sn) AND Var sl' EQ Q_Disj (Var sm') (Var sn') OR Var sl EQ Q_Neg (Var sm) AND Var sl' EQ Q_Neg (Var sm') OR Var sl EQ Q_Ex (Var sm) AND Var sl' EQ Q_Ex (Var sm')))))))))))" \ \verifying the final values\ apply (rule Ex_I [where x="Q_Disj x y"]) using assms atoms apply simp apply (rule Ex_I [where x="Q_Disj x' y'"], simp) apply (rule Conj_I, metis Mem_Eats_I2 Refl) apply (rule Disj_I2) apply (rule Ex_I [where x=k1], simp) apply (rule Ex_I [where x="SUCC (Var k')"], simp) apply (rule Ex_I [where x=x], simp) apply (rule_tac x=x' in Ex_I, simp) apply (rule Ex_I [where x=y], simp) apply (rule_tac x=y' in Ex_I, simp) apply (rule Conj_I) apply (blast intro: HaddP_Mem_I LstSeqP_OrdP Mem_SUCC_I1) apply (rule Conj_I [OF Mem_SUCC_Refl]) apply (blast intro: Disj_I1 Mem_Eats_I1 Mem_SUCC_Refl SeqSubstFormP_imp_LstSeqP [THEN cut1] LstSeqP_imp_Mem SeqAppendP_Mem1 [THEN cut3] SeqAppendP_Mem2 [THEN cut4] HaddP_SUCC1 [THEN cut1]) done next show "?hyp \ All2 l (SUCC (SUCC (Var k'))) (Ex sl (Ex sl' (HPair (Var l) (HPair (Var sl) (Var sl')) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (HPair (Q_Disj x y) (Q_Disj x' y'))) AND (SubstAtomicP v i (Var sl) (Var sl') OR Ex m (Ex n (Ex sm (Ex sm' (Ex sn (Ex sn' (Var m IN Var l AND Var n IN Var l AND HPair (Var m) (HPair (Var sm) (Var sm')) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (HPair (Q_Disj x y) (Q_Disj x' y'))) AND HPair (Var n) (HPair (Var sn) (Var sn')) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (HPair (Q_Disj x y) (Q_Disj x' y'))) AND (Var sl EQ Q_Disj (Var sm) (Var sn) AND Var sl' EQ Q_Disj (Var sm') (Var sn') OR Var sl EQ Q_Neg (Var sm) AND Var sl' EQ Q_Neg (Var sm') OR Var sl EQ Q_Ex (Var sm) AND Var sl' EQ Q_Ex (Var sm'))))))))))))" \ \verifying the sequence buildup\ apply (rule cut_same [where A="HaddP (SUCC k1) (SUCC k2) (SUCC (SUCC (Var k')))"]) apply (blast intro: HaddP_SUCC1 [THEN cut1] HaddP_SUCC2 [THEN cut1]) apply (rule All_I Imp_I)+ apply (rule HaddP_Mem_cases [where i=j]) using assms atoms atoms2 apply simp_all apply (rule AssumeH) apply (blast intro: OrdP_SUCC_I LstSeqP_OrdP) \ \... the sequence buildup via s1\ apply (simp add: SeqSubstFormP.simps [of l s1 _ _ _ sl sl' m n sm sm' sn sn']) apply (rule AssumeH Ex_EH Conj_EH)+ apply (rule All2_E [THEN rotate2]) apply (simp | rule AssumeH Ex_EH Conj_EH)+ apply (rule Ex_I [where x="Var sl"], simp) apply (rule Ex_I [where x="Var sl'"], simp) apply (rule Conj_I [OF Mem_Eats_I1]) apply (metis SeqAppendP_Mem1 rotate3 thin2 thin4) apply (rule AssumeH Disj_IE1H Ex_EH Conj_EH)+ apply (rule Ex_I [where x="Var m"], simp) apply (rule Ex_I [where x="Var n"], simp) apply (rule Ex_I [where x="Var sm"], simp) apply (rule Ex_I [where x="Var sm'"], simp) apply (rule Ex_I [where x="Var sn"], simp) apply (rule Ex_I [where x="Var sn'"], simp_all (no_asm_simp)) apply (rule Conj_I, rule AssumeH)+ apply (rule Conj_I) apply (blast intro: OrdP_Trans [OF OrdP_SUCC_I] Mem_Eats_I1 [OF SeqAppendP_Mem1 [THEN cut3]] Hyp) apply (blast intro: Disj_I1 Disj_I2 OrdP_Trans [OF OrdP_SUCC_I] Mem_Eats_I1 [OF SeqAppendP_Mem1 [THEN cut3]] Hyp) \ \... the sequence buildup via s2\ apply (simp add: SeqSubstFormP.simps [of l s2 _ _ _ sl sl' m n sm sm' sn sn']) apply (rule AssumeH Ex_EH Conj_EH)+ apply (rule All2_E [THEN rotate2]) apply (simp | rule AssumeH Ex_EH Conj_EH)+ apply (rule Ex_I [where x="Var sl"], simp) apply (rule Ex_I [where x="Var sl'"], simp) apply (rule cut_same [where A="OrdP (Var j)"]) apply (metis HaddP_imp_OrdP rotate2 thin2) apply (rule Conj_I) apply (blast intro: Mem_Eats_I1 SeqAppendP_Mem2 [THEN cut4] del: Disj_EH) apply (rule AssumeH Disj_IE1H Ex_EH Conj_EH)+ apply (rule cut_same [OF exists_HaddP [where j=km and x="SUCC k1" and y="Var m"]]) apply (blast intro: Ord_IN_Ord, simp) apply (rule cut_same [OF exists_HaddP [where j=kn and x="SUCC k1" and y="Var n"]]) apply (metis AssumeH(6) Ord_IN_Ord0 rotate8, simp) apply (rule AssumeH Ex_EH Conj_EH | simp)+ apply (rule Ex_I [where x="Var km"], simp) apply (rule Ex_I [where x="Var kn"], simp) apply (rule Ex_I [where x="Var sm"], simp) apply (rule Ex_I [where x="Var sm'"], simp) apply (rule Ex_I [where x="Var sn"], simp) apply (rule Ex_I [where x="Var sn'"], simp_all (no_asm_simp)) apply (rule Conj_I [OF _ Conj_I]) apply (blast intro!: HaddP_Mem_cancel_left [THEN Iff_MP2_same] OrdP_SUCC_I intro: LstSeqP_OrdP Hyp)+ apply (blast del: Disj_EH intro: OrdP_Trans Hyp intro!: Mem_Eats_I1 SeqAppendP_Mem2 [THEN cut4] HaddP_imp_OrdP [THEN cut1]) done qed qed (*>*) theorem SubstFormP_Disj: "{SubstFormP v i x x', SubstFormP v i y y'} \ SubstFormP v i (Q_Disj x y) (Q_Disj x' y')" proof - obtain k1::name and s1::name and k2::name and s2::name and k::name and s::name where "atom s1 \ (v,i,x,y,x',y')" "atom k1 \ (v,i,x,y,x',y',s1)" "atom s2 \ (v,i,x,y,x',y',k1,s1)" "atom k2 \ (v,i,x,y,x',y',s2,k1,s1)" "atom s \ (v,i,x,y,x',y',k2,s2,k1,s1)" "atom k \ (v,i,x,y,x',y',s,k2,s2,k1,s1)" by (metis obtain_fresh) thus ?thesis by (force simp: SubstFormP.simps [of s v i "Q_Disj x y" _ k] SubstFormP.simps [of s1 v i x x' k1] SubstFormP.simps [of s2 v i y y' k2] intro: SeqSubstFormP_Disj [THEN cut4]) qed subsection \Existential\ lemma SeqSubstFormP_Ex: assumes "atom s \ (k,s1,k1,x,x',v,i)" "atom k \ (s1,k1,x,x',v,i)" shows "{SeqSubstFormP v i x x' s1 k1, TermP i, VarP v} \ Ex s (Ex k (SeqSubstFormP v i (Q_Ex x) (Q_Ex x') (Var s) (Var k)))" (*<*) proof - obtain l::name and sl::name and sl'::name and m::name and n::name and sm::name and sm'::name and sn::name and sn'::name where atoms: "atom l \ (s1,k1,s,k,x,x',v,i,sl,sl',m,n,sm,sm',sn,sn')" "atom sl \ (s1,k1,s,k,x,x',v,i,sl',m,n,sm,sm',sn,sn')" "atom sl' \ (s1,k1,s,k,x,x',v,i,m,n,sm,sm',sn,sn')" "atom m \ (s1,k1,s,k,x,x',v,i,n,sm,sm',sn,sn')" "atom n \ (s1,k1,s,k,x,x',v,i,sm,sm',sn,sn')" "atom sm \ (s1,k1,s,k,x,x',v,i,sm',sn,sn')" "atom sm' \ (s1,k1,s,k,x,x',v,i,sn,sn')" "atom sn \ (s1,k1,s,k,x,x',v,i,sn')" "atom sn' \ (s1,k1,s,k,x,x',v,i)" by (metis obtain_fresh) let ?hyp = "{RestrictedP s1 (SUCC k1) (Var s), OrdP k1, SeqSubstFormP v i x x' s1 k1, TermP i, VarP v}" show ?thesis using assms atoms apply (auto simp: SeqSubstFormP.simps [of l "Var s" _ _ _ sl sl' m n sm sm' sn sn']) apply (rule cut_same [where A="OrdP k1"]) apply (metis SeqSubstFormP_imp_OrdP thin2) apply (rule cut_same [OF exists_RestrictedP [of s s1 "SUCC k1"]]) apply (rule AssumeH Ex_EH Conj_EH | simp)+ apply (rule Ex_I [where x="Eats (Var s) (HPair (SUCC k1) (HPair (Q_Ex x) (Q_Ex x')))"], simp) apply (rule Ex_I [where x="(SUCC k1)"], simp) apply (rule Conj_I) apply (blast intro: RestrictedP_LstSeqP_Eats [THEN cut2] SeqSubstFormP_imp_LstSeqP [THEN cut1]) proof (rule All2_SUCC_I, simp_all) show "?hyp \ Ex sl (Ex sl' (HPair (SUCC k1) (HPair (Var sl) (Var sl')) IN Eats (Var s) (HPair (SUCC k1) (HPair (Q_Ex x) (Q_Ex x'))) AND (SubstAtomicP v i (Var sl) (Var sl') OR Ex m (Ex n (Ex sm (Ex sm' (Ex sn (Ex sn' (Var m IN SUCC k1 AND Var n IN SUCC k1 AND HPair (Var m) (HPair (Var sm) (Var sm')) IN Eats (Var s) (HPair (SUCC k1) (HPair (Q_Ex x) (Q_Ex x'))) AND HPair (Var n) (HPair (Var sn) (Var sn')) IN Eats (Var s) (HPair (SUCC k1) (HPair (Q_Ex x) (Q_Ex x'))) AND (Var sl EQ Q_Disj (Var sm) (Var sn) AND Var sl' EQ Q_Disj (Var sm') (Var sn') OR Var sl EQ Q_Neg (Var sm) AND Var sl' EQ Q_Neg (Var sm') OR Var sl EQ Q_Ex (Var sm) AND Var sl' EQ Q_Ex (Var sm')))))))))))" \ \verifying the final values\ apply (rule Ex_I [where x="Q_Ex x"]) using assms atoms apply simp apply (rule Ex_I [where x="Q_Ex x'"], simp) apply (rule Conj_I, metis Mem_Eats_I2 Refl) apply (rule Disj_I2) apply (rule Ex_I [where x=k1], simp) apply (rule Ex_I [where x=k1], simp) apply (rule Ex_I [where x=x], simp) apply (rule_tac x=x' in Ex_I, simp) apply (rule Ex_I [where x=x], simp) apply (rule_tac x=x' in Ex_I, simp) apply (rule Conj_I [OF Mem_SUCC_Refl])+ apply (blast intro: Disj_I2 Mem_Eats_I1 RestrictedP_Mem [THEN cut3] Mem_SUCC_Refl SeqSubstFormP_imp_LstSeqP [THEN cut1] LstSeqP_imp_Mem) done next show "?hyp \ All2 l (SUCC k1) (Ex sl (Ex sl' (HPair (Var l) (HPair (Var sl) (Var sl')) IN Eats (Var s) (HPair (SUCC k1) (HPair (Q_Ex x) (Q_Ex x'))) AND (SubstAtomicP v i (Var sl) (Var sl') OR Ex m (Ex n (Ex sm (Ex sm' (Ex sn (Ex sn' (Var m IN Var l AND Var n IN Var l AND HPair (Var m) (HPair (Var sm) (Var sm')) IN Eats (Var s) (HPair (SUCC k1) (HPair (Q_Ex x) (Q_Ex x'))) AND HPair (Var n) (HPair (Var sn) (Var sn')) IN Eats (Var s) (HPair (SUCC k1) (HPair (Q_Ex x) (Q_Ex x'))) AND (Var sl EQ Q_Disj (Var sm) (Var sn) AND Var sl' EQ Q_Disj (Var sm') (Var sn') OR Var sl EQ Q_Neg (Var sm) AND Var sl' EQ Q_Neg (Var sm') OR Var sl EQ Q_Ex (Var sm) AND Var sl' EQ Q_Ex (Var sm'))))))))))))" \ \verifying the sequence buildup\ using assms atoms \ \... the sequence buildup via s1\ apply (auto simp add: SeqSubstFormP.simps [of l s1 _ _ _ sl sl' m n sm sm' sn sn']) apply (rule Swap) apply (rule All2_E, auto del: Disj_EH) apply (rule Ex_I [where x="Var sl"], simp) apply (rule Ex_I [where x="Var sl'"], simp) apply (rule Conj_I) apply (blast intro: Mem_Eats_I1 [OF RestrictedP_Mem [THEN cut3]] del: Disj_EH) apply (rule AssumeH Disj_IE1H Ex_EH Conj_EH)+ apply (rule Ex_I [where x="Var m"], simp) apply (rule Ex_I [where x="Var n"], simp) apply (rule Ex_I [where x="Var sm"], simp) apply (rule Ex_I [where x="Var sm'"], simp) apply (rule Ex_I [where x="Var sn"], simp) apply (rule Ex_I [where x="Var sn'"]) apply (auto intro: Mem_Eats_I1 [OF RestrictedP_Mem [THEN cut3]] OrdP_Trans [OF OrdP_SUCC_I] del: Disj_EH) done qed qed (*>*) theorem SubstFormP_Ex: "{SubstFormP v i x x'} \ SubstFormP v i (Q_Ex x) (Q_Ex x')" proof - obtain k1::name and s1::name and k::name and s::name where "atom s1 \ (v,i,x,x')" "atom k1 \ (v,i,x,x',s1)" "atom s \ (v,i,x,x',k1,s1)" "atom k \ (v,i,x,x',s,k1,s1)" by (metis obtain_fresh) thus ?thesis by (force simp: SubstFormP.simps [of s v i "Q_Ex x" _ k] SubstFormP.simps [of s1 v i x x' k1] intro: SeqSubstFormP_Ex [THEN cut3]) qed section \Constant Terms\ lemma ConstP_Zero: "{} \ ConstP Zero" proof - obtain s::name and k::name and l::name and sl::name and m::name and n::name and sm::name and sn::name where atoms: "atom s \ (k,l,sl,m,n,sm,sn)" "atom k \ (l,sl,m,n,sm,sn)" "atom l \ (sl,m,n,sm,sn)" "atom sl \ (m,n,sm,sn)" "atom m \ (n,sm,sn)" "atom n \ (sm,sn)" "atom sm \ sn" by (metis obtain_fresh) then show ?thesis apply (subst CTermP.simps[of k s]; auto?) apply (rule Ex_I[of _ _ _ "Eats Zero (HPair Zero Zero)"]; auto?) apply (rule Ex_I[of _ _ _ "Zero"]; auto?) apply (subst SeqCTermP.simps[of l _ _ sl m n sm sn]; auto?) apply (rule Ex_I[of _ _ _ "Zero"]; auto?) apply (rule Mem_SUCC_E[OF Mem_Zero_E]) apply (rule Mem_Eats_I2) apply (rule HPair_cong[OF Assume Refl]) apply (rule Disj_I1[OF Refl]) done qed lemma SeqConstP_Eats: assumes "atom s \ (k,s1,s2,k1,k2,t1,t2)" "atom k \ (s1,s2,k1,k2,t1,t2)" shows "{SeqConstP s1 k1 t1, SeqConstP s2 k2 t2} \ Ex s (Ex k (SeqConstP (Var s) (Var k) (Q_Eats t1 t2)))" (*<*) proof - obtain km::name and kn::name and j::name and k'::name and l::name and sl::name and m::name and n::name and sm::name and sn::name where atoms: "atom km \ (kn,j,k',l,s1,s2,s,k1,k2,k,t1,t2,sl,m,n,sm,sn)" "atom kn \ (j,k',l,s1,s2,s,k1,k2,k,t1,t2,sl,m,n,sm,sn)" "atom j \ (k',l,s1,s2,s,k1,k2,k,t1,t2,sl,m,n,sm,sn)" "atom k' \ (l,s1,s2,s,k1,k2,k,t1,t2,sl,m,n,sm,sn)" "atom l \ (s1,s2,s,k1,k2,k,t1,t2,sl,m,n,sm,sn)" "atom sl \ (s1,s2,s,k1,k2,k,t1,t2,m,n,sm,sn)" "atom m \ (s1,s2,s,k1,k2,k,t1,t2,n,sm,sn)" "atom n \ (s1,s2,s,k1,k2,k,t1,t2,sm,sn)" "atom sm \ (s1,s2,s,k1,k2,k,t1,t2,sn)" "atom sn \ (s1,s2,s,k1,k2,k,t1,t2)" by (metis obtain_fresh) let ?hyp = "{HaddP k1 k2 (Var k'), OrdP k1, OrdP k2, SeqAppendP s1 (SUCC k1) s2 (SUCC k2) (Var s), SeqConstP s1 k1 t1, SeqConstP s2 k2 t2}" show ?thesis using assms atoms apply (auto simp: SeqCTermP.simps [of l "Var s" _ sl m n sm sn]) apply (rule cut_same [where A="OrdP k1 AND OrdP k2"]) apply (metis Conj_I SeqCTermP_imp_OrdP thin1 thin2) apply (rule cut_same [OF exists_SeqAppendP [of s s1 "SUCC k1" s2 "SUCC k2"]]) apply (rule AssumeH Ex_EH Conj_EH | simp)+ apply (rule cut_same [OF exists_HaddP [where j=k' and x=k1 and y=k2]]) apply (rule AssumeH Ex_EH Conj_EH | simp)+ apply (rule Ex_I [where x="Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (Q_Eats t1 t2))"], simp) apply (rule Ex_I [where x="SUCC (SUCC (Var k'))"], simp) apply (rule Conj_I) apply (blast intro: LstSeqP_SeqAppendP_Eats SeqCTermP_imp_LstSeqP [THEN cut1]) proof (rule All2_SUCC_I, simp_all) show "?hyp \ Ex sl (HPair (SUCC (SUCC (Var k'))) (Var sl) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (Q_Eats t1 t2)) AND (Var sl EQ Zero OR Fls OR Ex m (Ex n(Ex sm (Ex sn (Var m IN SUCC (SUCC (Var k')) AND Var n IN SUCC (SUCC (Var k')) AND HPair (Var m) (Var sm) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (Q_Eats t1 t2)) AND HPair (Var n) (Var sn) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (Q_Eats t1 t2)) AND Var sl EQ Q_Eats (Var sm) (Var sn)))))))" \ \verifying the final values\ apply (rule Ex_I [where x="Q_Eats t1 t2"]) using assms atoms apply simp apply (rule Conj_I, metis Mem_Eats_I2 Refl) apply (rule Disj_I2)+ apply (rule Ex_I [where x=k1], simp) apply (rule Ex_I [where x="SUCC (Var k')"], simp) apply (rule Ex_I [where x=t1], simp) apply (rule Ex_I [where x=t2], simp) apply (rule Conj_I) apply (blast intro: HaddP_Mem_I LstSeqP_OrdP Mem_SUCC_I1) apply (blast intro: Mem_Eats_I1 SeqAppendP_Mem1 [THEN cut3] SeqAppendP_Mem2 [THEN cut4] Mem_SUCC_Refl SeqCTermP_imp_LstSeqP [THEN cut1] LstSeqP_imp_Mem HaddP_SUCC1 [THEN cut1]) done next show "?hyp \ All2 l (SUCC (SUCC (Var k'))) (Ex sl (HPair (Var l) (Var sl) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (Q_Eats t1 t2)) AND (Var sl EQ Zero OR Fls OR Ex m (Ex n (Ex sm (Ex sn (Var m IN Var l AND Var n IN Var l AND HPair (Var m) (Var sm) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (Q_Eats t1 t2)) AND HPair (Var n) (Var sn) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (Q_Eats t1 t2)) AND Var sl EQ Q_Eats (Var sm) (Var sn))))))))" \ \verifying the sequence buildup\ apply (rule cut_same [where A="HaddP (SUCC k1) (SUCC k2) (SUCC (SUCC (Var k')))"]) apply (blast intro: HaddP_SUCC1 [THEN cut1] HaddP_SUCC2 [THEN cut1]) apply (rule All_I Imp_I)+ apply (rule HaddP_Mem_cases [where i=j]) using assms atoms apply simp_all apply (rule AssumeH) apply (blast intro: OrdP_SUCC_I LstSeqP_OrdP) \ \... the sequence buildup via s1\ apply (simp add: SeqCTermP.simps [of l s1 _ sl m n sm sn]) apply (rule AssumeH Ex_EH Conj_EH)+ apply (rule All2_E [THEN rotate2], auto del: Disj_EH) apply (rule Ex_I [where x="Var sl"], simp) apply (rule Conj_I) apply (rule Mem_Eats_I1) apply (metis SeqAppendP_Mem1 rotate3 thin2 thin4) apply (rule AssumeH Disj_IE1H Ex_EH Conj_EH)+ apply simp_all apply (rule Ex_I [where x="Var m"], simp) apply (rule Ex_I [where x="Var n"], simp) apply (rule Ex_I [where x="Var sm"], simp) apply (rule Ex_I [where x="Var sn"], simp) apply (rule Conj_I, rule AssumeH)+ apply (blast del: Disj_EH intro: OrdP_Trans [OF OrdP_SUCC_I] Mem_Eats_I1 [OF SeqAppendP_Mem1 [THEN cut3]] Hyp) \ \... the sequence buildup via s2\ apply (simp add: SeqCTermP.simps [of l s2 _ sl m n sm sn]) apply (rule AssumeH Ex_EH Conj_EH)+ apply (rule All2_E [THEN rotate2], auto del: Disj_EH) apply (rule Ex_I [where x="Var sl"], simp) apply (rule cut_same [where A="OrdP (Var j)"]) apply (metis HaddP_imp_OrdP rotate2 thin2) apply (rule Conj_I) apply (blast intro: Mem_Eats_I1 SeqAppendP_Mem2 [THEN cut4] del: Disj_EH) apply (rule AssumeH Disj_IE1H Ex_EH Conj_EH)+ apply (rule cut_same [OF exists_HaddP [where j=km and x="SUCC k1" and y="Var m"]]) apply (blast intro: Ord_IN_Ord, simp) apply (rule cut_same [OF exists_HaddP [where j=kn and x="SUCC k1" and y="Var n"]]) apply (metis AssumeH(6) Ord_IN_Ord0 rotate8, simp) apply (rule AssumeH Ex_EH Conj_EH | simp)+ apply (rule Ex_I [where x="Var km"], simp) apply (rule Ex_I [where x="Var kn"], simp) apply (rule Ex_I [where x="Var sm"], simp) apply (rule Ex_I [where x="Var sn"], simp_all) apply (rule Conj_I [OF _ Conj_I]) apply (blast intro!: HaddP_Mem_cancel_left [THEN Iff_MP2_same] OrdP_SUCC_I intro: LstSeqP_OrdP Hyp)+ apply (blast del: Disj_EH intro: OrdP_Trans Hyp intro!: Mem_Eats_I1 SeqAppendP_Mem2 [THEN cut4] HaddP_imp_OrdP [THEN cut1]) done qed qed (*>*) theorem ConstP_Eats: "{ConstP t1, ConstP t2} \ ConstP (Q_Eats t1 t2)" proof - obtain k1::name and s1::name and k2::name and s2::name and k::name and s::name where "atom s1 \ (t1,t2)" "atom k1 \ (t1,t2,s1)" "atom s2 \ (t1,t2,k1,s1)" "atom k2 \ (t1,t2,s2,k1,s1)" "atom s \ (t1,t2,k2,s2,k1,s1)" "atom k \ (t1,t2,s,k2,s2,k1,s1)" by (metis obtain_fresh) thus ?thesis by (auto simp: CTermP.simps [of k s "(Q_Eats t1 t2)"] CTermP.simps [of k1 s1 t1] CTermP.simps [of k2 s2 t2] intro!: SeqConstP_Eats [THEN cut2]) qed lemma TermP_Zero: "{} \ TermP Zero" proof - obtain s::name and k::name and l::name and sl::name and m::name and n::name and sm::name and sn::name where atoms: "atom s \ (k,l,sl,m,n,sm,sn)" "atom k \ (l,sl,m,n,sm,sn)" "atom l \ (sl,m,n,sm,sn)" "atom sl \ (m,n,sm,sn)" "atom m \ (n,sm,sn)" "atom n \ (sm,sn)" "atom sm \ sn" by (metis obtain_fresh) then show ?thesis apply (subst CTermP.simps[of k s]; auto?) apply (rule Ex_I[of _ _ _ "Eats Zero (HPair Zero Zero)"]; auto?) apply (rule Ex_I[of _ _ _ "Zero"]; auto?) apply (subst SeqCTermP.simps[of l _ _ sl m n sm sn]; auto?) apply (rule Ex_I[of _ _ _ "Zero"]; auto?) apply (rule Mem_SUCC_E[OF Mem_Zero_E]) apply (rule Mem_Eats_I2) apply (rule HPair_cong[OF Assume Refl]) apply (rule Disj_I1[OF Refl]) done qed -lemma TermP_Var: "{} \ TermP \Var x\" +lemma TermP_Var: "{} \ TermP \Var x\" proof - obtain s::name and k::name and l::name and sl::name and m::name and n::name and sm::name and sn::name where atoms: "atom s \ (k,l,sl,m,n,sm,sn,x)" "atom k \ (l,sl,m,n,sm,sn,x)" "atom l \ (sl,m,n,sm,sn,x)" "atom sl \ (m,n,sm,sn,x)" "atom m \ (n,sm,sn,x)" "atom n \ (sm,sn,x)" "atom sm \ (sn,x)" "atom sn \ x" by (metis obtain_fresh) then show ?thesis apply (subst CTermP.simps[of k s]; auto?) - apply (rule Ex_I[of _ _ _ "Eats Zero (HPair Zero \Var x\)"]; auto?) + apply (rule Ex_I[of _ _ _ "Eats Zero (HPair Zero \Var x\)"]; auto?) apply (rule Ex_I[of _ _ _ "Zero"]; auto?) apply (subst SeqCTermP.simps[of l _ _ sl m n sm sn]; auto?) - apply (rule Ex_I[of _ _ _ "\Var x\"]; auto?) + apply (rule Ex_I[of _ _ _ "\Var x\"]; auto?) apply (rule Mem_SUCC_E[OF Mem_Zero_E]) apply (rule Mem_Eats_I2) apply (rule HPair_cong[OF Assume Refl]) apply (rule Disj_I2[OF Disj_I1]) apply (auto simp: VarP_Var) done qed lemma SeqTermP_Eats: assumes "atom s \ (k,s1,s2,k1,k2,t1,t2)" "atom k \ (s1,s2,k1,k2,t1,t2)" shows "{SeqTermP s1 k1 t1, SeqTermP s2 k2 t2} \ Ex s (Ex k (SeqTermP (Var s) (Var k) (Q_Eats t1 t2)))" (*<*) proof - obtain km::name and kn::name and j::name and k'::name and l::name and sl::name and m::name and n::name and sm::name and sn::name where atoms: "atom km \ (kn,j,k',l,s1,s2,s,k1,k2,k,t1,t2,sl,m,n,sm,sn)" "atom kn \ (j,k',l,s1,s2,s,k1,k2,k,t1,t2,sl,m,n,sm,sn)" "atom j \ (k',l,s1,s2,s,k1,k2,k,t1,t2,sl,m,n,sm,sn)" "atom k' \ (l,s1,s2,s,k1,k2,k,t1,t2,sl,m,n,sm,sn)" "atom l \ (s1,s2,s,k1,k2,k,t1,t2,sl,m,n,sm,sn)" "atom sl \ (s1,s2,s,k1,k2,k,t1,t2,m,n,sm,sn)" "atom m \ (s1,s2,s,k1,k2,k,t1,t2,n,sm,sn)" "atom n \ (s1,s2,s,k1,k2,k,t1,t2,sm,sn)" "atom sm \ (s1,s2,s,k1,k2,k,t1,t2,sn)" "atom sn \ (s1,s2,s,k1,k2,k,t1,t2)" by (metis obtain_fresh) let ?hyp = "{HaddP k1 k2 (Var k'), OrdP k1, OrdP k2, SeqAppendP s1 (SUCC k1) s2 (SUCC k2) (Var s), SeqTermP s1 k1 t1, SeqTermP s2 k2 t2}" show ?thesis using assms atoms apply (auto simp: SeqCTermP.simps [of l "Var s" _ sl m n sm sn]) apply (rule cut_same [where A="OrdP k1 AND OrdP k2"]) apply (metis Conj_I SeqCTermP_imp_OrdP thin1 thin2) apply (rule cut_same [OF exists_SeqAppendP [of s s1 "SUCC k1" s2 "SUCC k2"]]) apply (rule AssumeH Ex_EH Conj_EH | simp)+ apply (rule cut_same [OF exists_HaddP [where j=k' and x=k1 and y=k2]]) apply (rule AssumeH Ex_EH Conj_EH | simp)+ apply (rule Ex_I [where x="Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (Q_Eats t1 t2))"], simp) apply (rule Ex_I [where x="SUCC (SUCC (Var k'))"], simp) apply (rule Conj_I) apply (blast intro: LstSeqP_SeqAppendP_Eats SeqCTermP_imp_LstSeqP [THEN cut1]) proof (rule All2_SUCC_I, simp_all) show "?hyp \ Ex sl (HPair (SUCC (SUCC (Var k'))) (Var sl) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (Q_Eats t1 t2)) AND (Var sl EQ Zero OR VarP (Var sl) OR Ex m (Ex n(Ex sm (Ex sn (Var m IN SUCC (SUCC (Var k')) AND Var n IN SUCC (SUCC (Var k')) AND HPair (Var m) (Var sm) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (Q_Eats t1 t2)) AND HPair (Var n) (Var sn) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (Q_Eats t1 t2)) AND Var sl EQ Q_Eats (Var sm) (Var sn)))))))" \ \verifying the final values\ apply (rule Ex_I [where x="Q_Eats t1 t2"]) using assms atoms apply simp apply (rule Conj_I, metis Mem_Eats_I2 Refl) apply (rule Disj_I2)+ apply (rule Ex_I [where x=k1], simp) apply (rule Ex_I [where x="SUCC (Var k')"], simp) apply (rule Ex_I [where x=t1], simp) apply (rule Ex_I [where x=t2], simp) apply (rule Conj_I) apply (blast intro: HaddP_Mem_I LstSeqP_OrdP Mem_SUCC_I1) apply (blast intro: Mem_Eats_I1 SeqAppendP_Mem1 [THEN cut3] SeqAppendP_Mem2 [THEN cut4] Mem_SUCC_Refl SeqCTermP_imp_LstSeqP [THEN cut1] LstSeqP_imp_Mem HaddP_SUCC1 [THEN cut1]) done next show "?hyp \ All2 l (SUCC (SUCC (Var k'))) (Ex sl (HPair (Var l) (Var sl) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (Q_Eats t1 t2)) AND (Var sl EQ Zero OR VarP (Var sl) OR Ex m (Ex n (Ex sm (Ex sn (Var m IN Var l AND Var n IN Var l AND HPair (Var m) (Var sm) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (Q_Eats t1 t2)) AND HPair (Var n) (Var sn) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (Q_Eats t1 t2)) AND Var sl EQ Q_Eats (Var sm) (Var sn))))))))" \ \verifying the sequence buildup\ apply (rule cut_same [where A="HaddP (SUCC k1) (SUCC k2) (SUCC (SUCC (Var k')))"]) apply (blast intro: HaddP_SUCC1 [THEN cut1] HaddP_SUCC2 [THEN cut1]) apply (rule All_I Imp_I)+ apply (rule HaddP_Mem_cases [where i=j]) using assms atoms apply simp_all apply (rule AssumeH) apply (blast intro: OrdP_SUCC_I LstSeqP_OrdP) \ \... the sequence buildup via s1\ apply (simp add: SeqCTermP.simps [of l s1 _ sl m n sm sn]) apply (rule AssumeH Ex_EH Conj_EH)+ apply (rule All2_E [THEN rotate2], auto del: Disj_EH) apply (rule Ex_I [where x="Var sl"], simp) apply (rule Conj_I) apply (rule Mem_Eats_I1) apply (metis SeqAppendP_Mem1 rotate3 thin2 thin4) apply (rule AssumeH Disj_IE1H Ex_EH Conj_EH)+ apply simp_all apply (rule Ex_I [where x="Var m"], simp) apply (rule Ex_I [where x="Var n"], simp) apply (rule Ex_I [where x="Var sm"], simp) apply (rule Ex_I [where x="Var sn"], simp) apply (rule Conj_I, rule AssumeH)+ apply (blast del: Disj_EH intro: OrdP_Trans [OF OrdP_SUCC_I] Mem_Eats_I1 [OF SeqAppendP_Mem1 [THEN cut3]] Hyp) \ \... the sequence buildup via s2\ apply (simp add: SeqCTermP.simps [of l s2 _ sl m n sm sn]) apply (rule AssumeH Ex_EH Conj_EH)+ apply (rule All2_E [THEN rotate2], auto del: Disj_EH) apply (rule Ex_I [where x="Var sl"], simp) apply (rule cut_same [where A="OrdP (Var j)"]) apply (metis HaddP_imp_OrdP rotate2 thin2) apply (rule Conj_I) apply (blast intro: Mem_Eats_I1 SeqAppendP_Mem2 [THEN cut4] del: Disj_EH) apply (rule AssumeH Disj_IE1H Ex_EH Conj_EH)+ apply (rule cut_same [OF exists_HaddP [where j=km and x="SUCC k1" and y="Var m"]]) apply (blast intro: Ord_IN_Ord, simp) apply (rule cut_same [OF exists_HaddP [where j=kn and x="SUCC k1" and y="Var n"]]) apply (metis AssumeH(6) Ord_IN_Ord0 rotate8, simp) apply (rule AssumeH Ex_EH Conj_EH | simp)+ apply (rule Ex_I [where x="Var km"], simp) apply (rule Ex_I [where x="Var kn"], simp) apply (rule Ex_I [where x="Var sm"], simp) apply (rule Ex_I [where x="Var sn"], simp_all) apply (rule Conj_I [OF _ Conj_I]) apply (blast intro!: HaddP_Mem_cancel_left [THEN Iff_MP2_same] OrdP_SUCC_I intro: LstSeqP_OrdP Hyp)+ apply (blast del: Disj_EH intro: OrdP_Trans Hyp intro!: Mem_Eats_I1 SeqAppendP_Mem2 [THEN cut4] HaddP_imp_OrdP [THEN cut1]) done qed qed (*>*) theorem TermP_Eats: "{TermP t1, TermP t2} \ TermP (Q_Eats t1 t2)" proof - obtain k1::name and s1::name and k2::name and s2::name and k::name and s::name where "atom s1 \ (t1,t2)" "atom k1 \ (t1,t2,s1)" "atom s2 \ (t1,t2,k1,s1)" "atom k2 \ (t1,t2,s2,k1,s1)" "atom s \ (t1,t2,k2,s2,k1,s1)" "atom k \ (t1,t2,s,k2,s2,k1,s1)" by (metis obtain_fresh) thus ?thesis by (auto simp: CTermP.simps [of k s "(Q_Eats t1 t2)"] CTermP.simps [of k1 s1 t1] CTermP.simps [of k2 s2 t2] intro!: SeqTermP_Eats [THEN cut2]) qed section \Proofs\ lemma PrfP_inference: assumes "atom s \ (k,s1,s2,k1,k2,\1,\2,\)" "atom k \ (s1,s2,k1,k2,\1,\2,\)" shows "{PrfP s1 k1 \1, PrfP s2 k2 \2, ModPonP \1 \2 \ OR ExistsP \1 \ OR SubstP \1 \} \ Ex k (Ex s (PrfP (Var s) (Var k) \))" (*<*) proof - obtain km::name and kn::name and j::name and k'::name and l::name and sl::name and m::name and n::name and sm::name and sn::name where atoms: "atom km \ (kn,j,k',l,s1,s2,s,k1,k2,k,\1,\2,\,sl,m,n,sm,sn)" "atom kn \ (j,k',l,s1,s2,s,k1,k2,k,\1,\2,\,sl,m,n,sm,sn)" "atom j \ (k',l,s1,s2,s,k1,k2,k,\1,\2,\,sl,m,n,sm,sn)" "atom k' \ (l,s1,s2,s,k1,k2,k,\1,\2,\,sl,m,n,sm,sn)" "atom l \ (s1,s2,s,k1,k2,k,\1,\2,\,sl,m,n,sm,sn)" "atom sl \ (s1,s2,s,k1,k2,k,\1,\2,\,m,n,sm,sn)" "atom m \ (s1,s2,s,k1,k2,k,\1,\2,\,n,sm,sn)" "atom n \ (s1,s2,s,k1,k2,k,\1,\2,\,sm,sn)" "atom sm \ (s1,s2,s,k1,k2,k,\1,\2,\,sn)" "atom sn \ (s1,s2,s,k1,k2,k,\1,\2,\)" by (metis obtain_fresh) let ?hyp = "{HaddP k1 k2 (Var k'), OrdP k1, OrdP k2, SeqAppendP s1 (SUCC k1) s2 (SUCC k2) (Var s), PrfP s1 k1 \1, PrfP s2 k2 \2, ModPonP \1 \2 \ OR ExistsP \1 \ OR SubstP \1 \}" show ?thesis using assms atoms apply (simp add: PrfP.simps [of l "Var s" sl m n sm sn]) apply (rule cut_same [where A="OrdP k1 AND OrdP k2"]) apply (metis Conj_I PrfP_imp_OrdP thin1 thin2) apply (rule cut_same [OF exists_SeqAppendP [of s s1 "SUCC k1" s2 "SUCC k2"]]) apply (rule AssumeH Ex_EH Conj_EH | simp)+ apply (rule cut_same [OF exists_HaddP [where j=k' and x=k1 and y=k2]]) apply (rule AssumeH Ex_EH Conj_EH | simp)+ apply (rule Ex_I [where x="SUCC (SUCC (Var k'))"], simp) apply (rule Ex_I [where x="Eats (Var s) (HPair (SUCC (SUCC (Var k'))) \)"], simp) apply (rule Conj_I) apply (blast intro: LstSeqP_SeqAppendP_Eats PrfP_imp_LstSeqP [THEN cut1]) proof (rule All2_SUCC_I, simp_all) show "?hyp \ Ex sn (HPair (SUCC (SUCC (Var k'))) (Var sn) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) \) AND (AxiomP (Var sn) OR Ex m (Ex l (Ex sm (Ex sl (Var m IN SUCC (SUCC (Var k')) AND Var l IN SUCC (SUCC (Var k')) AND HPair (Var m) (Var sm) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) \) AND HPair (Var l) (Var sl) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) \) AND (ModPonP (Var sm) (Var sl) (Var sn) OR ExistsP (Var sm) (Var sn) OR SubstP (Var sm) (Var sn))))))))" \ \verifying the final values\ apply (rule Ex_I [where x="\"]) using assms atoms apply simp apply (rule Conj_I, metis Mem_Eats_I2 Refl) apply (rule Disj_I2) apply (rule Ex_I [where x=k1], simp) apply (rule Ex_I [where x="SUCC (Var k')"], simp) apply (rule_tac x=\1 in Ex_I, simp) apply (rule_tac x=\2 in Ex_I, simp) apply (rule Conj_I) apply (blast intro: HaddP_Mem_I LstSeqP_OrdP Mem_SUCC_I1) apply (rule Conj_I [OF Mem_SUCC_Refl Conj_I]) apply (blast intro: Mem_Eats_I1 SeqAppendP_Mem1 [THEN cut3] Mem_SUCC_Refl PrfP_imp_LstSeqP [THEN cut1] LstSeqP_imp_Mem) apply (blast del: Disj_EH intro: Mem_Eats_I1 SeqAppendP_Mem2 [THEN cut4] Mem_SUCC_Refl PrfP_imp_LstSeqP [THEN cut1] HaddP_SUCC1 [THEN cut1] LstSeqP_imp_Mem) done next show "?hyp \ All2 n (SUCC (SUCC (Var k'))) (Ex sn (HPair (Var n) (Var sn) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) \) AND (AxiomP (Var sn) OR Ex m (Ex l (Ex sm (Ex sl (Var m IN Var n AND Var l IN Var n AND HPair (Var m) (Var sm) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) \) AND HPair (Var l) (Var sl) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) \) AND (ModPonP (Var sm) (Var sl) (Var sn) OR ExistsP (Var sm) (Var sn) OR SubstP (Var sm) (Var sn)))))))))" \ \verifying the sequence buildup\ apply (rule cut_same [where A="HaddP (SUCC k1) (SUCC k2) (SUCC (SUCC (Var k')))"]) apply (blast intro: HaddP_SUCC1 [THEN cut1] HaddP_SUCC2 [THEN cut1]) apply (rule All_I Imp_I)+ apply (rule HaddP_Mem_cases [where i=j]) using assms atoms apply simp_all apply (rule AssumeH) apply (blast intro: OrdP_SUCC_I LstSeqP_OrdP) \ \... the sequence buildup via s1\ apply (simp add: PrfP.simps [of l s1 sl m n sm sn]) apply (rule AssumeH Ex_EH Conj_EH)+ apply (rule All2_E [THEN rotate2]) apply (rule AssumeH Ex_EH Conj_EH | simp)+ apply (rule Ex_I [where x="Var sn"], simp) apply (rule Conj_I) apply (rule Mem_Eats_I1) apply (metis SeqAppendP_Mem1 rotate3 thin2 thin4) apply (rule AssumeH Disj_IE1H Ex_EH Conj_EH)+ apply (rule Ex_I [where x="Var m"], simp) apply (rule Ex_I [where x="Var l"], simp) apply (rule Ex_I [where x="Var sm"], simp) apply (rule Ex_I [where x="Var sl"], simp_all) apply (rule Conj_I, rule AssumeH)+ apply (blast del: Disj_EH intro: OrdP_Trans [OF OrdP_SUCC_I] Mem_Eats_I1 [OF SeqAppendP_Mem1 [THEN cut3]] Hyp) \ \... the sequence buildup via s2\ apply (simp add: PrfP.simps [of l s2 sl m n sm sn]) apply (rule AssumeH Ex_EH Conj_EH)+ apply (rule All2_E [THEN rotate2]) apply (rule AssumeH Ex_EH Conj_EH | simp)+ apply (rule Ex_I [where x="Var sn"], simp) apply (rule cut_same [where A="OrdP (Var j)"]) apply (metis HaddP_imp_OrdP rotate2 thin2) apply (rule Conj_I) apply (blast intro!: Mem_Eats_I1 SeqAppendP_Mem2 [THEN cut4] del: Disj_EH) apply (rule AssumeH Disj_IE1H Ex_EH Conj_EH)+ apply (rule cut_same [OF exists_HaddP [where j=km and x="SUCC k1" and y="Var m"]]) apply (blast intro: Ord_IN_Ord, simp) apply (rule cut_same [OF exists_HaddP [where j=kn and x="SUCC k1" and y="Var l"]]) apply (blast intro!: Ord_IN_Ord) apply (rule AssumeH Ex_EH Conj_EH | simp)+ apply (rule Ex_I [where x="Var km"], simp) apply (rule Ex_I [where x="Var kn"], simp) apply (rule Ex_I [where x="Var sm"], simp) apply (rule Ex_I [where x="Var sl"], simp_all) apply (rule Conj_I [OF _ Conj_I]) apply (blast intro!: HaddP_Mem_cancel_left [THEN Iff_MP2_same] OrdP_SUCC_I intro: LstSeqP_OrdP Hyp)+ apply (blast del: Disj_EH intro: OrdP_Trans Hyp intro!: Mem_Eats_I1 SeqAppendP_Mem2 [THEN cut4] HaddP_imp_OrdP [THEN cut1]) done qed qed (*>*) corollary PfP_inference: "{PfP \1, PfP \2, ModPonP \1 \2 \ OR ExistsP \1 \ OR SubstP \1 \} \ PfP \" proof - obtain k1::name and s1::name and k2::name and s2::name and k::name and s::name where "atom s1 \ (\1,\2,\)" "atom k1 \ (\1,\2,\,s1)" "atom s2 \ (\1,\2,\,k1,s1)""atom k2 \ (\1,\2,\,s2,k1,s1)" "atom s \ (\1,\2,\,k2,s2,k1,s1)" "atom k \ (\1,\2,\,s,k2,s2,k1,s1)" by (metis obtain_fresh) thus ?thesis apply (simp add: PfP.simps [of k s \] PfP.simps [of k1 s1 \1] PfP.simps [of k2 s2 \2]) apply (auto intro!: PrfP_inference [of s k "Var s1" "Var s2", THEN cut3] del: Disj_EH) done qed theorem PfP_implies_SubstForm_PfP: assumes "H \ PfP y" "H \ SubstFormP x t y z" shows "H \ PfP z" proof - obtain u::name and v::name where atoms: "atom u \ (t,x,y,z,v)" "atom v \ (t,x,y,z)" by (metis obtain_fresh) show ?thesis apply (rule PfP_inference [of y, THEN cut3]) apply (rule assms)+ using atoms apply (auto simp: SubstP.simps [of u _ _ v] intro!: Disj_I2) apply (rule Ex_I [where x=x], simp) apply (rule Ex_I [where x=t], simp add: assms) done qed theorem PfP_implies_ModPon_PfP: "\H \ PfP (Q_Imp x y); H \ PfP x\ \ H \ PfP y" by (force intro: PfP_inference [of x, THEN cut3] Disj_I1 simp add: ModPonP_def) -corollary PfP_implies_ModPon_PfP_quot: "\H \ PfP \\ IMP \\; H \ PfP \\\\ \ H \ PfP \\\" +corollary PfP_implies_ModPon_PfP_quot: "\H \ PfP \\ IMP \\; H \ PfP \\\\ \ H \ PfP \\\" by (auto simp: quot_fm_def intro: PfP_implies_ModPon_PfP) lemma TermP_quot: fixes \ :: tm - shows "{} \ TermP \\\" + shows "{} \ TermP \\\" by (induct \ rule: tm.induct) (auto simp: quot_Eats intro: TermP_Zero TermP_Var TermP_Eats[THEN cut2]) lemma TermP_quot_dbtm: fixes \ :: tm assumes "wf_dbtm u" shows "{} \ TermP (quot_dbtm u)" using assms by (induct u rule: dbtm.induct) (auto simp: quot_Eats intro: TermP_Zero TermP_Var[unfolded quot_tm_def, simplified] TermP_Eats[THEN cut2]) section \Formulas\ section \Abstraction on Formulas\ subsection \Membership\ lemma AbstAtomicP_Mem: "{AbstTermP v i x x', AbstTermP v i y y'} \ AbstAtomicP v i (Q_Mem x y) (Q_Mem x' y')" proof - obtain t::name and u::name and t'::name and u'::name where "atom t \ (v,i,x,x',y,y',t',u,u')" "atom t' \ (v,i,x,x',y,y',u,u')" "atom u \ (v,i,x,x',y,y',u')" "atom u' \ (v,i,x,x',y,y')" by (metis obtain_fresh) thus ?thesis apply (simp add: AbstAtomicP.simps [of t _ _ _ _ t' u u']) apply (rule Ex_I [where x = x], simp) apply (rule Ex_I [where x = y], simp) apply (rule Ex_I [where x = x'], simp) apply (rule Ex_I [where x = y'], auto intro: Disj_I2) done qed lemma SeqAbstFormP_Mem: assumes "atom s \ (k,x,y,x',y',v,i)" "atom k \ (x,y,x',y',v,i)" shows "{AbstTermP v i x x', AbstTermP v i y y'} \ Ex s (Ex k (SeqAbstFormP v i (Q_Mem x y) (Q_Mem x' y') (Var s) (Var k)))" proof - let ?vs = "(s,k,x,y,x',y',v,i)" obtain l::name and sl::name and sl'::name and m::name and n::name and sm::name and sm'::name and sn::name and sn'::name and sli smi sni :: name where "atom sni \ (?vs,sl,sl',m,n,sm,sm',sn,sn',l,sli,smi)" "atom smi \ (?vs,sl,sl',m,n,sm,sm',sn,sn',l,sli)" "atom sli \ (?vs,sl,sl',m,n,sm,sm',sn,sn',l)" "atom l \ (?vs,sl,sl',m,n,sm,sm',sn,sn')" "atom sl \ (?vs,sl',m,n,sm,sm',sn,sn')" "atom sl' \ (?vs,m,n,sm,sm',sn,sn')" "atom m \ (?vs,n,sm,sm',sn,sn')" "atom n \ (?vs,sm,sm',sn,sn')" "atom sm \ (?vs,sm',sn,sn')" "atom sm' \ (?vs,sn,sn')" "atom sn \ (?vs,sn')" "atom sn' \ ?vs" by (metis obtain_fresh) thus ?thesis using assms apply (auto simp: SeqAbstFormP.simps [of l "Var s" _ _ sli sl sl' m n smi sm sm' sni sn sn']) apply (rule Ex_I [where x = "Eats Zero (HPair Zero (HPair i (HPair (Q_Mem x y) (Q_Mem x' y'))))"], simp) apply (rule Ex_I [where x = Zero], auto intro!: Mem_SUCC_EH) apply (rule Ex_I [where x = "i"], simp) apply (rule Ex_I [where x = "Q_Mem x y"], simp) apply (rule Ex_I [where x = "Q_Mem x' y'"], auto intro: Mem_Eats_I2 HPair_cong) apply (blast intro: AbstAtomicP_Mem [THEN cut2] Disj_I1) done qed lemma AbstFormP_Mem: "{AbstTermP v i x x', AbstTermP v i y y'} \ AbstFormP v i (Q_Mem x y) (Q_Mem x' y')" proof - obtain k1::name and s1::name and k2::name and s2::name and k::name and s::name where "atom s1 \ (v,i,x,y,x',y')" "atom k1 \ (v,i,x,y,x',y',s1)" "atom s2 \ (v,i,x,y,x',y',k1,s1)" "atom k2 \ (v,i,x,y,x',y',s2,k1,s1)" "atom s \ (v,i,x,y,x',y',k2,s2,k1,s1)" "atom k \ (v,i,x,y,x',y',s,k2,s2,k1,s1)" by (metis obtain_fresh) thus ?thesis by (auto simp: AbstFormP.simps [of s v i "(Q_Mem x y)" _ k] AbstFormP.simps [of s1 v i x x' k1] AbstFormP.simps [of s2 v i y y' k2] intro: AbstTermP_imp_VarP AbstTermP_imp_OrdP SeqAbstFormP_Mem thin1) qed subsection \Equality\ lemma AbstAtomicP_Eq: "{AbstTermP v i x x', AbstTermP v i y y'} \ AbstAtomicP v i (Q_Eq x y) (Q_Eq x' y')" proof - obtain t::name and u::name and t'::name and u'::name where "atom t \ (v,i,x,x',y,y',t',u,u')" "atom t' \ (v,i,x,x',y,y',u,u')" "atom u \ (v,i,x,x',y,y',u')" "atom u' \ (v,i,x,x',y,y')" by (metis obtain_fresh) thus ?thesis apply (simp add: AbstAtomicP.simps [of t _ _ _ _ t' u u']) apply (rule Ex_I [where x = x], simp) apply (rule Ex_I [where x = y], simp) apply (rule Ex_I [where x = x'], simp) apply (rule Ex_I [where x = y'], auto intro: Disj_I1) done qed lemma SeqAbstFormP_Eq: assumes sk: "atom s \ (k,x,y,x',y',v,i)" "atom k \ (x,y,x',y',v,i)" shows "{AbstTermP v i x x', AbstTermP v i y y'} \ Ex s (Ex k (SeqAbstFormP v i (Q_Eq x y) (Q_Eq x' y') (Var s) (Var k)))" proof - let ?vs = "(s,k,x,y,x',y',v,i)" obtain l::name and sl::name and sl'::name and m::name and n::name and sm::name and sm'::name and sn::name and sn'::name and sli smi sni :: name where "atom sni \ (?vs,sl,sl',m,n,sm,sm',sn,sn',l,sli,smi)" "atom smi \ (?vs,sl,sl',m,n,sm,sm',sn,sn',l,sli)" "atom sli \ (?vs,sl,sl',m,n,sm,sm',sn,sn',l)" "atom l \ (?vs,sl,sl',m,n,sm,sm',sn,sn')" "atom sl \ (?vs,sl',m,n,sm,sm',sn,sn')" "atom sl' \ (?vs,m,n,sm,sm',sn,sn')" "atom m \ (?vs,n,sm,sm',sn,sn')" "atom n \ (?vs,sm,sm',sn,sn')" "atom sm \ (?vs,sm',sn,sn')" "atom sm' \ (?vs,sn,sn')" "atom sn \ (?vs,sn')" "atom sn' \ ?vs" by (metis obtain_fresh) thus ?thesis using sk apply (auto simp: SeqAbstFormP.simps [of l "Var s" _ _ sli sl sl' m n smi sm sm' sni sn sn']) apply (rule Ex_I [where x = "Eats Zero (HPair Zero (HPair i (HPair (Q_Eq x y) (Q_Eq x' y'))))"], simp) apply (rule Ex_I [where x = Zero], auto intro!: Mem_SUCC_EH) apply (rule Ex_I [where x = "i"], simp) apply (rule Ex_I [where x = "Q_Eq x y"], simp) apply (rule Ex_I [where x = "Q_Eq x' y'"], auto) apply (metis Mem_Eats_I2 Assume HPair_cong Refl) apply (blast intro: AbstAtomicP_Eq [THEN cut2] Disj_I1) done qed lemma AbstFormP_Eq: "{AbstTermP v i x x', AbstTermP v i y y'} \ AbstFormP v i (Q_Eq x y) (Q_Eq x' y')" proof - obtain k1::name and s1::name and k2::name and s2::name and k::name and s::name where "atom s1 \ (v,i,x,y,x',y')" "atom k1 \ (v,i,x,y,x',y',s1)" "atom s2 \ (v,i,x,y,x',y',k1,s1)" "atom k2 \ (v,i,x,y,x',y',s2,k1,s1)" "atom s \ (v,i,x,y,x',y',k2,s2,k1,s1)" "atom k \ (v,i,x,y,x',y',s,k2,s2,k1,s1)" by (metis obtain_fresh) thus ?thesis by (auto simp: AbstFormP.simps [of s v i "(Q_Eq x y)" _ k] AbstFormP.simps [of s1 v i x x' k1] AbstFormP.simps [of s2 v i y y' k2] intro: SeqAbstFormP_Eq AbstTermP_imp_OrdP AbstTermP_imp_VarP thin1) qed subsection \Negation\ lemma SeqAbstFormP_Neg: assumes "atom s \ (k,s1,k1,x,x',v,i)" "atom k \ (s1,k1,x,x',v,i)" shows "{SeqAbstFormP v i x x' s1 k1, OrdP i, VarP v} \ Ex s (Ex k (SeqAbstFormP v i (Q_Neg x) (Q_Neg x') (Var s) (Var k)))" (*<*) proof - let ?vs = "(s1,k1,s,k,x,x',v,i)" obtain l::name and sl::name and sl'::name and m::name and n::name and sm::name and sm'::name and sn::name and sn'::name and sli smi sni :: name where atoms: "atom sni \ (?vs,sl,sl',m,n,sm,sm',sn,sn',l,sli,smi)" "atom smi \ (?vs,sl,sl',m,n,sm,sm',sn,sn',l,sli)" "atom sli \ (?vs,sl,sl',m,n,sm,sm',sn,sn',l)" "atom l \ (?vs,sl,sl',m,n,sm,sm',sn,sn')" "atom sl \ (?vs,sl',m,n,sm,sm',sn,sn')" "atom sl' \ (?vs,m,n,sm,sm',sn,sn')" "atom m \ (?vs,n,sm,sm',sn,sn')" "atom n \ (?vs,sm,sm',sn,sn')" "atom sm \ (?vs,sm',sn,sn')" "atom sm' \ (?vs,sn,sn')" "atom sn \ (?vs,sn')" "atom sn' \ ?vs" by (metis obtain_fresh) let ?hyp = "{RestrictedP s1 (SUCC k1) (Var s), OrdP k1, SeqAbstFormP v i x x' s1 k1, OrdP i, VarP v}" show ?thesis using assms atoms apply (auto simp: SeqAbstFormP.simps [of l "Var s" _ _ sli sl sl' m n smi sm sm' sni sn sn']) apply (rule cut_same [where A="OrdP k1"]) apply (metis SeqAbstFormP_imp_OrdP thin2) apply (rule cut_same [OF exists_RestrictedP [of s s1 "SUCC k1"]]) apply (rule AssumeH Ex_EH Conj_EH | simp)+ apply (rule Ex_I [where x="Eats (Var s) (HPair (SUCC k1) (HPair i (HPair (Q_Neg x) (Q_Neg x'))))"]) apply (simp_all (no_asm_simp)) apply (rule Ex_I [where x="(SUCC k1)"]) apply (simp add: flip_fresh_fresh) apply (rule Conj_I) apply (blast intro: RestrictedP_LstSeqP_Eats [THEN cut2] SeqAbstFormP_imp_LstSeqP [THEN cut1]) proof (rule All2_SUCC_I, simp_all) show "?hyp \ SyntaxN.Ex sli (SyntaxN.Ex sl (SyntaxN.Ex sl' (HPair (SUCC k1) (HPair (Var sli) (HPair (Var sl) (Var sl'))) IN Eats (Var s) (HPair (SUCC k1) (HPair i (HPair (Q_Neg x) (Q_Neg x')))) AND (AbstAtomicP v (Var sli) (Var sl) (Var sl') OR OrdP (Var sli) AND SyntaxN.Ex m (SyntaxN.Ex n (SyntaxN.Ex smi (SyntaxN.Ex sm (SyntaxN.Ex sm' (SyntaxN.Ex sni (SyntaxN.Ex sn (SyntaxN.Ex sn' (Var m IN SUCC k1 AND Var n IN SUCC k1 AND HPair (Var m) (HPair (Var smi) (HPair (Var sm) (Var sm'))) IN Eats (Var s) (HPair (SUCC k1) (HPair i (HPair (Q_Neg x) (Q_Neg x')))) AND HPair (Var n) (HPair (Var sni) (HPair (Var sn) (Var sn'))) IN Eats (Var s) (HPair (SUCC k1) (HPair i (HPair (Q_Neg x) (Q_Neg x')))) AND (Var sli EQ Var smi AND Var sli EQ Var sni AND Var sl EQ Q_Disj (Var sm) (Var sn) AND Var sl' EQ Q_Disj (Var sm') (Var sn') OR Var sli EQ Var smi AND Var sl EQ Q_Neg (Var sm) AND Var sl' EQ Q_Neg (Var sm') OR SUCC (Var sli) EQ Var smi AND Var sl EQ Q_Ex (Var sm) AND Var sl' EQ Q_Ex (Var sm'))))))))))))))" \ \verifying the final values\ apply (rule Ex_I [where x="i"]) using assms atoms apply simp apply (rule Ex_I [where x="Q_Neg x"], simp) apply (rule Ex_I [where x="Q_Neg x'"], simp) apply (rule Conj_I, metis Mem_Eats_I2 Refl) apply (rule Disj_I2) apply (rule Conj_I, blast) apply (rule Ex_I [where x=k1], simp) apply (rule Ex_I [where x=k1], simp) apply (rule Ex_I [where x=i], simp) apply (rule Ex_I [where x=x], simp) apply (rule_tac x=x' in Ex_I, simp) apply (rule Ex_I [where x=i], simp) apply (rule Ex_I [where x=x], simp) apply (rule_tac x=x' in Ex_I, simp) apply (rule Conj_I [OF Mem_SUCC_Refl])+ apply (blast intro: Disj_I1 Disj_I2 Mem_Eats_I1 RestrictedP_Mem [THEN cut3] Mem_SUCC_Refl SeqAbstFormP_imp_LstSeqP [THEN cut1] LstSeqP_imp_Mem) done next show "?hyp \ All2 l (SUCC k1) (SyntaxN.Ex sli (SyntaxN.Ex sl (SyntaxN.Ex sl' (HPair (Var l) (HPair (Var sli) (HPair (Var sl) (Var sl'))) IN Eats (Var s) (HPair (SUCC k1) (HPair i (HPair (Q_Neg x) (Q_Neg x')))) AND (AbstAtomicP v (Var sli) (Var sl) (Var sl') OR OrdP (Var sli) AND SyntaxN.Ex m (SyntaxN.Ex n (SyntaxN.Ex smi (SyntaxN.Ex sm (SyntaxN.Ex sm' (SyntaxN.Ex sni (SyntaxN.Ex sn (SyntaxN.Ex sn' (Var m IN Var l AND Var n IN Var l AND HPair (Var m) (HPair (Var smi) (HPair (Var sm) (Var sm'))) IN Eats (Var s) (HPair (SUCC k1) (HPair i (HPair (Q_Neg x) (Q_Neg x')))) AND HPair (Var n) (HPair (Var sni) (HPair (Var sn) (Var sn'))) IN Eats (Var s) (HPair (SUCC k1) (HPair i (HPair (Q_Neg x) (Q_Neg x')))) AND (Var sli EQ Var smi AND Var sli EQ Var sni AND Var sl EQ Q_Disj (Var sm) (Var sn) AND Var sl' EQ Q_Disj (Var sm') (Var sn') OR Var sli EQ Var smi AND Var sl EQ Q_Neg (Var sm) AND Var sl' EQ Q_Neg (Var sm') OR SUCC (Var sli) EQ Var smi AND Var sl EQ Q_Ex (Var sm) AND Var sl' EQ Q_Ex (Var sm')))))))))))))))" \ \verifying the sequence buildup\ apply (rule All_I Imp_I)+ using assms atoms apply simp_all \ \... the sequence buildup via s1\ apply (simp add: SeqAbstFormP.simps [of l s1 _ _ sli sl sl' m n smi sm sm' sni sn sn']) apply (rule AssumeH Ex_EH Conj_EH)+ apply (rule All2_E [THEN rotate2], auto del: Disj_EH) apply (rule Ex_I [where x="Var sli"], simp) apply (rule Ex_I [where x="Var sl"], simp) apply (rule Ex_I [where x="Var sl'"], simp) apply (rule Conj_I) apply (blast intro: Mem_Eats_I1 [OF RestrictedP_Mem [THEN cut3]] del: Disj_EH) apply (rule AssumeH Disj_IE1H Ex_EH Conj_EH Conj_I)+ apply (rule Ex_I [where x="Var m"], simp) apply (rule Ex_I [where x="Var n"], simp) apply (rule Ex_I [where x="Var smi"], simp) apply (rule Ex_I [where x="Var sm"], simp) apply (rule Ex_I [where x="Var sm'"], simp) apply (rule Ex_I [where x="Var sni"], simp) apply (rule Ex_I [where x="Var sn"], simp) apply (rule Ex_I [where x="Var sn'"], auto del: Disj_EH) apply (rule Mem_Eats_I1 [OF RestrictedP_Mem [THEN cut3]] AssumeH OrdP_Trans [OF OrdP_SUCC_I])+ done qed qed (*>*) theorem AbstFormP_Neg: "{AbstFormP v i x x'} \ AbstFormP v i (Q_Neg x) (Q_Neg x')" proof - obtain k1::name and s1::name and k::name and s::name where "atom s1 \ (v,i,x,x')" "atom k1 \ (v,i,x,x',s1)" "atom s \ (v,i,x,x',k1,s1)" "atom k \ (v,i,x,x',s,k1,s1)" by (metis obtain_fresh) thus ?thesis by (force simp: AbstFormP.simps [of s v i "Q_Neg x" _ k] AbstFormP.simps [of s1 v i x x' k1] intro: SeqAbstFormP_Neg [THEN cut3]) qed subsection \Disjunction\ lemma SeqAbstFormP_Disj: assumes "atom s \ (k,s1,s2,k1,k2,x,y,x',y',v,i)" "atom k \ (s1,s2,k1,k2,x,y,x',y',v,i)" shows "{SeqAbstFormP v i x x' s1 k1, SeqAbstFormP v i y y' s2 k2, OrdP i, VarP v} \ Ex s (Ex k (SeqAbstFormP v i (Q_Disj x y) (Q_Disj x' y') (Var s) (Var k)))" (*<*) proof - let ?vs = "(s1,s2,s,k1,k2,k,x,y,x',y',v,i)" obtain km::name and kn::name and j::name and k'::name and l::name and sl::name and sl'::name and m::name and n::name and sm::name and sm'::name and sn::name and sn'::name and sli sni smi :: name where atoms2: "atom km \ (kn,j,k',sni,smi,sli,l,s1,s2,s,k1,k2,k,x,y,x',y',v,i,sl,sl',m,n,sm,sm',sn,sn')" "atom kn \ (j,k',sni,smi,sli,l,s1,s2,s,k1,k2,k,x,y,x',y',v,i,sl,sl',m,n,sm,sm',sn,sn')" "atom j \ (k',sni,smi,sli,l,s1,s2,s,k1,k2,k,x,y,x',y',v,i,sl,sl',m,n,sm,sm',sn,sn')" and atoms: "atom k' \ (sni,smi,sli,l,s1,s2,s,k1,k2,k,x,y,x',y',v,i,sl,sl',m,n,sm,sm',sn,sn')" "atom sni \ (?vs,sl,sl',m,n,sm,sm',sn,sn',l,sli,smi)" "atom smi \ (?vs,sl,sl',m,n,sm,sm',sn,sn',l,sli)" "atom sli \ (?vs,sl,sl',m,n,sm,sm',sn,sn',l)" "atom l \ (s1,s2,s,k1,k2,k,x,y,x',y',v,i,sl,sl',m,n,sm,sm',sn,sn')" "atom sl \ (s1,s2,s,k1,k2,k,x,y,x',y',v,i,sl',m,n,sm,sm',sn,sn')" "atom sl' \ (s1,s2,s,k1,k2,k,x,y,x',y',v,i,m,n,sm,sm',sn,sn')" "atom m \ (s1,s2,s,k1,k2,k,x,y,x',y',v,i,n,sm,sm',sn,sn')" "atom n \ (s1,s2,s,k1,k2,k,x,y,x',y',v,i,sm,sm',sn,sn')" "atom sm \ (s1,s2,s,k1,k2,k,x,y,x',y',v,i,sm',sn,sn')" "atom sm' \ (s1,s2,s,k1,k2,k,x,y,x',y',v,i,sn,sn')" "atom sn \ (s1,s2,s,k1,k2,k,x,y,x',y',v,i,sn')" "atom sn' \ (s1,s2,s,k1,k2,k,x,y,x',y',v,i)" by (metis obtain_fresh) let ?hyp = "{HaddP k1 k2 (Var k'), OrdP k1, OrdP k2, SeqAppendP s1 (SUCC k1) s2 (SUCC k2) (Var s), SeqAbstFormP v i x x' s1 k1, SeqAbstFormP v i y y' s2 k2, OrdP i, VarP v}" show ?thesis using assms atoms apply (auto simp: SeqAbstFormP.simps [of l "Var s" _ _ sli sl sl' m n smi sm sm' sni sn sn']) apply (rule cut_same [where A="OrdP k1 AND OrdP k2"]) apply (metis Conj_I SeqAbstFormP_imp_OrdP thin1 thin2) apply (rule cut_same [OF exists_SeqAppendP [of s s1 "SUCC k1" s2 "SUCC k2"]]) apply (rule AssumeH Ex_EH Conj_EH | simp)+ apply (rule cut_same [OF exists_HaddP [where j=k' and x=k1 and y=k2]]) apply (rule AssumeH Ex_EH Conj_EH | simp)+ apply (rule Ex_I [where x="Eats (Var s) (HPair (SUCC(SUCC(Var k'))) (HPair i (HPair(Q_Disj x y)(Q_Disj x' y'))))"]) apply (simp_all (no_asm_simp)) apply (rule Ex_I [where x="SUCC (SUCC (Var k'))"], simp) apply (rule Conj_I) apply (blast intro: LstSeqP_SeqAppendP_Eats SeqAbstFormP_imp_LstSeqP [THEN cut1]) proof (rule All2_SUCC_I, simp_all) show "?hyp \ SyntaxN.Ex sli (SyntaxN.Ex sl (SyntaxN.Ex sl' (HPair (SUCC (SUCC (Var k'))) (HPair (Var sli) (HPair (Var sl) (Var sl'))) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (HPair i (HPair (Q_Disj x y) (Q_Disj x' y')))) AND (AbstAtomicP v (Var sli) (Var sl) (Var sl') OR OrdP (Var sli) AND SyntaxN.Ex m (SyntaxN.Ex n (SyntaxN.Ex smi (SyntaxN.Ex sm (SyntaxN.Ex sm' (SyntaxN.Ex sni (SyntaxN.Ex sn (SyntaxN.Ex sn' (Var m IN SUCC (SUCC (Var k')) AND Var n IN SUCC (SUCC (Var k')) AND HPair (Var m) (HPair (Var smi) (HPair (Var sm) (Var sm'))) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (HPair i (HPair (Q_Disj x y) (Q_Disj x' y')))) AND HPair (Var n) (HPair (Var sni) (HPair (Var sn) (Var sn'))) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (HPair i (HPair (Q_Disj x y) (Q_Disj x' y')))) AND (Var sli EQ Var smi AND Var sli EQ Var sni AND Var sl EQ Q_Disj (Var sm) (Var sn) AND Var sl' EQ Q_Disj (Var sm') (Var sn') OR Var sli EQ Var smi AND Var sl EQ Q_Neg (Var sm) AND Var sl' EQ Q_Neg (Var sm') OR SUCC (Var sli) EQ Var smi AND Var sl EQ Q_Ex (Var sm) AND Var sl' EQ Q_Ex (Var sm'))))))))))))))" \ \verifying the final values\ apply (rule Ex_I [where x="i"]) using assms atoms apply simp apply (rule Ex_I [where x="Q_Disj x y"], simp) apply (rule Ex_I [where x="Q_Disj x' y'"], simp) apply (rule Conj_I, metis Mem_Eats_I2 Refl) apply (rule Disj_I2) apply (rule Conj_I, blast) apply (rule Ex_I [where x=k1], simp) apply (rule Ex_I [where x="SUCC (Var k')"], simp) apply (rule Ex_I [where x=i], simp) apply (rule Ex_I [where x=x], simp) apply (rule_tac x=x' in Ex_I, simp) apply (rule Ex_I [where x=i], simp) apply (rule Ex_I [where x=y], simp) apply (rule_tac x=y' in Ex_I, simp) apply (rule Conj_I) apply (blast intro: HaddP_Mem_I LstSeqP_OrdP Mem_SUCC_I1) apply (rule Conj_I [OF Mem_SUCC_Refl]) apply (blast intro: Disj_I1 Mem_Eats_I1 Mem_SUCC_Refl SeqAbstFormP_imp_LstSeqP [THEN cut1] LstSeqP_imp_Mem SeqAppendP_Mem1 [THEN cut3] SeqAppendP_Mem2 [THEN cut4] HaddP_SUCC1 [THEN cut1]) done next show "?hyp \ All2 l (SUCC (SUCC (Var k'))) (SyntaxN.Ex sli (SyntaxN.Ex sl (SyntaxN.Ex sl' (HPair (Var l) (HPair (Var sli) (HPair (Var sl) (Var sl'))) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (HPair i (HPair (Q_Disj x y) (Q_Disj x' y')))) AND (AbstAtomicP v (Var sli) (Var sl) (Var sl') OR OrdP (Var sli) AND SyntaxN.Ex m (SyntaxN.Ex n (SyntaxN.Ex smi (SyntaxN.Ex sm (SyntaxN.Ex sm' (SyntaxN.Ex sni (SyntaxN.Ex sn (SyntaxN.Ex sn' (Var m IN Var l AND Var n IN Var l AND HPair (Var m) (HPair (Var smi) (HPair (Var sm) (Var sm'))) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (HPair i (HPair (Q_Disj x y) (Q_Disj x' y')))) AND HPair (Var n) (HPair (Var sni) (HPair (Var sn) (Var sn'))) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (HPair i (HPair (Q_Disj x y) (Q_Disj x' y')))) AND (Var sli EQ Var smi AND Var sli EQ Var sni AND Var sl EQ Q_Disj (Var sm) (Var sn) AND Var sl' EQ Q_Disj (Var sm') (Var sn') OR Var sli EQ Var smi AND Var sl EQ Q_Neg (Var sm) AND Var sl' EQ Q_Neg (Var sm') OR SUCC (Var sli) EQ Var smi AND Var sl EQ Q_Ex (Var sm) AND Var sl' EQ Q_Ex (Var sm')))))))))))))))" \ \verifying the sequence buildup\ apply (rule cut_same [where A="HaddP (SUCC k1) (SUCC k2) (SUCC (SUCC (Var k')))"]) apply (blast intro: HaddP_SUCC1 [THEN cut1] HaddP_SUCC2 [THEN cut1]) apply (rule All_I Imp_I)+ apply (rule HaddP_Mem_cases [where i=j]) using assms atoms atoms2 apply simp_all apply (rule AssumeH) apply (blast intro: OrdP_SUCC_I LstSeqP_OrdP) \ \... the sequence buildup via s1\ apply (simp add: SeqAbstFormP.simps [of l s1 _ _ sli sl sl' m n smi sm sm' sni sn sn']) apply (rule AssumeH Ex_EH Conj_EH)+ apply (rule All2_E [THEN rotate2]) apply (simp | rule AssumeH Ex_EH Conj_EH)+ apply (rule Ex_I [where x="Var sli"], simp) apply (rule Ex_I [where x="Var sl"], simp) apply (rule Ex_I [where x="Var sl'"], simp) apply (rule Conj_I [OF Mem_Eats_I1]) apply (metis SeqAppendP_Mem1 rotate3 thin2 thin4) apply (rule AssumeH Disj_IE1H Ex_EH Conj_EH)+ apply (rule Conj_I) apply (blast intro: Mem_Eats_I1 [OF RestrictedP_Mem [THEN cut3]] del: Disj_EH) apply (rule Ex_I [where x="Var m"], simp) apply (rule Ex_I [where x="Var n"], simp) apply (rule Ex_I [where x="Var smi"], simp) apply (rule Ex_I [where x="Var sm"], simp) apply (rule Ex_I [where x="Var sm'"], simp) apply (rule Ex_I [where x="Var sni"], simp) apply (rule Ex_I [where x="Var sn"], simp) apply (rule Ex_I [where x="Var sn'"], simp_all (no_asm_simp)) apply (rule Conj_I, rule AssumeH)+ apply (rule Conj_I) apply (blast intro: OrdP_Trans [OF OrdP_SUCC_I] Mem_Eats_I1 [OF SeqAppendP_Mem1 [THEN cut3]] Hyp) apply (blast intro: Disj_I1 Disj_I2 OrdP_Trans [OF OrdP_SUCC_I] Mem_Eats_I1 [OF SeqAppendP_Mem1 [THEN cut3]] Hyp) \ \... the sequence buildup via s2\ apply (simp add: SeqAbstFormP.simps [of l s2 _ _ sli sl sl' m n smi sm sm' sni sn sn']) apply (rule AssumeH Ex_EH Conj_EH)+ apply (rule All2_E [THEN rotate2]) apply (simp | rule AssumeH Ex_EH Conj_EH)+ apply (rule Ex_I [where x="Var sli"], simp) apply (rule Ex_I [where x="Var sl"], simp) apply (rule Ex_I [where x="Var sl'"], simp) apply (rule cut_same [where A="OrdP (Var j)"]) apply (metis HaddP_imp_OrdP rotate2 thin2) apply (rule Conj_I) apply (blast intro: Mem_Eats_I1 SeqAppendP_Mem2 [THEN cut4] del: Disj_EH) apply (rule AssumeH Disj_IE1H Ex_EH Conj_EH)+ apply (rule cut_same [OF exists_HaddP [where j=km and x="SUCC k1" and y="Var m"]]) apply (blast intro: Ord_IN_Ord, simp) apply (rule cut_same [OF exists_HaddP [where j=kn and x="SUCC k1" and y="Var n"]]) apply (metis AssumeH(6) Ord_IN_Ord0 rotate8, simp) apply (rule AssumeH Ex_EH Conj_EH | simp)+ apply (rule Conj_I) apply (blast intro: Mem_Eats_I1 [OF RestrictedP_Mem [THEN cut3]] del: Disj_EH) apply (rule Ex_I [where x="Var km"], simp) apply (rule Ex_I [where x="Var kn"], simp) apply (rule Ex_I [where x="Var smi"], simp) apply (rule Ex_I [where x="Var sm"], simp) apply (rule Ex_I [where x="Var sm'"], simp) apply (rule Ex_I [where x="Var sni"], simp) apply (rule Ex_I [where x="Var sn"], simp) apply (rule Ex_I [where x="Var sn'"], simp_all (no_asm_simp)) apply (rule Conj_I [OF _ Conj_I]) apply (blast intro!: HaddP_Mem_cancel_left [THEN Iff_MP2_same] OrdP_SUCC_I intro: LstSeqP_OrdP Hyp)+ apply (blast del: Disj_EH intro: OrdP_Trans Hyp intro!: Mem_Eats_I1 SeqAppendP_Mem2 [THEN cut4] HaddP_imp_OrdP [THEN cut1]) done qed qed (*>*) theorem AbstFormP_Disj: "{AbstFormP v i x x', AbstFormP v i y y'} \ AbstFormP v i (Q_Disj x y) (Q_Disj x' y')" proof - obtain k1::name and s1::name and k2::name and s2::name and k::name and s::name where "atom s1 \ (v,i,x,y,x',y')" "atom k1 \ (v,i,x,y,x',y',s1)" "atom s2 \ (v,i,x,y,x',y',k1,s1)" "atom k2 \ (v,i,x,y,x',y',s2,k1,s1)" "atom s \ (v,i,x,y,x',y',k2,s2,k1,s1)" "atom k \ (v,i,x,y,x',y',s,k2,s2,k1,s1)" by (metis obtain_fresh) thus ?thesis by (force simp: AbstFormP.simps [of s v i "Q_Disj x y" _ k] AbstFormP.simps [of s1 v i x x' k1] AbstFormP.simps [of s2 v i y y' k2] intro: SeqAbstFormP_Disj [THEN cut4]) qed subsection \Existential\ lemma SeqAbstFormP_Ex: assumes "atom s \ (k,s1,k1,x,x',v,i)" "atom k \ (s1,k1,x,x',v,i)" shows "{SeqAbstFormP v (SUCC i) x x' s1 k1, OrdP i, VarP v} \ Ex s (Ex k (SeqAbstFormP v i (Q_Ex x) (Q_Ex x') (Var s) (Var k)))" (*<*) proof - obtain l::name and sl::name and sl'::name and m::name and n::name and sm::name and sm'::name and sn::name and sn'::name and sli smi sni :: name where atoms: "atom sni \ (s1,k1,s,k,x,x',v,i,sl,sl',m,n,sm,sm',sn,sn',l,sli,smi)" "atom smi \ (s1,k1,s,k,x,x',v,i,sl,sl',m,n,sm,sm',sn,sn',l,sli)" "atom sli \ (s1,k1,s,k,x,x',v,i,sl,sl',m,n,sm,sm',sn,sn',l)" "atom l \ (s1,k1,s,k,x,x',v,i,sl,sl',m,n,sm,sm',sn,sn')" "atom sl \ (s1,k1,s,k,x,x',v,i,sl',m,n,sm,sm',sn,sn')" "atom sl' \ (s1,k1,s,k,x,x',v,i,m,n,sm,sm',sn,sn')" "atom m \ (s1,k1,s,k,x,x',v,i,n,sm,sm',sn,sn')" "atom n \ (s1,k1,s,k,x,x',v,i,sm,sm',sn,sn')" "atom sm \ (s1,k1,s,k,x,x',v,i,sm',sn,sn')" "atom sm' \ (s1,k1,s,k,x,x',v,i,sn,sn')" "atom sn \ (s1,k1,s,k,x,x',v,i,sn')" "atom sn' \ (s1,k1,s,k,x,x',v,i)" by (metis obtain_fresh) let ?hyp = "{RestrictedP s1 (SUCC k1) (Var s), OrdP k1, SeqAbstFormP v (SUCC i) x x' s1 k1, OrdP i, VarP v}" show ?thesis using assms atoms apply (auto simp: SeqAbstFormP.simps [of l "Var s" _ _ sli sl sl' m n smi sm sm' sni sn sn']) apply (rule cut_same [where A="OrdP k1"]) apply (metis SeqAbstFormP_imp_OrdP thin2) apply (rule cut_same [OF exists_RestrictedP [of s s1 "SUCC k1"]]) apply (rule AssumeH Ex_EH Conj_EH | simp)+ apply (rule Ex_I [where x="Eats (Var s) (HPair (SUCC k1) (HPair i (HPair (Q_Ex x) (Q_Ex x'))))"], simp) apply (rule Ex_I [where x="(SUCC k1)"], simp) apply (rule Conj_I) apply (blast intro: RestrictedP_LstSeqP_Eats [THEN cut2] SeqAbstFormP_imp_LstSeqP [THEN cut1]) proof (rule All2_SUCC_I, simp_all) show "?hyp \ SyntaxN.Ex sli (SyntaxN.Ex sl (SyntaxN.Ex sl' (HPair (SUCC k1) (HPair (Var sli) (HPair (Var sl) (Var sl'))) IN Eats (Var s) (HPair (SUCC k1) (HPair i (HPair (Q_Ex x) (Q_Ex x')))) AND (AbstAtomicP v (Var sli) (Var sl) (Var sl') OR OrdP (Var sli) AND SyntaxN.Ex m (SyntaxN.Ex n (SyntaxN.Ex smi (SyntaxN.Ex sm (SyntaxN.Ex sm' (SyntaxN.Ex sni (SyntaxN.Ex sn (SyntaxN.Ex sn' (Var m IN SUCC k1 AND Var n IN SUCC k1 AND HPair (Var m) (HPair (Var smi) (HPair (Var sm) (Var sm'))) IN Eats (Var s) (HPair (SUCC k1) (HPair i (HPair (Q_Ex x) (Q_Ex x')))) AND HPair (Var n) (HPair (Var sni) (HPair (Var sn) (Var sn'))) IN Eats (Var s) (HPair (SUCC k1) (HPair i (HPair (Q_Ex x) (Q_Ex x')))) AND (Var sli EQ Var smi AND Var sli EQ Var sni AND Var sl EQ Q_Disj (Var sm) (Var sn) AND Var sl' EQ Q_Disj (Var sm') (Var sn') OR Var sli EQ Var smi AND Var sl EQ Q_Neg (Var sm) AND Var sl' EQ Q_Neg (Var sm') OR SUCC (Var sli) EQ Var smi AND Var sl EQ Q_Ex (Var sm) AND Var sl' EQ Q_Ex (Var sm'))))))))))))))" \ \verifying the final values\ apply (rule Ex_I [where x="i"]) using assms atoms apply simp apply (rule Ex_I [where x="Q_Ex x"], simp) apply (rule Ex_I [where x="Q_Ex x'"], simp) apply (rule Conj_I, metis Mem_Eats_I2 Refl) apply (rule Disj_I2) apply (rule Conj_I, blast) apply (rule Ex_I [where x=k1], simp) apply (rule Ex_I [where x=k1], simp) apply (rule Ex_I [where x="SUCC i"], simp) apply (rule Ex_I [where x=x], simp) apply (rule_tac x=x' in Ex_I, simp) apply (rule Ex_I [where x="SUCC i"], simp) apply (rule Ex_I [where x=x], simp) apply (rule_tac x=x' in Ex_I, simp) apply (rule Conj_I [OF Mem_SUCC_Refl])+ apply (blast intro: Disj_I2 Mem_Eats_I1 RestrictedP_Mem [THEN cut3] Mem_SUCC_Refl SeqAbstFormP_imp_LstSeqP [THEN cut1] LstSeqP_imp_Mem) done next show "?hyp \ All2 l (SUCC k1) (SyntaxN.Ex sli (SyntaxN.Ex sl (SyntaxN.Ex sl' (HPair (Var l) (HPair (Var sli) (HPair (Var sl) (Var sl'))) IN Eats (Var s) (HPair (SUCC k1) (HPair i (HPair (Q_Ex x) (Q_Ex x')))) AND (AbstAtomicP v (Var sli) (Var sl) (Var sl') OR OrdP (Var sli) AND SyntaxN.Ex m (SyntaxN.Ex n (SyntaxN.Ex smi (SyntaxN.Ex sm (SyntaxN.Ex sm' (SyntaxN.Ex sni (SyntaxN.Ex sn (SyntaxN.Ex sn' (Var m IN Var l AND Var n IN Var l AND HPair (Var m) (HPair (Var smi) (HPair (Var sm) (Var sm'))) IN Eats (Var s) (HPair (SUCC k1) (HPair i (HPair (Q_Ex x) (Q_Ex x')))) AND HPair (Var n) (HPair (Var sni) (HPair (Var sn) (Var sn'))) IN Eats (Var s) (HPair (SUCC k1) (HPair i (HPair (Q_Ex x) (Q_Ex x')))) AND (Var sli EQ Var smi AND Var sli EQ Var sni AND Var sl EQ Q_Disj (Var sm) (Var sn) AND Var sl' EQ Q_Disj (Var sm') (Var sn') OR Var sli EQ Var smi AND Var sl EQ Q_Neg (Var sm) AND Var sl' EQ Q_Neg (Var sm') OR SUCC (Var sli) EQ Var smi AND Var sl EQ Q_Ex (Var sm) AND Var sl' EQ Q_Ex (Var sm')))))))))))))))" \ \verifying the sequence buildup\ using assms atoms \ \... the sequence buildup via s1\ apply (auto simp add: SeqAbstFormP.simps [of l s1 _ _ sli sl sl' m n smi sm sm' sni sn sn']) apply (rule Swap) apply (rule All2_E, auto del: Disj_EH) apply (rule Ex_I [where x="Var sli"], simp) apply (rule Ex_I [where x="Var sl"], simp) apply (rule Ex_I [where x="Var sl'"], simp) apply (rule Conj_I) apply (blast intro: Mem_Eats_I1 [OF RestrictedP_Mem [THEN cut3]] del: Disj_EH) apply (rule AssumeH Disj_IE1H Ex_EH Conj_EH)+ apply (rule Conj_I) apply (blast intro: Mem_Eats_I1 SeqAppendP_Mem2 [THEN cut4] del: Disj_EH) apply (rule Ex_I [where x="Var m"], simp) apply (rule Ex_I [where x="Var n"], simp) apply (rule Ex_I [where x="Var smi"], simp) apply (rule Ex_I [where x="Var sm"], simp) apply (rule Ex_I [where x="Var sm'"], simp) apply (rule Ex_I [where x="Var sni"], simp) apply (rule Ex_I [where x="Var sn"], simp) apply (rule Ex_I [where x="Var sn'"]) apply (auto intro: Mem_Eats_I1 [OF RestrictedP_Mem [THEN cut3]] OrdP_Trans [OF OrdP_SUCC_I] del: Disj_EH) done qed qed (*>*) theorem AbstFormP_Ex: "{AbstFormP v (SUCC i) x x'} \ AbstFormP v i (Q_Ex x) (Q_Ex x')" proof - obtain k1::name and s1::name and k::name and s::name where "atom s1 \ (v,i,x,x')" "atom k1 \ (v,i,x,x',s1)" "atom s \ (v,i,x,x',k1,s1)" "atom k \ (v,i,x,x',s,k1,s1)" by (metis obtain_fresh) thus ?thesis by (auto simp: AbstFormP.simps [of s v i "Q_Ex x" _ k] AbstFormP.simps [of s1 v "SUCC i" x x' k1] intro!: SeqAbstFormP_Ex [THEN cut3] Ord_IN_Ord[OF Mem_SUCC_I2[OF Refl], of _ i]) qed -corollary AbstTermP_Zero: "{OrdP t} \ AbstTermP \Var v\ t Zero Zero" +corollary AbstTermP_Zero: "{OrdP t} \ AbstTermP \Var v\ t Zero Zero" proof - obtain s::name and k::name where "atom s \ (v,t,k)" "atom k \ (v,t)" by (metis obtain_fresh) thus ?thesis by (auto simp: AbstTermP.simps [of s _ _ _ _ k] intro: SeqStTermP_Zero [THEN cut1]) qed corollary AbstTermP_Var_same: "{VarP v, OrdP t} \ AbstTermP v t v (Q_Ind t)" proof - obtain s::name and k::name where "atom s \ (v,t,k)" "atom k \ (v,t)" by (metis obtain_fresh) thus ?thesis by (auto simp: AbstTermP.simps [of s _ _ _ _ k] intro: SeqStTermP_Var_same [THEN cut1]) qed corollary AbstTermP_Var_diff: "{VarP v, VarP w, Neg (v EQ w), OrdP t} \ AbstTermP v t w w" proof - obtain s::name and k::name where "atom s \ (v,w,t,k)" "atom k \ (v,w,t)" by (metis obtain_fresh) thus ?thesis by (auto simp: AbstTermP.simps [of s _ _ _ _ k] intro: SeqStTermP_Var_diff [THEN cut3]) qed theorem AbstTermP_Eats: "{AbstTermP v i t1 u1, AbstTermP v i t2 u2} \ AbstTermP v i (Q_Eats t1 t2) (Q_Eats u1 u2)" proof - obtain k1::name and s1::name and k2::name and s2::name and k::name and s::name where "atom s1 \ (v,i,t1,u1,t2,u2)" "atom k1 \ (v,i,t1,u1,t2,u2,s1)" "atom s2 \ (v,i,t1,u1,t2,u2,k1,s1)" "atom k2 \ (v,i,t1,u1,t2,u2,s2,k1,s1)" "atom s \ (v,i,t1,u1,t2,u2,k2,s2,k1,s1)" "atom k \ (v,i,t1,u1,t2,u2,s,k2,s2,k1,s1)" by (metis obtain_fresh) thus ?thesis by (auto intro!: SeqStTermP_Eats [THEN cut2] simp: AbstTermP.simps [of s _ _ _ "(Q_Eats u1 u2)" k] AbstTermP.simps [of s1 v i t1 u1 k1] AbstTermP.simps [of s2 v i t2 u2 k2]) qed corollary AbstTermP_Ind: "{VarP v, IndP w, OrdP t} \ AbstTermP v t w w" proof - obtain s::name and k::name where "atom s \ (v,w,t,k)" "atom k \ (v,w,t)" by (metis obtain_fresh) thus ?thesis by (force simp: AbstTermP.simps [of s _ _ _ _ k] intro: SeqStTermP_Ind [THEN cut2]) qed lemma ORD_OF_EQ_diff: "x \ y \ {ORD_OF x EQ ORD_OF y} \ Fls" proof (induct x arbitrary: y) case (Suc x) then show ?case using SUCC_inject_E by (cases y) (auto simp: gr0_conv_Suc Eats_EQ_Zero_E SUCC_def) qed (auto simp: gr0_conv_Suc SUCC_def) -lemma quot_Var_EQ_diff: "i \ x \ {\Var i\ EQ \Var x\} \ Fls" +lemma quot_Var_EQ_diff: "i \ x \ {\Var i\ EQ \Var x\} \ Fls" by (auto simp: quot_Var ORD_OF_EQ_diff) -lemma AbstTermP_dbtm: "{} \ AbstTermP \Var i\ (ORD_OF n) (quot_dbtm u) (quot_dbtm (abst_dbtm i n u))" +lemma AbstTermP_dbtm: "{} \ AbstTermP \Var i\ (ORD_OF n) (quot_dbtm u) (quot_dbtm (abst_dbtm i n u))" proof (induct u rule: dbtm.induct) case (DBVar x) then show ?case by (auto simp: quot_Var[symmetric] quot_Var_EQ_diff intro!: AbstTermP_Var_same[THEN cut2] AbstTermP_Var_diff[THEN cut4] TermP_Zero) qed (auto intro!: AbstTermP_Zero[THEN cut1] AbstTermP_Eats[THEN cut2] AbstTermP_Ind[THEN cut3] IndP_Q_Ind) -lemma AbstFormP_dbfm: "{} \ AbstFormP \Var i\ (ORD_OF n) (quot_dbfm db) (quot_dbfm (abst_dbfm i n db))" +lemma AbstFormP_dbfm: "{} \ AbstFormP \Var i\ (ORD_OF n) (quot_dbfm db) (quot_dbfm (abst_dbfm i n db))" by (induction db arbitrary: n rule: dbfm.induct) (auto intro!: AbstTermP_dbtm AbstFormP_Mem[THEN cut2] AbstFormP_Eq[THEN cut2] AbstFormP_Disj[THEN cut2] AbstFormP_Neg[THEN cut1] AbstFormP_Ex[THEN cut1] dest: meta_spec[of _ "Suc _"]) lemmas AbstFormP = AbstFormP_dbfm[where db="trans_fm [] A" and n = 0 for A, simplified, folded quot_fm_def, unfolded abst_trans_fm] lemma SubstTermP_trivial_dbtm: - "atom i \ u \ {} \ SubstTermP \Var i\ Zero (quot_dbtm u) (quot_dbtm u)" + "atom i \ u \ {} \ SubstTermP \Var i\ Zero (quot_dbtm u) (quot_dbtm u)" proof (induct u rule: dbtm.induct) case (DBVar x) then show ?case by (auto simp: quot_Var[symmetric] quot_Var_EQ_diff intro!: SubstTermP_Var_same[THEN cut2] SubstTermP_Var_diff[THEN cut4] TermP_Zero) qed (auto intro!: SubstTermP_Zero[THEN cut1] SubstTermP_Eats[THEN cut2] SubstTermP_Ind[THEN cut3] TermP_Zero IndP_Q_Ind) lemma SubstTermP_dbtm: "wf_dbtm t \ - {} \ SubstTermP \Var i\ (quot_dbtm t) (quot_dbtm u) (quot_dbtm (subst_dbtm t i u))" + {} \ SubstTermP \Var i\ (quot_dbtm t) (quot_dbtm u) (quot_dbtm (subst_dbtm t i u))" proof (induct u rule: dbtm.induct) case (DBVar x) then show ?case apply (auto simp: quot_Var[symmetric] intro!: SubstTermP_Var_same[THEN cut2] SubstTermP_Var_diff[THEN cut4] TermP_quot_dbtm) apply (auto simp: quot_Var ORD_OF_EQ_diff) done qed (auto intro!: SubstTermP_Zero[THEN cut1] SubstTermP_Ind[THEN cut3] SubstTermP_Eats[THEN cut2] TermP_quot_dbtm IndP_Q_Ind) lemma SubstFormP_trivial_dbfm: fixes X :: fm assumes "atom i \ db" - shows "{} \ SubstFormP \Var i\ Zero (quot_dbfm db) (quot_dbfm db)" + shows "{} \ SubstFormP \Var i\ Zero (quot_dbfm db) (quot_dbfm db)" using assms by (induct db rule: dbfm.induct) (auto intro!: SubstFormP_Ex[THEN cut1] SubstFormP_Neg[THEN cut1] SubstFormP_Disj[THEN cut2] SubstFormP_Eq[THEN cut2] SubstFormP_Mem[THEN cut2] SubstTermP_trivial_dbtm)+ lemma SubstFormP_dbfm: assumes "wf_dbtm t" - shows "{} \ SubstFormP \Var i\ (quot_dbtm t) (quot_dbfm db) (quot_dbfm (subst_dbfm t i db))" + shows "{} \ SubstFormP \Var i\ (quot_dbtm t) (quot_dbfm db) (quot_dbfm (subst_dbfm t i db))" by (induct db rule: dbfm.induct) (auto intro!: SubstTermP_dbtm assms SubstFormP_Ex[THEN cut1] SubstFormP_Neg[THEN cut1] SubstFormP_Disj[THEN cut2] SubstFormP_Eq[THEN cut2] SubstFormP_Mem[THEN cut2])+ lemmas SubstFormP_trivial = SubstFormP_trivial_dbfm[where db="trans_fm [] A" for A, simplified, folded quot_tm_def quot_fm_def quot_subst_eq] lemmas SubstFormP = SubstFormP_dbfm[OF wf_dbtm_trans_tm, where db="trans_fm [] A" for A, simplified, folded quot_tm_def quot_fm_def quot_subst_eq] lemmas SubstFormP_Zero = SubstFormP_dbfm[OF wf_dbtm.Zero, where db="trans_fm [] A" for A, simplified, folded trans_tm.simps[of "[]"], folded quot_tm_def quot_fm_def quot_subst_eq] lemma AtomicP_Mem: "{TermP x, TermP y} \ AtomicP (Q_Mem x y)" proof - obtain t::name and u::name where "atom t \ (x, y)" "atom u \ (t, x, y)" by (metis obtain_fresh) thus ?thesis apply (simp add: AtomicP.simps [of t u]) apply (rule Ex_I [where x = x], simp) apply (rule Ex_I [where x = y], simp) apply (auto intro: Disj_I2) done qed lemma AtomicP_Eq: "{TermP x, TermP y} \ AtomicP (Q_Eq x y)" proof - obtain t::name and u::name where "atom t \ (x, y)" "atom u \ (t, x, y)" by (metis obtain_fresh) thus ?thesis apply (simp add: AtomicP.simps [of t u]) apply (rule Ex_I [where x = x], simp) apply (rule Ex_I [where x = y], simp) apply (auto intro: Disj_I1) done qed lemma SeqFormP_Mem: assumes "atom s \ (k,x,y)" "atom k \ (x,y)" shows "{TermP x, TermP y} \ Ex k (Ex s (SeqFormP (Var s) (Var k) (Q_Mem x y)))" proof - let ?vs = "(x,y,s,k)" obtain l::name and sl::name and m::name and n::name and sm::name and sn::name where "atom l \ (?vs,sl,m,n,sm,sn)" "atom sl \ (?vs,m,n,sm,sn)" "atom m \ (?vs,n,sm,sn)" "atom n \ (?vs,sm,sn)" "atom sm \ (?vs,sn)" "atom sn \ (?vs)" by (metis obtain_fresh) with assms show ?thesis apply (auto simp: SeqFormP.simps[of l "Var s" _ _ sl m n sm sn]) apply (rule Ex_I [where x = Zero], simp) apply (rule Ex_I [where x = "Eats Zero (HPair Zero (Q_Mem x y))"], auto intro!: Mem_SUCC_EH) apply (rule Ex_I [where x = "Q_Mem x y"], auto intro!: Mem_Eats_I2 HPair_cong Disj_I1 AtomicP_Mem[THEN cut2]) done qed lemma SeqFormP_Eq: assumes "atom s \ (k,x,y)" "atom k \ (x,y)" shows "{TermP x, TermP y} \ Ex k (Ex s (SeqFormP (Var s) (Var k) (Q_Eq x y)))" proof - let ?vs = "(x,y,s,k)" obtain l::name and sl::name and m::name and n::name and sm::name and sn::name where "atom l \ (?vs,sl,m,n,sm,sn)" "atom sl \ (?vs,m,n,sm,sn)" "atom m \ (?vs,n,sm,sn)" "atom n \ (?vs,sm,sn)" "atom sm \ (?vs,sn)" "atom sn \ (?vs)" by (metis obtain_fresh) with assms show ?thesis apply (auto simp: SeqFormP.simps[of l "Var s" _ _ sl m n sm sn]) apply (rule Ex_I [where x = Zero], simp) apply (rule Ex_I [where x = "Eats Zero (HPair Zero (Q_Eq x y))"], auto intro!: Mem_SUCC_EH) apply (rule Ex_I [where x = "Q_Eq x y"], auto intro!: Mem_Eats_I2 HPair_cong Disj_I1 AtomicP_Eq[THEN cut2]) done qed lemma FormP_Mem: "{TermP x, TermP y} \ FormP (Q_Mem x y)" proof - obtain s::name and k::name where "atom s \ (x, y)" "atom k \ (s, x, y)" by (metis obtain_fresh) thus ?thesis by (auto simp add: FormP.simps [of k s] intro!: SeqFormP_Mem) qed lemma FormP_Eq: "{TermP x, TermP y} \ FormP (Q_Eq x y)" proof - obtain s::name and k::name where "atom s \ (x, y)" "atom k \ (s, x, y)" by (metis obtain_fresh) thus ?thesis by (auto simp add: FormP.simps [of k s] intro!: SeqFormP_Eq) qed subsection \MakeForm\ lemma MakeFormP_Neg: "{} \ MakeFormP (Q_Neg x) x y" proof - obtain a::name and b::name where "atom a \ (x, y)" "atom b \ (a, x, y)" by (metis obtain_fresh) then show ?thesis by (auto simp: MakeFormP.simps[of a _ _ _ b] intro: Disj_I2[OF Disj_I1]) qed lemma MakeFormP_Disj: "{} \ MakeFormP (Q_Disj x y) x y" proof - obtain a::name and b::name where "atom a \ (x, y)" "atom b \ (a, x, y)" by (metis obtain_fresh) then show ?thesis by (auto simp: MakeFormP.simps[of a _ _ _ b] intro: Disj_I1) qed lemma MakeFormP_Ex: "{AbstFormP v Zero t x} \ MakeFormP (Q_Ex x) t y" proof - obtain a::name and b::name where "atom a \ (v, x, t, y)" "atom b \ (a, v, x, t, y)" by (metis obtain_fresh) then show ?thesis by (subst MakeFormP.simps[of a _ _ _ b]) (force intro!: Disj_I2[OF Disj_I2] intro: Ex_I[of _ _ _ v] Ex_I[of _ _ _ x])+ qed subsection \Negation\ lemma SeqFormP_Neg: assumes "atom s \ (k,s1,k1,x)" "atom k \ (s1,k1,x)" shows "{SeqFormP s1 k1 x} \ Ex k (Ex s (SeqFormP (Var s) (Var k) (Q_Neg x)))" (*<*) proof - let ?vs = "(s1,k1,s,k,x)" obtain l::name and sl::name and m::name and n::name and sm::name and sn::name where atoms: "atom l \ (?vs,sl,m,n,sm,sn)" "atom sl \ (?vs,m,n,sm,sn)" "atom m \ (?vs,n,sm,sn)" "atom n \ (?vs,sm,sn)" "atom sm \ (?vs,sn)" "atom sn \ (?vs)" by (metis obtain_fresh) let ?hyp = "{RestrictedP s1 (SUCC k1) (Var s), OrdP k1, SeqFormP s1 k1 x}" show ?thesis using assms atoms apply (auto simp: SeqFormP.simps [of l "Var s" _ _ sl m n sm sn]) apply (rule cut_same [where A="OrdP k1"]) apply (rule SeqFormP_imp_OrdP) apply (rule cut_same [OF exists_RestrictedP [of s s1 "SUCC k1"]]) apply (rule AssumeH Ex_EH Conj_EH | simp)+ apply (rule Ex_I [where x="(SUCC k1)"]) apply (simp_all (no_asm_simp)) apply (rule Ex_I [where x="Eats (Var s) (HPair (SUCC k1) (Q_Neg x))"]) apply (simp_all (no_asm_simp)) apply (rule Conj_I) apply (blast intro: RestrictedP_LstSeqP_Eats [THEN cut2] SeqFormP_imp_LstSeqP [THEN cut1]) proof (rule All2_SUCC_I, simp_all) show "?hyp \ SyntaxN.Ex sn (HPair (SUCC k1) (Var sn) IN Eats (Var s) (HPair (SUCC k1) (Q_Neg x)) AND (AtomicP (Var sn) OR SyntaxN.Ex m (SyntaxN.Ex l (SyntaxN.Ex sm (SyntaxN.Ex sl (Var m IN SUCC k1 AND Var l IN SUCC k1 AND HPair (Var m) (Var sm) IN Eats (Var s) (HPair (SUCC k1) (Q_Neg x)) AND HPair (Var l) (Var sl) IN Eats (Var s) (HPair (SUCC k1) (Q_Neg x)) AND MakeFormP (Var sn) (Var sm) (Var sl)))))))" \ \verifying the final values\ apply (rule Ex_I [where x="Q_Neg x"]) using assms atoms apply simp apply (rule Conj_I, metis Mem_Eats_I2 Refl) apply (rule Disj_I2) apply (rule Ex_I [where x=k1], simp) apply (rule Ex_I [where x=k1], simp) apply (rule Ex_I [where x=x], simp) apply (rule Ex_I [where x=x], simp) apply (rule Conj_I [OF Mem_SUCC_Refl])+ apply (blast intro: Disj_I1 Disj_I2 Mem_Eats_I1 RestrictedP_Mem [THEN cut3] Mem_SUCC_Refl SeqFormP_imp_LstSeqP [THEN cut1] LstSeqP_imp_Mem MakeFormP_Neg[THEN thin0]) done next show "?hyp \ All2 n (SUCC k1) (SyntaxN.Ex sn (HPair (Var n) (Var sn) IN Eats (Var s) (HPair (SUCC k1) (Q_Neg x)) AND (AtomicP (Var sn) OR SyntaxN.Ex m (SyntaxN.Ex l (SyntaxN.Ex sm (SyntaxN.Ex sl (Var m IN Var n AND Var l IN Var n AND HPair (Var m) (Var sm) IN Eats (Var s) (HPair (SUCC k1) (Q_Neg x)) AND HPair (Var l) (Var sl) IN Eats (Var s) (HPair (SUCC k1) (Q_Neg x)) AND MakeFormP (Var sn) (Var sm) (Var sl))))))))" \ \verifying the sequence buildup\ apply (rule All_I Imp_I)+ using assms atoms apply simp_all \ \... the sequence buildup via s1\ apply (simp add: SeqFormP.simps [of l s1 _ _ sl m n sm sn]) apply (rule AssumeH Ex_EH Conj_EH)+ apply (rule All2_E [THEN rotate2], auto del: Disj_EH) apply (rule Ex_I [where x="Var sn"], simp) apply (rule Conj_I) apply (blast intro: Mem_Eats_I1 [OF RestrictedP_Mem [THEN cut3]] del: Disj_EH) apply (rule AssumeH Disj_IE1H Ex_EH Conj_EH Conj_I)+ apply (rule Ex_I [where x="Var m"], simp) apply (rule Ex_I [where x="Var l"], simp) apply (rule Ex_I [where x="Var sm"], simp) apply (rule Ex_I [where x="Var sl"], simp) apply auto apply (rule Mem_Eats_I1 [OF RestrictedP_Mem [THEN cut3]] AssumeH OrdP_Trans [OF OrdP_SUCC_I])+ done qed qed (*>*) theorem FormP_Neg: "{FormP x} \ FormP (Q_Neg x)" proof - obtain k1::name and s1::name and k::name and s::name where "atom s1 \ x" "atom k1 \ (x,s1)" "atom s \ (x,k1,s1)" "atom k \ (x,s,k1,s1)" by (metis obtain_fresh) thus ?thesis by (force simp: FormP.simps [of k s "Q_Neg x"] FormP.simps [of k1 s1 x] intro: SeqFormP_Neg [THEN cut1]) qed subsection \Disjunction\ lemma SeqFormP_Disj: assumes "atom s \ (k,s1,s2,k1,k2,x,y)" "atom k \ (s1,s2,k1,k2,x,y)" shows "{SeqFormP s1 k1 x, SeqFormP s2 k2 y} \ Ex k (Ex s (SeqFormP (Var s) (Var k) (Q_Disj x y)))" (*<*) proof - let ?vs = "(s1,s2,s,k1,k2,k,x,y)" obtain km::name and kn::name and j::name and k'::name and l::name and sl::name and m::name and n::name and sm::name and sn::name where atoms2: "atom km \ (kn,j,k',l,s1,s2,s,k1,k2,k,x,y,sl,m,n,sm,sn)" "atom kn \ (j,k',l,s1,s2,s,k1,k2,k,x,y,sl,m,n,sm,sn)" "atom j \ (k',l,s1,s2,s,k1,k2,k,x,y,sl,m,n,sm,sn)" and atoms: "atom k' \ (l,s1,s2,s,k1,k2,k,x,y,sl,m,n,sm,sn)" "atom l \ (s1,s2,s,k1,k2,k,x,y,sl,m,n,sm,sn)" "atom sl \ (s1,s2,s,k1,k2,k,x,y,m,n,sm,sn)" "atom m \ (s1,s2,s,k1,k2,k,x,y,n,sm,sn)" "atom n \ (s1,s2,s,k1,k2,k,x,y,sm,sn)" "atom sm \ (s1,s2,s,k1,k2,k,x,y,sn)" "atom sn \ (s1,s2,s,k1,k2,k,x,y)" by (metis obtain_fresh) let ?hyp = "{HaddP k1 k2 (Var k'), OrdP k1, OrdP k2, SeqAppendP s1 (SUCC k1) s2 (SUCC k2) (Var s), SeqFormP s1 k1 x, SeqFormP s2 k2 y}" show ?thesis using assms atoms apply (auto simp: SeqFormP.simps [of l "Var s" _ _ sl m n sm sn]) apply (rule cut_same [where A="OrdP k1 AND OrdP k2"]) apply (metis Conj_I SeqFormP_imp_OrdP thin1 thin2) apply (rule cut_same [OF exists_SeqAppendP [of s s1 "SUCC k1" s2 "SUCC k2"]]) apply (rule AssumeH Ex_EH Conj_EH | simp)+ apply (rule cut_same [OF exists_HaddP [where j=k' and x=k1 and y=k2]]) apply (rule AssumeH Ex_EH Conj_EH | simp)+ apply (rule Ex_I [where x="SUCC (SUCC (Var k'))"]) apply (simp_all (no_asm_simp) add: ) apply (rule Ex_I [where x="Eats (Var s) (HPair (SUCC(SUCC(Var k'))) (Q_Disj x y))"], simp) apply (rule Conj_I) apply (blast intro: LstSeqP_SeqAppendP_Eats SeqFormP_imp_LstSeqP [THEN cut1]) proof (rule All2_SUCC_I, simp_all) show "?hyp \ SyntaxN.Ex sn (HPair (SUCC (SUCC (Var k'))) (Var sn) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (Q_Disj x y)) AND (AtomicP (Var sn) OR SyntaxN.Ex m (SyntaxN.Ex l (SyntaxN.Ex sm (SyntaxN.Ex sl (Var m IN SUCC (SUCC (Var k')) AND Var l IN SUCC (SUCC (Var k')) AND HPair (Var m) (Var sm) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (Q_Disj x y)) AND HPair (Var l) (Var sl) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (Q_Disj x y)) AND MakeFormP (Var sn) (Var sm) (Var sl)))))))" \ \verifying the final values\ apply (rule Ex_I [where x="Q_Disj x y"]) using assms atoms apply simp apply (rule Conj_I, metis Mem_Eats_I2 Refl) apply (rule Disj_I2) apply (rule Ex_I [where x=k1], simp) apply (rule Ex_I [where x="SUCC (Var k')"], simp) apply (rule Ex_I [where x=x], simp) apply (rule Ex_I [where x=y], simp) apply (rule Conj_I) apply (blast intro: HaddP_Mem_I LstSeqP_OrdP Mem_SUCC_I1) apply (rule Conj_I [OF Mem_SUCC_Refl]) apply (blast intro: Disj_I1 Mem_Eats_I1 Mem_SUCC_Refl SeqFormP_imp_LstSeqP [THEN cut1] LstSeqP_imp_Mem SeqAppendP_Mem1 [THEN cut3] SeqAppendP_Mem2 [THEN cut4] HaddP_SUCC1 [THEN cut1] MakeFormP_Disj[THEN thin0]) done next show "?hyp \ All2 n (SUCC (SUCC (Var k'))) (SyntaxN.Ex sn (HPair (Var n) (Var sn) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (Q_Disj x y)) AND (AtomicP (Var sn) OR SyntaxN.Ex m (SyntaxN.Ex l (SyntaxN.Ex sm (SyntaxN.Ex sl (Var m IN Var n AND Var l IN Var n AND HPair (Var m) (Var sm) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (Q_Disj x y)) AND HPair (Var l) (Var sl) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (Q_Disj x y)) AND MakeFormP (Var sn) (Var sm) (Var sl))))))))" \ \verifying the sequence buildup\ apply (rule cut_same [where A="HaddP (SUCC k1) (SUCC k2) (SUCC (SUCC (Var k')))"]) apply (blast intro: HaddP_SUCC1 [THEN cut1] HaddP_SUCC2 [THEN cut1]) apply (rule All_I Imp_I)+ apply (rule HaddP_Mem_cases [where i=j]) using assms atoms atoms2 apply simp_all apply (rule AssumeH) apply (blast intro: OrdP_SUCC_I LstSeqP_OrdP) \ \... the sequence buildup via s1\ apply (simp add: SeqFormP.simps [of l s1 _ _ sl m n sm sn]) apply (rule AssumeH Ex_EH Conj_EH)+ apply (rule All2_E [THEN rotate2]) apply (simp | rule AssumeH Ex_EH Conj_EH)+ apply (rule Ex_I [where x="Var sn"], simp) apply (rule Conj_I [OF Mem_Eats_I1]) apply (metis SeqAppendP_Mem1 rotate3 thin2 thin4) apply (rule AssumeH Disj_IE1H Ex_EH Conj_EH)+ apply (rule Ex_I [where x="Var m"], simp) apply (rule Ex_I [where x="Var l"], simp) apply (rule Ex_I [where x="Var sm"], simp) apply (rule Ex_I [where x="Var sl"], simp_all (no_asm_simp)) apply (rule Conj_I, rule AssumeH)+ apply (rule Conj_I) apply (blast intro: OrdP_Trans [OF OrdP_SUCC_I] Mem_Eats_I1 [OF SeqAppendP_Mem1 [THEN cut3]] Hyp) apply (blast intro: Disj_I1 Disj_I2 OrdP_Trans [OF OrdP_SUCC_I] Mem_Eats_I1 [OF SeqAppendP_Mem1 [THEN cut3]] Hyp) \ \... the sequence buildup via s2\ apply (simp add: SeqFormP.simps [of l s2 _ _ sl m n sm sn]) apply (rule AssumeH Ex_EH Conj_EH)+ apply (rule All2_E [THEN rotate2]) apply (simp | rule AssumeH Ex_EH Conj_EH)+ apply (rule Ex_I [where x="Var sn"], simp) apply (rule cut_same [where A="OrdP (Var j)"]) apply (metis HaddP_imp_OrdP rotate2 thin2) apply (rule Conj_I) apply (blast intro: Mem_Eats_I1 SeqAppendP_Mem2 [THEN cut4] del: Disj_EH) apply (rule AssumeH Disj_IE1H Ex_EH Conj_EH)+ apply (rule cut_same [OF exists_HaddP [where j=km and x="SUCC k1" and y="Var m"]]) apply (blast intro: Ord_IN_Ord, simp) apply (rule cut_same [OF exists_HaddP [where j=kn and x="SUCC k1" and y="Var l"]]) apply (metis AssumeH(6) Ord_IN_Ord0 rotate8, simp) apply (rule AssumeH Ex_EH Conj_EH | simp)+ apply (rule Ex_I [where x="Var km"], simp) apply (rule Ex_I [where x="Var kn"], simp) apply (rule Ex_I [where x="Var sm"], simp) apply (rule Ex_I [where x="Var sl"], simp_all (no_asm_simp)) apply (rule Conj_I [OF _ Conj_I]) apply (blast intro!: HaddP_Mem_cancel_left [THEN Iff_MP2_same] OrdP_SUCC_I intro: LstSeqP_OrdP Hyp)+ apply (blast del: Disj_EH intro: OrdP_Trans Hyp intro!: Mem_Eats_I1 SeqAppendP_Mem2 [THEN cut4] HaddP_imp_OrdP [THEN cut1]) done qed qed (*>*) theorem FormP_Disj: "{FormP x, FormP y} \ FormP (Q_Disj x y)" proof - obtain k1::name and s1::name and k2::name and s2::name and k::name and s::name where "atom s1 \ (x,y)" "atom k1 \ (x,y,s1)" "atom s2 \ (x,y,k1,s1)" "atom k2 \ (x,y,s2,k1,s1)" "atom s \ (x,y,k2,s2,k1,s1)" "atom k \ (x,y,s,k2,s2,k1,s1)" by (metis obtain_fresh) thus ?thesis by (force simp: FormP.simps [of k s "Q_Disj x y"] FormP.simps [of k1 s1 x] FormP.simps [of k2 s2 y] intro: SeqFormP_Disj [THEN cut2]) qed subsection \Existential\ lemma SeqFormP_Ex: assumes "atom s \ (k,s1,k1,x,y,v)" "atom k \ (s1,k1,x,y,v)" shows "{SeqFormP s1 k1 x,AbstFormP v Zero x y, VarP v} \ Ex k (Ex s (SeqFormP (Var s) (Var k) (Q_Ex y)))" proof - let ?vs = "(s1,s,k1,k,x,y,v)" obtain km::name and kn::name and j::name and k'::name and l::name and sl::name and m::name and n::name and sm::name and sn::name where atoms2: "atom km \ (kn,j,k',l,s1,s,k1,k,x,y,v,sl,m,n,sm,sn)" "atom kn \ (j,k',l,s1,s,k1,k,x,y,v,sl,m,n,sm,sn)" "atom j \ (k',l,s1,s,k1,k,x,y,v,sl,m,n,sm,sn)" and atoms: "atom k' \ (l,s1,s,k1,k,x,y,v,sl,m,n,sm,sn)" "atom l \ (s1,s,k1,k,x,y,v,sl,m,n,sm,sn)" "atom sl \ (s1,s,k1,k,x,y,v,m,n,sm,sn)" "atom m \ (s1,s,k1,k,x,y,v,n,sm,sn)" "atom n \ (s1,s,k1,k,x,y,v,sm,sn)" "atom sm \ (s1,s,k1,k,x,y,v,sn)" "atom sn \ (s1,s,k1,k,x,y,v)" by (metis obtain_fresh) let ?hyp = "{RestrictedP s1 (SUCC k1) (Var s), OrdP k1, SeqFormP s1 k1 x,AbstFormP v Zero x y, VarP v}" show ?thesis using assms atoms apply (auto simp: SeqFormP.simps [of l "Var s" _ _ sl m n sm sn]) apply (rule cut_same [where A="OrdP k1"]) apply (metis SeqFormP_imp_OrdP thin2) apply (rule cut_same [OF exists_RestrictedP [of s s1 "SUCC k1"]]) apply (rule AssumeH Ex_EH Conj_EH | simp)+ apply (rule Ex_I [where x="(SUCC k1)"], simp) apply (rule Ex_I [where x="Eats (Var s) (HPair (SUCC k1) (Q_Ex y))"], simp) apply (rule Conj_I) apply (blast intro: RestrictedP_LstSeqP_Eats [THEN cut2] SeqFormP_imp_LstSeqP [THEN cut1]) proof (rule All2_SUCC_I, simp_all) show "?hyp \ SyntaxN.Ex sn (HPair (SUCC k1) (Var sn) IN Eats (Var s) (HPair (SUCC k1) (Q_Ex y)) AND (AtomicP (Var sn) OR SyntaxN.Ex m (SyntaxN.Ex l (SyntaxN.Ex sm (SyntaxN.Ex sl (Var m IN SUCC k1 AND Var l IN SUCC k1 AND HPair (Var m) (Var sm) IN Eats (Var s) (HPair (SUCC k1) (Q_Ex y)) AND HPair (Var l) (Var sl) IN Eats (Var s) (HPair (SUCC k1) (Q_Ex y)) AND MakeFormP (Var sn) (Var sm) (Var sl)))))))" \ \verifying the final values\ apply (rule Ex_I [where x="Q_Ex y"]) using assms atoms apply simp apply (rule Conj_I, metis Mem_Eats_I2 Refl) apply (rule Disj_I2) apply (rule Ex_I [where x=k1], simp) apply (rule Ex_I [where x=k1], simp) apply (rule Ex_I [where x=x], simp) apply (rule Ex_I [where x=x], simp) apply (rule Conj_I [OF Mem_SUCC_Refl])+ apply safe apply (blast intro: Disj_I2 Mem_Eats_I1 RestrictedP_Mem [THEN cut3] Mem_SUCC_Refl SeqFormP_imp_LstSeqP [THEN cut1] LstSeqP_imp_Mem) apply (blast intro: Disj_I2 Mem_Eats_I1 RestrictedP_Mem [THEN cut3] Mem_SUCC_Refl SeqFormP_imp_LstSeqP [THEN cut1] LstSeqP_imp_Mem) apply (rule MakeFormP_Ex[THEN cut1, of _ v]) apply blast done next show "?hyp \ All2 n (SUCC k1) (SyntaxN.Ex sn (HPair (Var n) (Var sn) IN Eats (Var s) (HPair (SUCC k1) (Q_Ex y)) AND (AtomicP (Var sn) OR SyntaxN.Ex m (SyntaxN.Ex l (SyntaxN.Ex sm (SyntaxN.Ex sl (Var m IN Var n AND Var l IN Var n AND HPair (Var m) (Var sm) IN Eats (Var s) (HPair (SUCC k1) (Q_Ex y)) AND HPair (Var l) (Var sl) IN Eats (Var s) (HPair (SUCC k1) (Q_Ex y)) AND MakeFormP (Var sn) (Var sm) (Var sl))))))))" apply (rule All_I Imp_I)+ using assms atoms apply simp_all \ \... the sequence buildup via s1\ apply (simp add: SeqFormP.simps [of l s1 _ _ sl m n sm sn]) apply (rule AssumeH Ex_EH Conj_EH)+ apply (rule All2_E [THEN rotate2], auto del: Disj_EH) apply (rule Ex_I [where x="Var sn"], simp) apply (rule Conj_I) apply (blast intro: Mem_Eats_I1 [OF RestrictedP_Mem [THEN cut3]] del: Disj_EH) apply (rule AssumeH Disj_IE1H Ex_EH Conj_EH Conj_I)+ apply (rule Ex_I [where x="Var m"], simp) apply (rule Ex_I [where x="Var l"], simp) apply (rule Ex_I [where x="Var sm"], simp) apply (rule Ex_I [where x="Var sl"], simp) apply auto apply (rule Mem_Eats_I1 [OF RestrictedP_Mem [THEN cut3]] AssumeH OrdP_Trans [OF OrdP_SUCC_I])+ done qed qed (*>*) -theorem FormP_Ex: "{FormP t, AbstFormP \Var i\ Zero t x} \ FormP (Q_Ex x)" +theorem FormP_Ex: "{FormP t, AbstFormP \Var i\ Zero t x} \ FormP (Q_Ex x)" proof - obtain k1::name and s1::name and k::name and s::name where "atom s1 \ (i,t,x)" "atom k1 \ (i,t,x,s1)" "atom s \ (i,t,x,k1,s1)" "atom k \ (i,t,x,s,k1,s1)" by (metis obtain_fresh) thus ?thesis by (auto simp: FormP.simps [of k s "Q_Ex x"] FormP.simps [of k1 s1 t] intro!: SeqFormP_Ex [THEN cut3]) qed lemma FormP_quot_dbfm: fixes A :: dbfm shows "wf_dbfm A \ {} \ FormP (quot_dbfm A)" by (induct A rule: wf_dbfm.induct) (auto simp: intro!: FormP_Mem[THEN cut2] FormP_Eq[THEN cut2] Ex_I FormP_Neg[THEN cut1] FormP_Disj[THEN cut2] FormP_Ex[THEN cut2] TermP_quot_dbtm AbstFormP_dbfm[where n=0, simplified]) lemma FormP_quot: fixes A :: fm - shows "{} \ FormP \A\" + shows "{} \ FormP \A\" unfolding quot_fm_def by (rule FormP_quot_dbfm, rule wf_dbfm_trans_fm) lemma PfP_I: assumes "{} \ PrfP S K A" shows "{} \ PfP A" proof - obtain s::name and k::name where "atom s \ (k,A,S,K)" "atom k \ (A,S,K)" by (metis obtain_fresh) with assms show ?thesis apply (subst PfP.simps[of s k]; simp) apply (rule Ex_I[of _ _ _ K], auto, rule Ex_I[of _ _ _ S], auto) done qed -lemmas PfP_Single_I = PfP_I[of "Eats Zero (HPair Zero \A\)" Zero for A] - -lemma PfP_extra: "{} \ PfP \extra_axiom\" +lemmas PfP_Single_I = PfP_I[of "Eats Zero (HPair Zero \A\)" Zero for A] + +lemma PfP_extra: "{} \ PfP \extra_axiom\" proof - obtain l::name and sl::name and m::name and n::name and sm::name and sn::name where atoms: "atom l \ (sl,m,n,sm,sn)" "atom sl \ (m,n,sm,sn)" "atom m \ (n,sm,sn)" "atom n \ (sm,sn)" "atom sm \ sn" by (metis obtain_fresh) with Extra show ?thesis apply (intro PfP_Single_I[of extra_axiom]) apply (subst PrfP.simps[of l _ sl m n sm sn]; auto?) - apply (rule Ex_I[of _ _ _ "\extra_axiom\"]; auto?) + apply (rule Ex_I[of _ _ _ "\extra_axiom\"]; auto?) apply (rule Mem_SUCC_E[OF Mem_Zero_E]) apply (rule Mem_Eats_I2) apply (rule HPair_cong[OF Assume Refl]) apply (auto simp: AxiomP_def intro!: Disj_I1) done qed lemma SentP_I: assumes "A \ boolean_axioms" - shows "{} \ SentP \A\" + shows "{} \ SentP \A\" proof - obtain x y z :: name where "atom z \ (x,y)" "atom y \ x" by (metis obtain_fresh) with assms show ?thesis apply (subst SentP.simps[of x y z]; simp) subgoal proof (erule boolean_axioms.cases, goal_cases Ident DisjI1 DisjCont DisjAssoc DisjConj) case (Ident A) then show ?thesis - by (intro Ex_I[of _ _ _ "\A\"]; simp)+ + by (intro Ex_I[of _ _ _ "\A\"]; simp)+ (auto simp: FormP_quot[THEN thin0] quot_simps intro!: Disj_I1) next case (DisjI1 A B) then show ?thesis - by (intro Ex_I[of _ _ _ "\A\"]; simp, (intro Ex_I[of _ _ _ "\B\"]; simp)?)+ + by (intro Ex_I[of _ _ _ "\A\"]; simp, (intro Ex_I[of _ _ _ "\B\"]; simp)?)+ (auto simp: FormP_quot[THEN thin0] quot_simps intro!: Disj_I2[OF Disj_I1]) next case (DisjCont A) then show ?thesis - by (intro Ex_I[of _ _ _ "\A\"]; simp)+ + by (intro Ex_I[of _ _ _ "\A\"]; simp)+ (auto simp: FormP_quot[THEN thin0] quot_simps intro!: Disj_I2[OF Disj_I2[OF Disj_I1]]) next case (DisjAssoc A B C) then show ?thesis - by (intro Ex_I[of _ _ _ "\A\"]; simp, intro Ex_I[of _ _ _ "\B\"]; simp, intro Ex_I[of _ _ _ "\C\"]; simp)+ + by (intro Ex_I[of _ _ _ "\A\"]; simp, intro Ex_I[of _ _ _ "\B\"]; simp, intro Ex_I[of _ _ _ "\C\"]; simp)+ (auto simp: FormP_quot[THEN thin0] quot_simps intro!: Disj_I2[OF Disj_I2[OF Disj_I2[OF Disj_I1]]]) next case (DisjConj A B C) then show ?thesis - by (intro Ex_I[of _ _ _ "\A\"]; simp, intro Ex_I[of _ _ _ "\B\"]; simp, intro Ex_I[of _ _ _ "\C\"]; simp)+ + by (intro Ex_I[of _ _ _ "\A\"]; simp, intro Ex_I[of _ _ _ "\B\"]; simp, intro Ex_I[of _ _ _ "\C\"]; simp)+ (auto simp: FormP_quot[THEN thin0] quot_simps intro!: Disj_I2[OF Disj_I2[OF Disj_I2[OF Disj_I2]]]) qed done qed lemma SentP_subst [simp]: "(SentP A)(j::=w) = SentP (subst j w A)" proof - obtain x y z ::name where "atom x \ (y,z,j,w,A)" "atom y \ (z,j,w,A)" "atom z \ (j,w,A)" by (metis obtain_fresh) thus ?thesis by (auto simp: SentP.simps [of x y z]) qed theorem proved_imp_proved_PfP: assumes "{} \ \" - shows "{} \ PfP \\\" + shows "{} \ PfP \\\" using assms proof (induct "{} :: fm set" \ rule: hfthm.induct) case (Hyp A) then show ?case by auto next case Extra then show ?case by (simp add: PfP_extra) next case (Bool A) obtain l::name and sl::name and m::name and n::name and sm::name and sn::name and x::name and y::name and z::name where atoms: "atom l \ (x,y,z,sl,m,n,sm,sn)" "atom sl \ (x,y,z,m,n,sm,sn)" "atom m \ (x,y,z,n,sm,sn)" "atom n \ (x,y,z,sm,sn)" "atom sm \ (x,y,z,sn)" "atom sn \ (x,y,z)" "atom z \ (x,y)" "atom y \ x" by (metis obtain_fresh) with Bool show ?case apply (intro PfP_Single_I[of A]) apply (subst PrfP.simps[of l _ sl m n sm sn]; auto?) - apply (rule Ex_I[of _ _ _ "\A\"]; auto?) + apply (rule Ex_I[of _ _ _ "\A\"]; auto?) apply (rule Mem_SUCC_E[OF Mem_Zero_E]) apply (rule Mem_Eats_I2) apply (rule HPair_cong[OF Assume Refl]) apply (rule Disj_I1) apply (unfold AxiomP_def; simp) apply (rule Disj_I2[OF Disj_I1]) apply (auto elim!: SentP_I[THEN thin0]) done next case (Eq A) obtain l::name and sl::name and m::name and n::name and sm::name and sn::name and x::name and y::name and z::name where atoms: "atom l \ (x,y,z,sl,m,n,sm,sn)" "atom sl \ (x,y,z,m,n,sm,sn)" "atom m \ (x,y,z,n,sm,sn)" "atom n \ (x,y,z,sm,sn)" "atom sm \ (x,y,z,sn)" "atom sn \ (x,y,z)" "atom z \ (x,y)" "atom y \ x" by (metis obtain_fresh) with Eq show ?case apply (intro PfP_Single_I[of A]) apply (subst PrfP.simps[of l _ sl m n sm sn]; auto?) - apply (rule Ex_I[of _ _ _ "\A\"]; auto?) + apply (rule Ex_I[of _ _ _ "\A\"]; auto?) apply (rule Mem_SUCC_E[OF Mem_Zero_E]) apply (rule Mem_Eats_I2) apply (rule HPair_cong[OF Assume Refl]) apply (rule Disj_I1) apply (unfold AxiomP_def; simp) apply (rule Disj_I2[OF Disj_I2[OF Disj_I1]]) apply (auto simp: equality_axioms_def intro: Disj_I1 Disj_I2[OF Disj_I1] Disj_I2[OF Disj_I2[OF Disj_I1]] Disj_I2[OF Disj_I2[OF Disj_I2]]) done next case (Spec A) obtain l::name and sl::name and m::name and n::name and sm::name and sn::name and x::name and y::name and z::name where atoms: "atom l \ (x,y,z,sl,m,n,sm,sn)" "atom sl \ (x,y,z,m,n,sm,sn)" "atom m \ (x,y,z,n,sm,sn)" "atom n \ (x,y,z,sm,sn)" "atom sm \ (x,y,z,sn)" "atom sn \ (x,y,z)" "atom z \ (x,y)" "atom y \ x" by (metis obtain_fresh) let ?vs = "(x,y,z,l,sl,m,n,sm,sn)" from Spec atoms show ?case apply (intro PfP_Single_I[of A]) apply (subst PrfP.simps[of l _ sl m n sm sn]; auto?) - apply (rule Ex_I[of _ _ _ "\A\"]; auto?) + apply (rule Ex_I[of _ _ _ "\A\"]; auto?) apply (rule Mem_SUCC_E[OF Mem_Zero_E]) apply (rule Mem_Eats_I2) apply (rule HPair_cong[OF Assume Refl]) apply (rule Disj_I1) apply (unfold AxiomP_def; simp) apply (rule Disj_I2[OF Disj_I2[OF Disj_I2[OF Disj_I2[OF Disj_I1]]]]) subgoal premises prems using prems proof (cases A rule: special_axioms.cases) case (I X i t) let ?vs' = "(?vs, X, i, t)" obtain AA XX ii tt res :: name where atoms: "atom AA \ (?vs', res, tt, ii, XX)" "atom XX \ (?vs', res, tt, ii)" "atom ii \ (?vs', res, tt)" "atom tt \ (?vs', res)" "atom res \ ?vs'" by (metis obtain_fresh) with I show ?thesis apply (subst Special_axP.simps[of ii _ res tt AA XX]; simp?) - apply (rule Ex_I[of _ _ _ "\Var i\"]; auto?) - apply (rule Ex_I[of _ _ _ "\X\"]; auto?) + apply (rule Ex_I[of _ _ _ "\Var i\"]; auto?) + apply (rule Ex_I[of _ _ _ "\X\"]; auto?) apply (rule Ex_I[of _ _ _ "quot_dbfm (trans_fm [i] X)"]; auto?) - apply (rule Ex_I[of _ _ _ "\t\"]; auto?) - apply (rule Ex_I[of _ _ _ "\X(i::=t)\"]; auto?) + apply (rule Ex_I[of _ _ _ "\t\"]; auto?) + apply (rule Ex_I[of _ _ _ "\X(i::=t)\"]; auto?) apply (auto simp: TermP_quot[THEN thin0] FormP_quot[THEN thin0] SubstFormP[THEN thin0] AbstFormP[THEN thin0] quot_Ex quot_Disj quot_Neg vquot_fm_def) done qed done next case (HF A) obtain l::name and sl::name and m::name and n::name and sm::name and sn::name and x::name and y::name and z::name where atoms: "atom l \ (x,y,z,sl,m,n,sm,sn)" "atom sl \ (x,y,z,m,n,sm,sn)" "atom m \ (x,y,z,n,sm,sn)" "atom n \ (x,y,z,sm,sn)" "atom sm \ (x,y,z,sn)" "atom sn \ (x,y,z)" "atom z \ (x,y)" "atom y \ x" by (metis obtain_fresh) with HF show ?case apply (intro PfP_Single_I[of A]) apply (subst PrfP.simps[of l _ sl m n sm sn]; auto?) - apply (rule Ex_I[of _ _ _ "\A\"]; auto?) + apply (rule Ex_I[of _ _ _ "\A\"]; auto?) apply (rule Mem_SUCC_E[OF Mem_Zero_E]) apply (rule Mem_Eats_I2) apply (rule HPair_cong[OF Assume Refl]) apply (rule Disj_I1) apply (unfold AxiomP_def; simp) apply (rule Disj_I2[OF Disj_I2[OF Disj_I2[OF Disj_I1]]]) apply (auto simp: HF_axioms_def intro: Disj_I1 Disj_I2) done next case (Ind A) obtain l::name and sl::name and m::name and n::name and sm::name and sn::name and x::name and y::name and z::name where atoms: "atom l \ (x,y,z,sl,m,n,sm,sn)" "atom sl \ (x,y,z,m,n,sm,sn)" "atom m \ (x,y,z,n,sm,sn)" "atom n \ (x,y,z,sm,sn)" "atom sm \ (x,y,z,sn)" "atom sn \ (x,y,z)" "atom z \ (x,y)" "atom y \ x" by (metis obtain_fresh) let ?vs = "(x,y,z,l,sl,m,n,sm,sn)" from Ind atoms show ?case apply (intro PfP_Single_I[of A]) apply (subst PrfP.simps[of l _ sl m n sm sn]; auto?) - apply (rule Ex_I[of _ _ _ "\A\"]; auto?) + apply (rule Ex_I[of _ _ _ "\A\"]; auto?) apply (rule Mem_SUCC_E[OF Mem_Zero_E]) apply (rule Mem_Eats_I2) apply (rule HPair_cong[OF Assume Refl]) apply (rule Disj_I1) apply (unfold AxiomP_def; simp) apply (rule Disj_I2[OF Disj_I2[OF Disj_I2[OF Disj_I2[OF Disj_I2]]]]) subgoal premises prems using prems proof (cases A rule: induction_axioms.cases) case (ind j i X) let ?vs' = "(?vs, X, i, j)" obtain ax allvw allw xevw xw x0 xa w v :: name where atoms: "atom ax \ (?vs', v, w, xa, x0, xw, xevw, allw, allvw)" "atom allvw \ (?vs', v, w, xa, x0, xw, xevw, allw)" "atom allw \ (?vs', v, w, xa, x0, xw, xevw)" "atom xevw \ (?vs', v, w, xa, x0, xw)" "atom xw \ (?vs', v, w, xa, x0)" "atom x0 \ (?vs', v, w, xa)" "atom xa \ (?vs', v, w)" "atom w \ (?vs', v)" "atom v \ (?vs')" by (metis obtain_fresh) with ind(2) show ?thesis unfolding ind(1) apply (subst Induction_axP.simps[of ax _ allvw allw xevw xw x0 xa w v]) apply simp_all - apply (rule Ex_I[of _ _ _ "\Var i\"]; auto?) - apply (rule Ex_I[of _ _ _ "\Var j\"]; auto?) - apply (rule Ex_I[of _ _ _ "\X\"]; auto?) - apply (rule Ex_I[of _ _ _ "\X(i::=Zero)\"]; auto?) - apply (rule Ex_I[of _ _ _ "\X(i::=Var j)\"]; auto?) - apply (rule Ex_I[of _ _ _ "\X(i::=Eats (Var i) (Var j))\"]; auto?) + apply (rule Ex_I[of _ _ _ "\Var i\"]; auto?) + apply (rule Ex_I[of _ _ _ "\Var j\"]; auto?) + apply (rule Ex_I[of _ _ _ "\X\"]; auto?) + apply (rule Ex_I[of _ _ _ "\X(i::=Zero)\"]; auto?) + apply (rule Ex_I[of _ _ _ "\X(i::=Var j)\"]; auto?) + apply (rule Ex_I[of _ _ _ "\X(i::=Eats (Var i) (Var j))\"]; auto?) apply (rule Ex_I[of _ _ _ "quot_dbfm (trans_fm [j] (X IMP (X(i::= Var j) IMP X(i::= Eats(Var i)(Var j)))))"]; auto?) apply (rule Ex_I[of _ _ _ "Q_All (quot_dbfm (trans_fm [j,i] (X IMP (X(i::= Var j) IMP X(i::= Eats(Var i)(Var j))))))"]; auto?) apply (rule Ex_I[of _ _ _ "quot_dbfm (trans_fm [i] X)"]; auto?) subgoal apply (rule thin0) apply (rule OrdNotEqP_I) apply (auto simp: quot_Var ORD_OF_EQ_diff intro!: OrdP_SUCC_I0[THEN cut1]) done subgoal by (auto simp: VarNonOccFormP.simps FormP_quot[THEN thin0] SubstFormP_trivial[THEN thin0]) subgoal by (rule SubstFormP_Zero[THEN thin0]) subgoal by (rule SubstFormP[THEN thin0]) subgoal unfolding quot_Eats[symmetric] One_nat_def[symmetric] by (rule SubstFormP[THEN thin0]) subgoal unfolding quot_simps[symmetric] quot_dbfm.simps[symmetric] trans_fm.simps[symmetric] by (rule AbstFormP[THEN thin0]) subgoal by (auto simp only: quot_simps[symmetric] quot_dbfm.simps[symmetric] trans_fm.simps[symmetric] fresh_Cons fresh_Nil fresh_Pair trans_fm.simps(5)[symmetric, of j "[]"] quot_fm_def[symmetric] intro!: AbstFormP[THEN thin0]) subgoal unfolding quot_simps[symmetric] quot_dbfm.simps[symmetric] trans_fm.simps[symmetric] by (rule AbstFormP[THEN thin0]) subgoal by (auto simp: quot_simps trans_fm.simps(5)[of j "[i]"] fresh_Cons fresh_Pair) done qed done next case (MP H A B H') then show ?case by (auto elim!: PfP_implies_ModPon_PfP_quot) next case (Exists A B i) obtain a x y z::name where atoms: "atom a \ (i,x,y,z)" "atom z \ (i,x,y)" "atom y \ (i,x)" "atom x \ i" by (metis obtain_fresh) with Exists show ?case apply (auto elim!: PfP_inference [THEN cut3] intro!: PfP_extra Disj_I2[OF Disj_I1]) apply (subst ExistsP.simps[of x _ _ a y z]; (auto simp: VarNonOccFormP.simps)?) - apply (rule Ex_I[of _ _ _ "\A\"]; auto?) + apply (rule Ex_I[of _ _ _ "\A\"]; auto?) apply (rule Ex_I[of _ _ _ "quot_dbfm (trans_fm [i] A)"]; auto?) - apply (rule Ex_I[of _ _ _ "\B\"]; auto?) - apply (rule Ex_I[of _ _ _ "\Var i\"]; auto?) + apply (rule Ex_I[of _ _ _ "\B\"]; auto?) + apply (rule Ex_I[of _ _ _ "\Var i\"]; auto?) apply (auto simp: FormP_quot quot_Disj quot_Neg quot_Ex SubstFormP_trivial AbstFormP) done qed end diff --git a/thys/Goedel_HFSet_Semanticless/Pf_Predicates.thy b/thys/Goedel_HFSet_Semanticless/Pf_Predicates.thy --- a/thys/Goedel_HFSet_Semanticless/Pf_Predicates.thy +++ b/thys/Goedel_HFSet_Semanticless/Pf_Predicates.thy @@ -1,331 +1,331 @@ chapter\Formalizing Provability\ theory Pf_Predicates imports Coding_Predicates begin section \Section 4 Predicates (Leading up to Pf)\ subsection \The predicate \SentP\, for the Sentiential (Boolean) Axioms\ nominal_function SentP :: "tm \ fm" where "\atom y \ (z,w,x); atom z \ (w,x); atom w \ x\ \ SentP x = Ex y (Ex z (Ex w (FormP (Var y) AND FormP (Var z) AND FormP (Var w) AND ( (x EQ Q_Imp (Var y) (Var y)) OR (x EQ Q_Imp (Var y) (Q_Disj (Var y) (Var z)) OR (x EQ Q_Imp (Q_Disj (Var y) (Var y)) (Var y)) OR (x EQ Q_Imp (Q_Disj (Var y) (Q_Disj (Var z) (Var w))) (Q_Disj (Q_Disj (Var y) (Var z)) (Var w))) OR (x EQ Q_Imp (Q_Disj (Var y) (Var z)) (Q_Imp (Q_Disj (Q_Neg (Var y)) (Var w)) (Q_Disj (Var z) (Var w)))))))))" by (auto simp: eqvt_def SentP_graph_aux_def flip_fresh_fresh) (metis obtain_fresh) nominal_termination (eqvt) by lexicographic_order lemma shows SentP_fresh_iff [simp]: "a \ SentP x \ a \ x" (is ?thesis1) and SentP_sf [iff]: "Sigma_fm (SentP x)" (is ?thsf) proof - obtain y::name and z::name and w::name where "atom y \ (z,w,x)" "atom z \ (w,x)" "atom w \ x" by (metis obtain_fresh) thus ?thesis1 ?thsf by auto qed subsection \The predicate \Equality_axP\, for the Equality Axioms\ function Equality_axP :: "tm \ fm" where "Equality_axP x = - x EQ \refl_ax\ OR x EQ \eq_cong_ax\ OR x EQ \mem_cong_ax\ OR x EQ \eats_cong_ax\" + x EQ \refl_ax\ OR x EQ \eq_cong_ax\ OR x EQ \mem_cong_ax\ OR x EQ \eats_cong_ax\" by auto termination by lexicographic_order subsection \The predicate \HF_axP\, for the HF Axioms\ function HF_axP :: "tm \ fm" - where "HF_axP x = x EQ \HF1\ OR x EQ \HF2\" + where "HF_axP x = x EQ \HF1\ OR x EQ \HF2\" by auto termination by lexicographic_order lemma HF_axP_sf [iff]: "Sigma_fm (HF_axP t)" by auto subsection \The specialisation axioms\ subsubsection \Defining the syntax\ nominal_function Special_axP :: "tm \ fm" where "\atom v \ (p,sx,y,ax,x); atom x \ (p,sx,y,ax); atom ax \ (p,sx,y); atom y \ (p,sx); atom sx \ p\ \ Special_axP p = Ex v (Ex x (Ex ax (Ex y (Ex sx (FormP (Var x) AND VarP (Var v) AND TermP (Var y) AND AbstFormP (Var v) Zero (Var x) (Var ax) AND SubstFormP (Var v) (Var y) (Var x) (Var sx) AND p EQ Q_Imp (Var sx) (Q_Ex (Var ax)))))))" by (auto simp: eqvt_def Special_axP_graph_aux_def flip_fresh_fresh) (metis obtain_fresh) nominal_termination (eqvt) by lexicographic_order lemma shows Special_axP_fresh_iff [simp]: "a \ Special_axP p \ a \ p" (is ?thesis1) and Special_axP_sf [iff]: "Sigma_fm (Special_axP p)" (is ?thesis3) proof - obtain v::name and x::name and ax::name and y::name and sx::name where "atom v \ (p,sx,y,ax,x)" "atom x \ (p,sx,y,ax)" "atom ax \ (p,sx,y)" "atom y \ (p,sx)" "atom sx \ p" by (metis obtain_fresh) thus ?thesis1 ?thesis3 by auto qed subsection \The induction axioms\ subsubsection \Defining the syntax\ nominal_function Induction_axP :: "tm \ fm" where "\atom ax \ (p,v,w,x,x0,xw,xevw,allw,allvw); atom allvw \ (p,v,w,x,x0,xw,xevw,allw); atom allw \ (p,v,w,x,x0,xw,xevw); atom xevw \ (p,v,w,x,x0,xw); atom xw \ (p,v,w,x,x0); atom x0 \ (p,v,w,x); atom x \ (p,v,w); atom w \ (p,v); atom v \ p\ \ Induction_axP p = Ex v (Ex w (Ex x (Ex x0 (Ex xw (Ex xevw (Ex allw (Ex allvw (Ex ax ((Var v NEQ Var w) AND VarNonOccFormP (Var w) (Var x) AND SubstFormP (Var v) Zero (Var x) (Var x0) AND SubstFormP (Var v) (Var w) (Var x) (Var xw) AND SubstFormP (Var v) (Q_Eats (Var v) (Var w)) (Var x) (Var xevw) AND AbstFormP (Var w) Zero (Q_Imp (Var x) (Q_Imp (Var xw) (Var xevw))) (Var allw) AND AbstFormP (Var v) Zero (Q_All (Var allw)) (Var allvw) AND AbstFormP (Var v) Zero (Var x) (Var ax) AND p EQ Q_Imp (Var x0) (Q_Imp (Q_All (Var allvw)) (Q_All (Var ax))))))))))))" by (auto simp: eqvt_def Induction_axP_graph_aux_def flip_fresh_fresh) (metis obtain_fresh) nominal_termination (eqvt) by lexicographic_order lemma shows Induction_axP_fresh_iff [simp]: "a \ Induction_axP p \ a \ p" (is ?thesis1) and Induction_axP_sf [iff]: "Sigma_fm (Induction_axP p)" (is ?thesis3) proof - obtain v::name and w::name and x::name and x0::name and xw::name and xevw::name and allw::name and allvw::name and ax::name where atoms: "atom ax \ (p,v,w,x,x0,xw,xevw,allw,allvw)" "atom allvw \ (p,v,w,x,x0,xw,xevw,allw)" "atom allw \ (p,v,w,x,x0,xw,xevw)" "atom xevw \ (p,v,w,x,x0,xw)" "atom xw \ (p,v,w,x,x0)" "atom x0 \ (p,v,w,x)" "atom x \ (p,v,w)" "atom w \ (p,v)" "atom v \ p" by (metis obtain_fresh) thus ?thesis1 ?thesis3 by auto qed subsection \The predicate \AxiomP\, for any Axioms\ definition AxiomP :: "tm \ fm" - where "AxiomP x \ x EQ \extra_axiom\ OR SentP x OR Equality_axP x OR + where "AxiomP x \ x EQ \extra_axiom\ OR SentP x OR Equality_axP x OR HF_axP x OR Special_axP x OR Induction_axP x" lemma AxiomP_I: - "{} \ AxiomP \extra_axiom\" + "{} \ AxiomP \extra_axiom\" "{} \ SentP x \ {} \ AxiomP x" "{} \ Equality_axP x \ {} \ AxiomP x" "{} \ HF_axP x \ {} \ AxiomP x" "{} \ Special_axP x \ {} \ AxiomP x" "{} \ Induction_axP x \ {} \ AxiomP x" unfolding AxiomP_def by (rule Disj_I1, rule Refl, rule Disj_I2, rule Disj_I1, assumption, rule Disj_I2, rule Disj_I2, rule Disj_I1, assumption, rule Disj_I2, rule Disj_I2, rule Disj_I2, rule Disj_I1, assumption, rule Disj_I2, rule Disj_I2, rule Disj_I2, rule Disj_I2, rule Disj_I1, assumption, rule Disj_I2, rule Disj_I2, rule Disj_I2, rule Disj_I2, rule Disj_I2, assumption) lemma AxiomP_eqvt [eqvt]: "(p \ AxiomP x) = AxiomP (p \ x)" by (simp add: AxiomP_def) lemma AxiomP_fresh_iff [simp]: "a \ AxiomP x \ a \ x" by (auto simp: AxiomP_def) lemma AxiomP_sf [iff]: "Sigma_fm (AxiomP t)" by (auto simp: AxiomP_def) subsection \The predicate \ModPonP\, for the inference rule Modus Ponens\ definition ModPonP :: "tm \ tm \ tm \ fm" where "ModPonP x y z = (y EQ Q_Imp x z)" lemma ModPonP_eqvt [eqvt]: "(p \ ModPonP x y z) = ModPonP (p \ x) (p \ y) (p \ z)" by (simp add: ModPonP_def) lemma ModPonP_fresh_iff [simp]: "a \ ModPonP x y z \ a \ x \ a \ y \ a \ z" by (auto simp: ModPonP_def) lemma ModPonP_sf [iff]: "Sigma_fm (ModPonP t u v)" by (auto simp: ModPonP_def) lemma ModPonP_subst [simp]: "(ModPonP t u v)(i::=w) = ModPonP (subst i w t) (subst i w u) (subst i w v)" by (auto simp: ModPonP_def) subsection \The predicate \ExistsP\, for the existential rule\ subsubsection \Definition\ (* "\ A IMP B \ atom i \ B \ \ (Ex i A) IMP B" *) nominal_function ExistsP :: "tm \ tm \ fm" where "\atom x \ (p,q,v,y,x'); atom x' \ (p,q,v,y); atom y \ (p,q,v); atom v \ (p,q)\ \ ExistsP p q = Ex x (Ex x' (Ex y (Ex v (FormP (Var x) AND VarNonOccFormP (Var v) (Var y) AND AbstFormP (Var v) Zero (Var x) (Var x') AND p EQ Q_Imp (Var x) (Var y) AND q EQ Q_Imp (Q_Ex (Var x')) (Var y)))))" by (auto simp: eqvt_def ExistsP_graph_aux_def flip_fresh_fresh) (metis obtain_fresh) nominal_termination (eqvt) by lexicographic_order lemma shows ExistsP_fresh_iff [simp]: "a \ ExistsP p q \ a \ p \ a \ q" (is ?thesis1) and ExistsP_sf [iff]: "Sigma_fm (ExistsP p q)" (is ?thesis3) proof - obtain x::name and x'::name and y::name and v::name where "atom x \ (p,q,v,y,x')" "atom x' \ (p,q,v,y)" "atom y \ (p,q,v)" "atom v \ (p,q)" by (metis obtain_fresh) thus ?thesis1 ?thesis3 by auto qed lemma ExistsP_subst [simp]: "(ExistsP p q)(j::=w) = ExistsP (subst j w p) (subst j w q)" proof - obtain x::name and x'::name and y::name and v::name where "atom x \ (j,w,p,q,v,y,x')" "atom x' \ (j,w,p,q,v,y)" "atom y \ (j,w,p,q,v)" "atom v \ (j,w,p,q)" by (metis obtain_fresh) thus ?thesis by (auto simp: ExistsP.simps [of x _ _ x' y v]) qed subsection \The predicate \SubstP\, for the substitution rule\ text\Although the substitution rule is derivable in the calculus, the derivation is too complicated to reproduce within the proof function. It is much easier to provide it as an immediate inference step, justifying its soundness in terms of other inference rules.\ subsubsection \Definition\ nominal_function SubstP :: "tm \ tm \ fm" where "\atom u \ (p,q,v); atom v \ (p,q)\ \ SubstP p q = Ex v (Ex u (SubstFormP (Var v) (Var u) p q))" by (auto simp: eqvt_def SubstP_graph_aux_def flip_fresh_fresh) (metis obtain_fresh) nominal_termination (eqvt) by lexicographic_order lemma shows SubstP_fresh_iff [simp]: "a \ SubstP p q \ a \ p \ a \ q" (is ?thesis1) and SubstP_sf [iff]: "Sigma_fm (SubstP p q)" (is ?thesis3) proof - obtain u::name and v::name where "atom u \ (p,q,v)" "atom v \ (p,q)" by (metis obtain_fresh) thus ?thesis1 ?thesis3 by auto qed lemma SubstP_subst [simp]: "(SubstP p q)(j::=w) = SubstP (subst j w p) (subst j w q)" proof - obtain u::name and v::name where "atom u \ (j,w,p,q,v)" "atom v \ (j,w,p,q)" by (metis obtain_fresh) thus ?thesis by (simp add: SubstP.simps [of u _ _ v]) qed subsection \The predicate \PrfP\\ (*Prf(s,k,t) \ LstSeq(s,k,t) \ (\n\k)[Sent (s n) \ (\m,l\n)[ModPon (s m) (s l) (s n)]]*) nominal_function PrfP :: "tm \ tm \ tm \ fm" where "\atom l \ (s,sl,m,n,sm,sn); atom sl \ (s,m,n,sm,sn); atom m \ (s,n,sm,sn); atom n \ (s,k,sm,sn); atom sm \ (s,sn); atom sn \ (s)\ \ PrfP s k t = LstSeqP s k t AND All2 n (SUCC k) (Ex sn (HPair (Var n) (Var sn) IN s AND (AxiomP (Var sn) OR Ex m (Ex l (Ex sm (Ex sl (Var m IN Var n AND Var l IN Var n AND HPair (Var m) (Var sm) IN s AND HPair (Var l) (Var sl) IN s AND (ModPonP (Var sm) (Var sl) (Var sn) OR ExistsP (Var sm) (Var sn) OR SubstP (Var sm) (Var sn)))))))))" by (auto simp: eqvt_def PrfP_graph_aux_def flip_fresh_fresh) (metis obtain_fresh) nominal_termination (eqvt) by lexicographic_order lemma shows PrfP_fresh_iff [simp]: "a \ PrfP s k t \ a \ s \ a \ k \ a \ t" (is ?thesis1) and PrfP_imp_OrdP [simp]: "{PrfP s k t} \ OrdP k" (is ?thord) and PrfP_imp_LstSeqP [simp]: "{PrfP s k t} \ LstSeqP s k t" (is ?thlstseq) and PrfP_sf [iff]: "Sigma_fm (PrfP s k t)" (is ?thsf) proof - obtain l::name and sl::name and m::name and n::name and sm::name and sn::name where atoms: "atom l \ (s,sl,m,n,sm,sn)" "atom sl \ (s,m,n,sm,sn)" "atom m \ (s,n,sm,sn)" "atom n \ (s,k,sm,sn)" "atom sm \ (s,sn)" "atom sn \ (s)" by (metis obtain_fresh) thus ?thesis1 ?thord ?thlstseq ?thsf by (auto intro: LstSeqP_OrdP) qed lemma PrfP_subst [simp]: "(PrfP t u v)(j::=w) = PrfP (subst j w t) (subst j w u) (subst j w v)" proof - obtain l::name and sl::name and m::name and n::name and sm::name and sn::name where "atom l \ (t,u,v,j,w,sl,m,n,sm,sn)" "atom sl \ (t,u,v,j,w,m,n,sm,sn)" "atom m \ (t,u,v,j,w,n,sm,sn)" "atom n \ (t,u,v,j,w,sm,sn)" "atom sm \ (t,u,v,j,w,sn)" "atom sn \ (t,u,v,j,w)" by (metis obtain_fresh) thus ?thesis by (simp add: PrfP.simps [of l _ sl m n sm sn]) qed subsection \The predicate \PfP\\ nominal_function PfP :: "tm \ fm" where "\atom k \ (s,y); atom s \ y\ \ PfP y = Ex k (Ex s (PrfP (Var s) (Var k) y))" by (auto simp: eqvt_def PfP_graph_aux_def flip_fresh_fresh) (metis obtain_fresh) nominal_termination (eqvt) by lexicographic_order lemma shows PfP_fresh_iff [simp]: "a \ PfP y \ a \ y" (is ?thesis1) and PfP_sf [iff]: "Sigma_fm (PfP y)" (is ?thsf) proof - obtain k::name and s::name where "atom k \ (s,y)" "atom s \ y" by (metis obtain_fresh) thus ?thesis1 ?thsf by auto qed lemma PfP_subst [simp]: "(PfP t)(j::=w) = PfP (subst j w t)" proof - obtain k::name and s::name where "atom k \ (s,t,j,w)" "atom s \ (t,j,w)" by (metis obtain_fresh) thus ?thesis by (auto simp: PfP.simps [of k s]) qed lemma ground_PfP [simp]: "ground_fm (PfP y) = ground y" by (simp add: ground_aux_def ground_fm_aux_def supp_conv_fresh) end diff --git a/thys/Goedel_HFSet_Semanticless/Pseudo_Coding.thy b/thys/Goedel_HFSet_Semanticless/Pseudo_Coding.thy --- a/thys/Goedel_HFSet_Semanticless/Pseudo_Coding.thy +++ b/thys/Goedel_HFSet_Semanticless/Pseudo_Coding.thy @@ -1,328 +1,328 @@ chapter\Pseudo-Coding: Section 7 Material\ theory Pseudo_Coding imports II_Prelims begin section\General Lemmas\ lemma Collect_disj_Un: "{f i |i. P i \ Q i} = {f i |i. P i} \ {f i |i. Q i}" by auto abbreviation Q_Subset :: "tm \ tm \ tm" where "Q_Subset t u \ (Q_All (Q_Imp (Q_Mem (Q_Ind Zero) t) (Q_Mem (Q_Ind Zero) u)))" -lemma NEQ_quot_tm: "i\j \ {} \ \Var i\ NEQ \Var j\" +lemma NEQ_quot_tm: "i\j \ {} \ \Var i\ NEQ \Var j\" using VarP_Var[of "{}" i] VarP_Var[of "{}" j] by (intro OrdNotEqP_I) (auto simp: VarP_def quot_Var ORD_OF_EQ_diff dest!: Conj_E1) -lemma EQ_quot_tm_Fls: "i\j \ insert (\Var i\ EQ \Var j\) H \ Fls" +lemma EQ_quot_tm_Fls: "i\j \ insert (\Var i\ EQ \Var j\) H \ Fls" by (metis (full_types) NEQ_quot_tm Assume OrdNotEqP_E cut2 thin0) lemma perm_commute: "a \ p \ a' \ p \ (a \ a') + p = p + (a \ a')" by (rule plus_perm_eq) (simp add: supp_swap fresh_def) lemma perm_self_inverseI: "\-p = q; a \ p; a' \ p\ \ - ((a \ a') + p) = (a \ a') + q" by (simp_all add: perm_commute fresh_plus_perm minus_add) lemma fresh_image: fixes f :: "'a \ 'b::fs" shows "finite A \ i \ f ` A \ (\x\A. i \ f x)" by (induct rule: finite_induct) (auto simp: fresh_finite_insert) lemma atom_in_atom_image [simp]: "atom j \ atom ` V \ j \ V" by auto lemma fresh_star_empty [simp]: "{} \* bs" by (simp add: fresh_star_def) declare fresh_star_insert [simp] lemma fresh_star_finite_insert: fixes S :: "('a::fs) set" shows "finite S \ a \* insert x S \ a \* x \ a \* S" by (auto simp: fresh_star_def fresh_finite_insert) lemma fresh_finite_Diff_single [simp]: fixes V :: "name set" shows "finite V \ a \ (V - {j}) \ (a \ j \ a \ V)" apply (auto simp: fresh_finite_insert) apply (metis finite_Diff fresh_finite_insert insert_Diff_single) apply (metis Diff_iff finite_Diff fresh_atom fresh_atom_at_base fresh_finite_set_at_base insertI1) apply (metis Diff_idemp Diff_insert_absorb finite_Diff fresh_finite_insert insert_Diff_single insert_absorb) done lemma fresh_image_atom [simp]: "finite A \ i \ atom ` A \ i \ A" by (induct rule: finite_induct) (auto simp: fresh_finite_insert) lemma atom_fresh_star_atom_set_conv: "\atom i \ bs; finite bs\ \ bs \* i" by (metis fresh_finite_atom_set fresh_ineq_at_base fresh_star_def) lemma notin_V: assumes p: "atom i \ p" and V: "finite V" "atom ` (p \ V) \* V" shows "i \ V" "i \ p \ V" using V apply (auto simp: fresh_def fresh_star_def supp_finite_set_at_base) apply (metis p mem_permute_iff fresh_at_base_permI)+ done section\Simultaneous Substitution\ definition ssubst :: "tm \ name set \ (name \ tm) \ tm" where "ssubst t V F = Finite_Set.fold (\i. subst i (F i)) t V" definition make_F :: "name set \ perm \ name \ tm" where "make_F Vs p \ \i. if i \ Vs then Var (p \ i) else Var i" lemma ssubst_empty [simp]: "ssubst t {} F = t" by (simp add: ssubst_def) text\Renaming a finite set of variables. Based on the theorem \at_set_avoiding\\ locale quote_perm = fixes p :: perm and Vs :: "name set" and F :: "name \ tm" assumes p: "atom ` (p \ Vs) \* Vs" and pinv: "-p = p" and Vs: "finite Vs" defines "F \ make_F Vs p" begin lemma F_unfold: "F i = (if i \ Vs then Var (p \ i) else Var i)" by (simp add: F_def make_F_def) lemma finite_V [simp]: "V \ Vs \ finite V" by (metis Vs finite_subset) lemma perm_exits_Vs: "i \ Vs \ (p \ i) \ Vs" by (metis Vs fresh_finite_set_at_base imageI fresh_star_def mem_permute_iff p) lemma atom_fresh_perm: "\x \ Vs; y \ Vs\ \ atom x \ p \ y" by (metis imageI Vs p fresh_finite_set_at_base fresh_star_def mem_permute_iff fresh_at_base(2)) lemma fresh_pj: "\a \ p; j \ Vs\ \ a \ p \ j" by (metis atom_fresh_perm fresh_at_base(2) fresh_perm fresh_permute_left pinv) lemma fresh_Vs: "a \ p \ a \ Vs" by (metis Vs fresh_def fresh_perm fresh_permute_iff fresh_star_def p permute_finite supp_finite_set_at_base) lemma fresh_pVs: "a \ p \ a \ p \ Vs" by (metis fresh_Vs fresh_perm fresh_permute_left pinv) lemma assumes "V \ Vs" "a \ p" shows fresh_pV [simp]: "a \ p \ V" and fresh_V [simp]: "a \ V" using fresh_pVs fresh_Vs assms apply (auto simp: fresh_def) apply (metis (full_types) Vs finite_V permute_finite set_mp subset_Un_eq supp_of_finite_union union_eqvt) by (metis Vs finite_V set_mp subset_Un_eq supp_of_finite_union) lemma qp_insert: fixes i::name and i'::name assumes "atom i \ p" "atom i' \ (i,p)" shows "quote_perm ((atom i \ atom i') + p) (insert i Vs)" using p pinv Vs assms by (auto simp: quote_perm_def fresh_at_base_permI atom_fresh_star_atom_set_conv swap_fresh_fresh fresh_star_finite_insert fresh_finite_insert perm_self_inverseI) lemma subst_F_left_commute: "subst x (F x) (subst y (F y) t) = subst y (F y) (subst x (F x) t)" by (metis subst_tm_commute2 F_unfold subst_tm_id F_unfold atom_fresh_perm tm.fresh(2)) lemma assumes "finite V" "i \ V" shows ssubst_insert: "ssubst t (insert i V) F = subst i (F i) (ssubst t V F)" (is ?thesis1) and ssubst_insert2: "ssubst t (insert i V) F = ssubst (subst i (F i) t) V F" (is ?thesis2) proof - interpret comp_fun_commute "(\i. subst i (F i))" proof qed (simp add: subst_F_left_commute fun_eq_iff) show ?thesis1 using assms Vs by (simp add: ssubst_def) show ?thesis2 using assms Vs by (simp add: ssubst_def fold_insert2 del: fold_insert) qed lemma ssubst_insert_if: "finite V \ ssubst t (insert i V) F = (if i \ V then ssubst t V F else subst i (F i) (ssubst t V F))" by (simp add: ssubst_insert insert_absorb) lemma ssubst_single [simp]: "ssubst t {i} F = subst i (F i) t" by (simp add: ssubst_insert) lemma ssubst_Var_if [simp]: assumes "finite V" shows "ssubst (Var i) V F = (if i \ V then F i else Var i)" using assms apply (induction V, auto) apply (metis ssubst_insert subst.simps(2)) apply (metis ssubst_insert2 subst.simps(2))+ done lemma ssubst_Zero [simp]: "finite V \ ssubst Zero V F = Zero" by (induct V rule: finite_induct) (auto simp: ssubst_insert) lemma ssubst_Eats [simp]: "finite V \ ssubst (Eats t u) V F = Eats (ssubst t V F) (ssubst u V F)" by (induct V rule: finite_induct) (auto simp: ssubst_insert) lemma ssubst_SUCC [simp]: "finite V \ ssubst (SUCC t) V F = SUCC (ssubst t V F)" by (metis SUCC_def ssubst_Eats) lemma ssubst_ORD_OF [simp]: "finite V \ ssubst (ORD_OF n) V F = ORD_OF n" by (induction n) auto lemma ssubst_HPair [simp]: "finite V \ ssubst (HPair t u) V F = HPair (ssubst t V F) (ssubst u V F)" by (simp add: HPair_def) lemma ssubst_HTuple [simp]: "finite V \ ssubst (HTuple n) V F = (HTuple n)" by (induction n) (auto simp: HTuple.simps) lemma ssubst_Subset: assumes "finite V" shows "ssubst \t SUBS u\V V F = Q_Subset (ssubst \t\V V F) (ssubst \u\V V F)" proof - obtain i::name where "atom i \ (t,u)" by (rule obtain_fresh) thus ?thesis using assms by (auto simp: Subset.simps [of i] vquot_fm_def vquot_tm_def trans_tm_forget) qed lemma fresh_ssubst: assumes "finite V" "a \ p \ V" "a \ t" shows "a \ ssubst t V F" using assms by (induct V) (auto simp: ssubst_insert_if fresh_finite_insert F_unfold intro: fresh_ineq_at_base) lemma fresh_ssubst': assumes "finite V" "atom i \ t" "atom (p \ i) \ t" shows "atom i \ ssubst t V F" using assms by (induct t rule: tm.induct) (auto simp: F_unfold fresh_permute_left pinv) lemma ssubst_vquot_Ex: "\finite V; atom i \ p \ V\ \ ssubst \Ex i A\(insert i V) (insert i V) F = ssubst \Ex i A\V V F" by (simp add: ssubst_insert_if insert_absorb vquot_fm_insert fresh_ssubst) lemma ground_ssubst_eq: "\finite V; supp t = {}\ \ ssubst t V F = t" by (induct V rule: finite_induct) (auto simp: ssubst_insert fresh_def) lemma ssubst_quot_tm [simp]: - fixes t::tm shows "finite V \ ssubst \t\ V F = \t\" + fixes t::tm shows "finite V \ ssubst \t\ V F = \t\" by (simp add: ground_ssubst_eq supp_conv_fresh) lemma ssubst_quot_fm [simp]: - fixes A::fm shows "finite V \ ssubst \A\ V F = \A\" + fixes A::fm shows "finite V \ ssubst \A\ V F = \A\" by (simp add: ground_ssubst_eq supp_conv_fresh) lemma atom_in_p_Vs: "\i \ p \ V; V \ Vs\ \ i \ p \ Vs" by (metis (full_types) True_eqvt set_mp subset_eqvt) section\The Main Theorems of Section 7\ lemma SubstTermP_vquot_dbtm: assumes w: "w \ Vs - V" and V: "V \ Vs" "V' = p \ V" and s: "supp dbtm \ atom ` Vs" shows "insert (ConstP (F w)) {ConstP (F i) | i. i \ V} - \ SubstTermP \Var w\ (F w) + \ SubstTermP \Var w\ (F w) (ssubst (vquot_dbtm V dbtm) V F) (subst w (F w) (ssubst (vquot_dbtm (insert w V) dbtm) V F))" using s proof (induct dbtm rule: dbtm.induct) case DBZero thus ?case using V w by (auto intro: SubstTermP_Zero [THEN cut1] ConstP_imp_TermP [THEN cut1]) next case (DBInd n) thus ?case using V apply auto apply (rule thin [of "{ConstP (F w)}"]) apply (rule SubstTermP_Ind [THEN cut3]) apply (auto simp: IndP_Q_Ind OrdP_ORD_OF ConstP_imp_TermP) done next case (DBVar i) show ?case proof (cases "i \ V'") case True hence "i \ Vs" using assms by (metis p Vs atom_in_atom_image atom_in_p_Vs fresh_finite_set_at_base fresh_star_def) thus ?thesis using DBVar True V by auto next case False thus ?thesis using DBVar V w apply (auto simp: quot_Var [symmetric]) apply (blast intro: thin [of "{ConstP (F w)}"] ConstP_imp_TermP SubstTermP_Var_same [THEN cut2]) apply (subst forget_subst_tm, metis F_unfold atom_fresh_perm tm.fresh(2)) apply (blast intro: Hyp thin [of "{ConstP (F w)}"] ConstP_imp_TermP SubstTermP_Const [THEN cut2]) apply (blast intro: Hyp thin [of "{ConstP (F w)}"] ConstP_imp_TermP EQ_quot_tm_Fls SubstTermP_Var_diff [THEN cut4]) done qed next case (DBEats tm1 tm2) thus ?case using V by (auto simp: SubstTermP_Eats [THEN cut2]) qed lemma SubstFormP_vquot_dbfm: assumes w: "w \ Vs - V" and V: "V \ Vs" "V' = p \ V" and s: "supp dbfm \ atom ` Vs" shows "insert (ConstP (F w)) {ConstP (F i) | i. i \ V} - \ SubstFormP \Var w\ (F w) + \ SubstFormP \Var w\ (F w) (ssubst (vquot_dbfm V dbfm) V F) (subst w (F w) (ssubst (vquot_dbfm (insert w V) dbfm) V F))" using w s proof (induct dbfm rule: dbfm.induct) case (DBMem t u) thus ?case using V by (auto intro: SubstTermP_vquot_dbtm SubstFormP_Mem [THEN cut2]) next case (DBEq t u) thus ?case using V by (auto intro: SubstTermP_vquot_dbtm SubstFormP_Eq [THEN cut2]) next case (DBDisj A B) thus ?case using V by (auto intro: SubstFormP_Disj [THEN cut2]) next case (DBNeg A) thus ?case using V by (auto intro: SubstFormP_Neg [THEN cut1]) next case (DBEx A) thus ?case using V by (auto intro: SubstFormP_Ex [THEN cut1]) qed text\Lemmas 7.5 and 7.6\ lemma ssubst_SubstFormP: fixes A::fm assumes w: "w \ Vs - V" and V: "V \ Vs" "V' = p \ V" and s: "supp A \ atom ` Vs" shows "insert (ConstP (F w)) {ConstP (F i) | i. i \ V} - \ SubstFormP \Var w\ (F w) + \ SubstFormP \Var w\ (F w) (ssubst \A\V V F) (ssubst \A\(insert w V) (insert w V) F)" proof - have "w \ V" using assms by auto thus ?thesis using assms by (simp add: vquot_fm_def supp_conv_fresh ssubst_insert_if SubstFormP_vquot_dbfm) qed text\Theorem 7.3\ theorem PfP_implies_PfP_ssubst: fixes \::fm - assumes \: "{} \ PfP \\\" + assumes \: "{} \ PfP \\\" and V: "V \ Vs" and s: "supp \ \ atom ` Vs" shows "{ConstP (F i) | i. i \ V} \ PfP (ssubst \\\V V F)" proof - show ?thesis using finite_V [OF V] V proof induction case empty thus ?case by (auto simp: \) next case (insert i V) thus ?case using assms by (auto simp: Collect_disj_Un fresh_finite_set_at_base intro: PfP_implies_SubstForm_PfP thin1 ssubst_SubstFormP) qed qed end end diff --git a/thys/Goedel_HFSet_Semanticless/Quote.thy b/thys/Goedel_HFSet_Semanticless/Quote.thy --- a/thys/Goedel_HFSet_Semanticless/Quote.thy +++ b/thys/Goedel_HFSet_Semanticless/Quote.thy @@ -1,1437 +1,1437 @@ chapter\Quotations of the Free Variables\ theory Quote imports Pseudo_Coding begin section \Sequence version of the ``Special p-Function, F*''\ text\The definition below describes a relation, not a function. This material relates to Section 8, but omits the ordering of the universe.\ subsection \Defining the syntax: quantified body\ nominal_function SeqQuoteP :: "tm \ tm \ tm \ tm \ fm" where "\atom l \ (s,k,sl,sl',m,n,sm,sm',sn,sn'); atom sl \ (s,sl',m,n,sm,sm',sn,sn'); atom sl' \ (s,m,n,sm,sm',sn,sn'); atom m \ (s,n,sm,sm',sn,sn'); atom n \ (s,sm,sm',sn,sn'); atom sm \ (s,sm',sn,sn'); atom sm' \ (s,sn,sn'); atom sn \ (s,sn'); atom sn' \ s\ \ SeqQuoteP t u s k = LstSeqP s k (HPair t u) AND All2 l (SUCC k) (Ex sl (Ex sl' (HPair (Var l) (HPair (Var sl) (Var sl')) IN s AND ((Var sl EQ Zero AND Var sl' EQ Zero) OR Ex m (Ex n (Ex sm (Ex sm' (Ex sn (Ex sn' (Var m IN Var l AND Var n IN Var l AND HPair (Var m) (HPair (Var sm) (Var sm')) IN s AND HPair (Var n) (HPair (Var sn) (Var sn')) IN s AND Var sl EQ Eats (Var sm) (Var sn) AND Var sl' EQ Q_Eats (Var sm') (Var sn')))))))))))" by (auto simp: eqvt_def SeqQuoteP_graph_aux_def flip_fresh_fresh) (metis obtain_fresh) nominal_termination (eqvt) by lexicographic_order lemma shows SeqQuoteP_fresh_iff [simp]: "a \ SeqQuoteP t u s k \ a \ t \ a \ u \ a \ s \ a \ k" (is ?thesis1) and SeqQuoteP_sf [iff]: "Sigma_fm (SeqQuoteP t u s k)" (is ?thsf) and SeqQuoteP_imp_OrdP: "{ SeqQuoteP t u s k } \ OrdP k" (is ?thord) and SeqQuoteP_imp_LstSeqP: "{ SeqQuoteP t u s k } \ LstSeqP s k (HPair t u)" (is ?thlstseq) proof - obtain l::name and sl::name and sl'::name and m::name and n::name and sm::name and sm'::name and sn::name and sn'::name where atoms: "atom l \ (s,k,sl,sl',m,n,sm,sm',sn,sn')" "atom sl \ (s,sl',m,n,sm,sm',sn,sn')" "atom sl' \ (s,m,n,sm,sm',sn,sn')" "atom m \ (s,n,sm,sm',sn,sn')" "atom n \ (s,sm,sm',sn,sn')" "atom sm \ (s,sm',sn,sn')" "atom sm' \ (s,sn,sn')" "atom sn \ (s,sn')" "atom sn' \ s" by (metis obtain_fresh) thus ?thesis1 ?thsf ?thord ?thlstseq by auto (auto simp: LstSeqP.simps) qed lemma SeqQuoteP_subst [simp]: "(SeqQuoteP t u s k)(j::=w) = SeqQuoteP (subst j w t) (subst j w u) (subst j w s) (subst j w k)" proof - obtain l::name and sl::name and sl'::name and m::name and n::name and sm::name and sm'::name and sn::name and sn'::name where "atom l \ (s,k,w,j,sl,sl',m,n,sm,sm',sn,sn')" "atom sl \ (s,w,j,sl',m,n,sm,sm',sn,sn')" "atom sl' \ (s,w,j,m,n,sm,sm',sn,sn')" "atom m \ (s,w,j,n,sm,sm',sn,sn')" "atom n \ (s,w,j,sm,sm',sn,sn')" "atom sm \ (s,w,j,sm',sn,sn')" "atom sm' \ (s,w,j,sn,sn')" "atom sn \ (s,w,j,sn')" "atom sn' \ (s,w,j)" by (metis obtain_fresh) thus ?thesis by (force simp add: SeqQuoteP.simps [of l _ _ sl sl' m n sm sm' sn sn']) qed declare SeqQuoteP.simps [simp del] subsection \Correctness properties\ lemma SeqQuoteP_lemma: fixes m::name and sm::name and sm'::name and n::name and sn::name and sn'::name assumes "atom m \ (t,u,s,k,n,sm,sm',sn,sn')" "atom n \ (t,u,s,k,sm,sm',sn,sn')" "atom sm \ (t,u,s,k,sm',sn,sn')" "atom sm' \ (t,u,s,k,sn,sn')" "atom sn \ (t,u,s,k,sn')" "atom sn' \ (t,u,s,k)" shows "{ SeqQuoteP t u s k } \ (t EQ Zero AND u EQ Zero) OR Ex m (Ex n (Ex sm (Ex sm' (Ex sn (Ex sn' (Var m IN k AND Var n IN k AND SeqQuoteP (Var sm) (Var sm') s (Var m) AND SeqQuoteP (Var sn) (Var sn') s (Var n) AND t EQ Eats (Var sm) (Var sn) AND u EQ Q_Eats (Var sm') (Var sn')))))))" proof - obtain l::name and sl::name and sl'::name where "atom l \ (t,u,s,k,sl,sl',m,n,sm,sm',sn,sn')" "atom sl \ (t,u,s,k,sl',m,n,sm,sm',sn,sn')" "atom sl' \ (t,u,s,k,m,n,sm,sm',sn,sn')" by (metis obtain_fresh) thus ?thesis using assms apply (simp add: SeqQuoteP.simps [of l s k sl sl' m n sm sm' sn sn']) apply (rule Conj_EH Ex_EH All2_SUCC_E [THEN rotate2] | simp)+ apply (rule cut_same [where A = "HPair t u EQ HPair (Var sl) (Var sl')"]) apply (metis Assume AssumeH(4) LstSeqP_EQ) apply clarify apply (rule Disj_EH) apply (rule Disj_I1) apply (rule anti_deduction) apply (rule Var_Eq_subst_Iff [THEN Sym_L, THEN Iff_MP_same]) apply (rule rotate2) apply (rule Var_Eq_subst_Iff [THEN Sym_L, THEN Iff_MP_same], force) \ \now the quantified case\ apply (rule Ex_EH Conj_EH)+ apply simp_all apply (rule Disj_I2) apply (rule Ex_I [where x = "Var m"], simp) apply (rule Ex_I [where x = "Var n"], simp) apply (rule Ex_I [where x = "Var sm"], simp) apply (rule Ex_I [where x = "Var sm'"], simp) apply (rule Ex_I [where x = "Var sn"], simp) apply (rule Ex_I [where x = "Var sn'"], simp) apply (simp_all add: SeqQuoteP.simps [of l s _ sl sl' m n sm sm' sn sn']) apply ((rule Conj_I)+, blast intro: LstSeqP_Mem)+ \ \first SeqQuoteP subgoal\ apply (rule All2_Subset [OF Hyp]) apply (blast intro!: SUCC_Subset_Ord LstSeqP_OrdP)+ apply simp \ \next SeqQuoteP subgoal\ apply ((rule Conj_I)+, blast intro: LstSeqP_Mem)+ apply (rule All2_Subset [OF Hyp], blast) apply (auto intro!: SUCC_Subset_Ord LstSeqP_OrdP intro: Trans) done qed section \The ``special function'' itself\ nominal_function QuoteP :: "tm \ tm \ fm" where "\atom s \ (t,u,k); atom k \ (t,u)\ \ QuoteP t u = Ex s (Ex k (SeqQuoteP t u (Var s) (Var k)))" by (auto simp: eqvt_def QuoteP_graph_aux_def flip_fresh_fresh) (metis obtain_fresh) nominal_termination (eqvt) by lexicographic_order lemma shows QuoteP_fresh_iff [simp]: "a \ QuoteP t u \ a \ t \ a \ u" (is ?thesis1) and QuoteP_sf [iff]: "Sigma_fm (QuoteP t u)" (is ?thsf) proof - obtain s::name and k::name where "atom s \ (t,u,k)" "atom k \ (t,u)" by (metis obtain_fresh) thus ?thesis1 ?thsf by auto qed lemma QuoteP_subst [simp]: "(QuoteP t u)(j::=w) = QuoteP (subst j w t) (subst j w u)" proof - obtain s::name and k::name where "atom s \ (t,u,w,j,k)" "atom k \ (t,u,w,j)" by (metis obtain_fresh) thus ?thesis by (simp add: QuoteP.simps [of s _ _ k]) qed declare QuoteP.simps [simp del] subsection \Correctness properties\ lemma QuoteP_Zero: "{} \ QuoteP Zero Zero" proof - obtain l :: "name" and sl :: "name" and sl' :: "name" and m :: "name" and n :: "name" and sm :: "name" and sm' :: "name" and sn :: "name" and sn' :: "name" and s :: "name" and k :: "name" where "atom l \ (s, k, sl, sl', m, n, sm, sm', sn, sn')" and "atom sl \ (s, k, sl', m, n, sm, sm', sn, sn')" and "atom sl' \ (s, k, m, n, sm, sm', sn, sn')" and "atom m \ (s, k, n, sm, sm', sn, sn')" and "atom n \ (s, k, sm, sm', sn, sn')" and "atom sm \ (s, k, sm', sn, sn')" and "atom sm' \ (s, k, sn, sn')" and "atom sn \ (s, k, sn')" and "atom sn' \ (s, k)" and "atom k \ s" by (metis obtain_fresh) then show ?thesis apply (subst QuoteP.simps[of s _ _ k]; simp) apply (rule Ex_I[of _ _ _ "Eats Zero (HPair Zero (HPair Zero Zero))"]; simp) apply (rule Ex_I[of _ _ _ "Zero"]; simp) apply (subst SeqQuoteP.simps[of l _ _ sl sl' m n sm sm' sn sn']; simp?) apply (rule Conj_I) apply (rule LstSeqP_single) apply (auto intro!: Ex_I[of _ _ _ Zero]) apply (rule Mem_SUCC_E[OF Mem_Zero_E]) apply (rule Mem_Eats_I2) apply (rule HPair_cong[OF Assume Refl]) apply (auto intro!: Disj_I1) done qed lemma SeqQuoteP_Eats: assumes "atom s \ (k,s1,s2,k1,k2,t1,t2,u1,u2)" "atom k \ (s1,s2,k1,k2,t1,t2,u1,u2)" shows "{SeqQuoteP t1 u1 s1 k1, SeqQuoteP t2 u2 s2 k2} \ Ex s (Ex k (SeqQuoteP (Eats t1 t2) (Q_Eats u1 u2) (Var s) (Var k)))" proof - obtain km::name and kn::name and j::name and k'::name and l::name and sl::name and sl'::name and m::name and n::name and sm::name and sm'::name and sn::name and sn'::name where atoms2: "atom km \ (kn,j,k',l,s1,s2,s,k1,k2,k,t1,t2,u1,u2,sl,sl',m,n,sm,sm',sn,sn')" "atom kn \ (j,k',l,s1,s2,s,k1,k2,k,t1,t2,u1,u2,sl,sl',m,n,sm,sm',sn,sn')" "atom j \ (k',l,s1,s2,s,k1,k2,k,t1,t2,u1,u2,sl,sl',m,n,sm,sm',sn,sn')" and atoms: "atom k' \ (l,s1,s2,s,k1,k2,k,t1,t2,u1,u2,sl,sl',m,n,sm,sm',sn,sn')" "atom l \ (s1,s2,s,k1,k2,k,t1,t2,u1,u2,sl,sl',m,n,sm,sm',sn,sn')" "atom sl \ (s1,s2,s,k1,k2,k,t1,t2,u1,u2,sl',m,n,sm,sm',sn,sn')" "atom sl' \ (s1,s2,s,k1,k2,k,t1,t2,u1,u2,m,n,sm,sm',sn,sn')" "atom m \ (s1,s2,s,k1,k2,k,t1,t2,u1,u2,n,sm,sm',sn,sn')" "atom n \ (s1,s2,s,k1,k2,k,t1,t2,u1,u2,sm,sm',sn,sn')" "atom sm \ (s1,s2,s,k1,k2,k,t1,t2,u1,u2,sm',sn,sn')" "atom sm' \ (s1,s2,s,k1,k2,k,t1,t2,u1,u2,sn,sn')" "atom sn \ (s1,s2,s,k1,k2,k,t1,t2,u1,u2,sn')" "atom sn' \ (s1,s2,s,k1,k2,k,t1,t2,u1,u2)" by (metis obtain_fresh) show ?thesis using assms atoms apply (auto simp: SeqQuoteP.simps [of l "Var s" _ sl sl' m n sm sm' sn sn']) apply (rule cut_same [where A="OrdP k1 AND OrdP k2"]) apply (metis Conj_I SeqQuoteP_imp_OrdP thin1 thin2) apply (rule cut_same [OF exists_SeqAppendP [of s s1 "SUCC k1" s2 "SUCC k2"]]) apply (rule AssumeH Ex_EH Conj_EH | simp)+ apply (rule cut_same [OF exists_HaddP [where j=k' and x=k1 and y=k2]]) apply (rule AssumeH Ex_EH Conj_EH | simp)+ apply (rule Ex_I [where x="Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (HPair (Eats t1 t2) (Q_Eats u1 u2)))"]) apply (simp_all (no_asm_simp)) apply (rule Ex_I [where x="SUCC (SUCC (Var k'))"]) apply simp apply (rule Conj_I [OF LstSeqP_SeqAppendP_Eats]) apply (blast intro: SeqQuoteP_imp_LstSeqP [THEN cut1])+ proof (rule All2_SUCC_I, simp_all) show "{HaddP k1 k2 (Var k'), OrdP k1, OrdP k2, SeqAppendP s1 (SUCC k1) s2 (SUCC k2) (Var s), SeqQuoteP t1 u1 s1 k1, SeqQuoteP t2 u2 s2 k2} \ Ex sl (Ex sl' (HPair (SUCC (SUCC (Var k'))) (HPair (Var sl) (Var sl')) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (HPair (Eats t1 t2) (Q_Eats u1 u2))) AND (Var sl EQ Zero AND Var sl' EQ Zero OR Ex m (Ex n (Ex sm (Ex sm' (Ex sn (Ex sn' (Var m IN SUCC (SUCC (Var k')) AND Var n IN SUCC (SUCC (Var k')) AND HPair (Var m) (HPair (Var sm) (Var sm')) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (HPair (Eats t1 t2) (Q_Eats u1 u2))) AND HPair (Var n) (HPair (Var sn) (Var sn')) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (HPair (Eats t1 t2) (Q_Eats u1 u2))) AND Var sl EQ Eats (Var sm) (Var sn) AND Var sl' EQ Q_Eats (Var sm') (Var sn'))))))))))" \ \verifying the final values\ apply (rule Ex_I [where x="Eats t1 t2"]) using assms atoms apply simp apply (rule Ex_I [where x="Q_Eats u1 u2"], simp) apply (rule Conj_I [OF Mem_Eats_I2 [OF Refl]]) apply (rule Disj_I2) apply (rule Ex_I [where x=k1], simp) apply (rule Ex_I [where x="SUCC (Var k')"], simp) apply (rule Ex_I [where x=t1], simp) apply (rule Ex_I [where x=u1], simp) apply (rule Ex_I [where x=t2], simp) apply (rule Ex_I [where x=u2], simp) apply (rule Conj_I) apply (blast intro: HaddP_Mem_I Mem_SUCC_I1) apply (rule Conj_I [OF Mem_SUCC_Refl]) apply (rule Conj_I) apply (blast intro: Mem_Eats_I1 SeqAppendP_Mem1 [THEN cut3] Mem_SUCC_Refl SeqQuoteP_imp_LstSeqP [THEN cut1] LstSeqP_imp_Mem) apply (blast intro: Mem_Eats_I1 SeqAppendP_Mem2 [THEN cut4] Mem_SUCC_Refl SeqQuoteP_imp_LstSeqP [THEN cut1] LstSeqP_imp_Mem HaddP_SUCC1 [THEN cut1]) done next show "{HaddP k1 k2 (Var k'), OrdP k1, OrdP k2, SeqAppendP s1 (SUCC k1) s2 (SUCC k2) (Var s), SeqQuoteP t1 u1 s1 k1, SeqQuoteP t2 u2 s2 k2} \ All2 l (SUCC (SUCC (Var k'))) (Ex sl (Ex sl' (HPair (Var l) (HPair (Var sl) (Var sl')) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (HPair (Eats t1 t2) (Q_Eats u1 u2))) AND (Var sl EQ Zero AND Var sl' EQ Zero OR Ex m (Ex n (Ex sm (Ex sm' (Ex sn (Ex sn' (Var m IN Var l AND Var n IN Var l AND HPair (Var m) (HPair (Var sm) (Var sm')) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (HPair (Eats t1 t2) (Q_Eats u1 u2))) AND HPair (Var n) (HPair (Var sn) (Var sn')) IN Eats (Var s) (HPair (SUCC (SUCC (Var k'))) (HPair (Eats t1 t2) (Q_Eats u1 u2))) AND Var sl EQ Eats (Var sm) (Var sn) AND Var sl' EQ Q_Eats (Var sm') (Var sn')))))))))))" \ \verifying the sequence buildup\ apply (rule cut_same [where A="HaddP (SUCC k1) (SUCC k2) (SUCC (SUCC (Var k')))"]) apply (blast intro: HaddP_SUCC1 [THEN cut1] HaddP_SUCC2 [THEN cut1]) apply (rule All_I Imp_I)+ apply (rule HaddP_Mem_cases [where i=j]) using assms atoms atoms2 apply simp_all apply (rule AssumeH) apply (blast intro: OrdP_SUCC_I) \ \... the sequence buildup via s1\ apply (simp add: SeqQuoteP.simps [of l s1 _ sl sl' m n sm sm' sn sn']) apply (rule AssumeH Ex_EH Conj_EH)+ apply (rule All2_E [THEN rotate2]) apply (simp | rule AssumeH Ex_EH Conj_EH)+ apply (rule Ex_I [where x="Var sl"], simp) apply (rule Ex_I [where x="Var sl'"], simp) apply (rule Conj_I) apply (rule Mem_Eats_I1) apply (metis SeqAppendP_Mem1 rotate3 thin2 thin4) apply (rule AssumeH Disj_IE1H Ex_EH Conj_EH)+ apply (rule Ex_I [where x="Var m"], simp) apply (rule Ex_I [where x="Var n"], simp) apply (rule Ex_I [where x="Var sm"], simp) apply (rule Ex_I [where x="Var sm'"], simp) apply (rule Ex_I [where x="Var sn"], simp) apply (rule Ex_I [where x="Var sn'"], simp_all) apply (rule Conj_I, rule AssumeH)+ apply (blast intro: OrdP_Trans [OF OrdP_SUCC_I] Mem_Eats_I1 [OF SeqAppendP_Mem1 [THEN cut3]] Hyp) \ \... the sequence buildup via s2\ apply (simp add: SeqQuoteP.simps [of l s2 _ sl sl' m n sm sm' sn sn']) apply (rule AssumeH Ex_EH Conj_EH)+ apply (rule All2_E [THEN rotate2]) apply (simp | rule AssumeH Ex_EH Conj_EH)+ apply (rule Ex_I [where x="Var sl"], simp) apply (rule Ex_I [where x="Var sl'"], simp) apply (rule cut_same [where A="OrdP (Var j)"]) apply (metis HaddP_imp_OrdP rotate2 thin2) apply (rule Conj_I) apply (blast intro: Mem_Eats_I1 SeqAppendP_Mem2 [THEN cut4] del: Disj_EH) apply (rule AssumeH Disj_IE1H Ex_EH Conj_EH)+ apply (rule cut_same [OF exists_HaddP [where j=km and x="SUCC k1" and y="Var m"]]) apply (blast intro: Ord_IN_Ord, simp) apply (rule cut_same [OF exists_HaddP [where j=kn and x="SUCC k1" and y="Var n"]]) apply (metis AssumeH(6) Ord_IN_Ord0 rotate8, simp) apply (rule AssumeH Ex_EH Conj_EH | simp)+ apply (rule Ex_I [where x="Var km"], simp) apply (rule Ex_I [where x="Var kn"], simp) apply (rule Ex_I [where x="Var sm"], simp) apply (rule Ex_I [where x="Var sm'"], simp) apply (rule Ex_I [where x="Var sn"], simp) apply (rule Ex_I [where x="Var sn'"], simp_all) apply (rule Conj_I [OF _ Conj_I]) apply (blast intro: Hyp OrdP_SUCC_I HaddP_Mem_cancel_left [THEN Iff_MP2_same]) apply (blast intro: Hyp OrdP_SUCC_I HaddP_Mem_cancel_left [THEN Iff_MP2_same]) apply (blast intro: Hyp Mem_Eats_I1 SeqAppendP_Mem2 [THEN cut4] OrdP_Trans HaddP_imp_OrdP [THEN cut1]) done qed qed lemma QuoteP_Eats: "{QuoteP t1 u1, QuoteP t2 u2} \ QuoteP (Eats t1 t2) (Q_Eats u1 u2)" proof - obtain k1::name and s1::name and k2::name and s2::name and k::name and s::name where "atom s1 \ (t1,u1,t2,u2)" "atom k1 \ (t1,u1,t2,u2,s1)" "atom s2 \ (t1,u1,t2,u2,k1,s1)" "atom k2 \ (t1,u1,t2,u2,s2,k1,s1)" "atom s \ (t1,u1,t2,u2,k2,s2,k1,s1)" "atom k \ (t1,u1,t2,u2,s,k2,s2,k1,s1)" by (metis obtain_fresh) thus ?thesis by (auto simp: QuoteP.simps [of s _ "(Q_Eats u1 u2)" k] QuoteP.simps [of s1 t1 u1 k1] QuoteP.simps [of s2 t2 u2 k2] intro!: SeqQuoteP_Eats [THEN cut2]) qed lemma exists_QuoteP: assumes j: "atom j \ x" shows "{} \ Ex j (QuoteP x (Var j))" proof - obtain i::name and j'::name and k::name where atoms: "atom i \ (j,x)" "atom j' \ (i,j,x)" "atom (k::name) \ (i,j,j',x)" by (metis obtain_fresh) have "{} \ Ex j (QuoteP (Var i) (Var j))" (is "{} \ ?scheme") proof (rule Ind [of k]) show "atom k \ (i, ?scheme)" using atoms by simp next show "{} \ ?scheme(i::=Zero)" using j atoms by (auto intro: Ex_I [where x=Zero] simp add: QuoteP_Zero) next show "{} \ All i (All k (?scheme IMP ?scheme(i::=Var k) IMP ?scheme(i::=Eats (Var i) (Var k))))" apply (rule All_I Imp_I)+ using atoms assms apply simp_all apply (rule Ex_E) apply (rule Ex_E_with_renaming [where i'=j', THEN rotate2], auto) apply (rule Ex_I [where x= "Q_Eats (Var j') (Var j)"], auto intro: QuoteP_Eats) done qed hence "{} \ (Ex j (QuoteP (Var i) (Var j))) (i::= x)" by (rule Subst) auto thus ?thesis using atoms j by auto qed lemma QuoteP_imp_ConstP: "{ QuoteP x y } \ ConstP y" proof - obtain j::name and j'::name and l::name and s::name and k::name and m::name and n::name and sm::name and sn::name and sm'::name and sn'::name where atoms: "atom j \ (x,y,s,k,j',l,m,n,sm,sm',sn,sn')" "atom j' \ (x,y,s,k,l,m,n,sm,sm',sn,sn')" "atom l \ (s,k,m,n,sm,sm',sn,sn')" "atom m \ (s,k,n,sm,sm',sn,sn')" "atom n \ (s,k,sm,sm',sn,sn')" "atom sm \ (s,k,sm',sn,sn')" "atom sm' \ (s,k,sn,sn')" "atom sn \ (s,k,sn')" "atom sn' \ (s,k)" "atom s \ (k,x,y)" "atom k \ (x,y)" by (metis obtain_fresh) have "{OrdP (Var k)} \ All j (All j' (SeqQuoteP (Var j) (Var j') (Var s) (Var k) IMP ConstP (Var j')))" (is "_ \ ?scheme") proof (rule OrdIndH [where j=l]) show "atom l \ (k, ?scheme)" using atoms by simp next show "{} \ All k (OrdP (Var k) IMP (All2 l (Var k) (?scheme(k::= Var l)) IMP ?scheme))" apply (rule All_I Imp_I)+ using atoms apply (simp_all add: fresh_at_base fresh_finite_set_at_base) \ \freshness finally proved!\ apply (rule cut_same) apply (rule cut1 [OF SeqQuoteP_lemma [of m "Var j" "Var j'" "Var s" "Var k" n sm sm' sn sn']], simp_all, blast) apply (rule Imp_I Disj_EH Conj_EH)+ \ \case 1, Var j EQ Zero\ apply (rule thin1) apply (rule Var_Eq_subst_Iff [THEN Iff_MP_same], simp) apply (metis thin0 ConstP_Zero) \ \case 2, @{term "Var j EQ Eats (Var sm) (Var sn)"}\ apply (rule Imp_I Conj_EH Ex_EH)+ apply simp_all apply (rule Var_Eq_subst_Iff [THEN Iff_MP_same, THEN rotate2], simp) apply (rule ConstP_Eats [THEN cut2]) \ \Operand 1. IH for sm\ apply (rule All2_E [where x="Var m", THEN rotate8], auto) apply (rule All_E [where x="Var sm"], simp) apply (rule All_E [where x="Var sm'"], auto) \ \Operand 2. IH for sm\ apply (rule All2_E [where x="Var n", THEN rotate8], auto) apply (rule All_E [where x="Var sn"], simp) apply (rule All_E [where x="Var sn'"], auto) done qed hence "{OrdP(Var k)} \ (All j' (SeqQuoteP (Var j) (Var j') (Var s) (Var k) IMP ConstP (Var j'))) (j::=x)" by (metis All_D) hence "{OrdP(Var k)} \ All j' (SeqQuoteP x (Var j') (Var s) (Var k) IMP ConstP (Var j'))" using atoms by simp hence "{OrdP(Var k)} \ (SeqQuoteP x (Var j') (Var s) (Var k) IMP ConstP (Var j')) (j'::=y)" by (metis All_D) hence "{OrdP(Var k)} \ SeqQuoteP x y (Var s) (Var k) IMP ConstP y" using atoms by simp hence "{ SeqQuoteP x y (Var s) (Var k) } \ ConstP y" by (metis Imp_cut SeqQuoteP_imp_OrdP anti_deduction) thus "{ QuoteP x y } \ ConstP y" using atoms by (auto simp: QuoteP.simps [of s _ _ k]) qed lemma SeqQuoteP_imp_QuoteP: "{SeqQuoteP t u s k} \ QuoteP t u" proof - obtain s'::name and k'::name where "atom s' \ (k',t,u,s,k)" "atom k' \ (t,u,s,k)" by (metis obtain_fresh) thus ?thesis apply (simp add: QuoteP.simps [of s' _ _ k']) apply (rule Ex_I [where x = s], simp) apply (rule Ex_I [where x = k], auto) done qed lemmas QuoteP_I = SeqQuoteP_imp_QuoteP [THEN cut1] section \The Operator @{term quote_all}\ subsection \Definition and basic properties\ definition quote_all :: "[perm, name set] \ fm set" where "quote_all p V = {QuoteP (Var i) (Var (p \ i)) | i. i \ V}" lemma quote_all_empty [simp]: "quote_all p {} = {}" by (simp add: quote_all_def) lemma quote_all_insert [simp]: "quote_all p (insert i V) = insert (QuoteP (Var i) (Var (p \ i))) (quote_all p V)" by (auto simp: quote_all_def) lemma finite_quote_all [simp]: "finite V \ finite (quote_all p V)" by (induct rule: finite_induct) auto lemma fresh_quote_all [simp]: "finite V \ i \ quote_all p V \ i \ V \ i \ p\V" by (induct rule: finite_induct) (auto simp: fresh_finite_insert) lemma fresh_quote_all_mem: "\A \ quote_all p V; finite V; i \ V; i \ p \ V\ \ i \ A" by (metis Set.set_insert finite_insert finite_quote_all fresh_finite_insert fresh_quote_all) lemma quote_all_perm_eq: assumes "finite V" "atom i \ (p,V)" "atom i' \ (p,V)" shows "quote_all ((atom i \ atom i') + p) V = quote_all p V" proof - { fix W assume w: "W \ V" have "finite W" by (metis \finite V\ finite_subset w) hence "quote_all ((atom i \ atom i') + p) W = quote_all p W" using w apply induction using assms apply (auto simp: fresh_Pair perm_commute) apply (metis fresh_finite_set_at_base swap_at_base_simps(3))+ done} thus ?thesis by (metis order_refl) qed subsection \Transferring theorems to the level of derivability\ context quote_perm begin lemma QuoteP_imp_ConstP_F_hyps: assumes "Us \ Vs" "{ConstP (F i) | i. i \ Us} \ A" shows "quote_all p Us \ A" proof - show ?thesis using finite_V [OF \Us \ Vs\] assms proof (induction arbitrary: A rule: finite_induct) case empty thus ?case by simp next case (insert v Us) thus ?case by (auto simp: Collect_disj_Un) (metis (lifting) anti_deduction Imp_cut [OF _ QuoteP_imp_ConstP] Disj_I2 F_unfold) qed qed text\Lemma 8.3\ theorem quote_all_PfP_ssubst: assumes \: "{} \ \" and V: "V \ Vs" and s: "supp \ \ atom ` Vs" shows "quote_all p V \ PfP (ssubst \\\V V F)" proof - - have "{} \ PfP \\\" + have "{} \ PfP \\\" by (metis \ proved_imp_proved_PfP) hence "{ConstP (F i) | i. i \ V} \ PfP (ssubst \\\V V F)" by (simp add: PfP_implies_PfP_ssubst V s) thus ?thesis by (rule QuoteP_imp_ConstP_F_hyps [OF V]) qed text\Lemma 8.4\ corollary quote_all_MonPon_PfP_ssubst: assumes A: "{} \ \ IMP \" and V: "V \ Vs" and s: "supp \ \ atom ` Vs" "supp \ \ atom ` Vs" shows "quote_all p V \ PfP (ssubst \\\V V F) IMP PfP (ssubst \\\V V F)" using quote_all_PfP_ssubst [OF A V] s by (auto simp: V vquot_fm_def intro: PfP_implies_ModPon_PfP thin1) text\Lemma 8.4b\ corollary quote_all_MonPon2_PfP_ssubst: assumes A: "{} \ \1 IMP \2 IMP \" and V: "V \ Vs" and s: "supp \1 \ atom ` Vs" "supp \2 \ atom ` Vs" "supp \ \ atom ` Vs" shows "quote_all p V \ PfP (ssubst \\1\V V F) IMP PfP (ssubst \\2\V V F) IMP PfP (ssubst \\\V V F)" using quote_all_PfP_ssubst [OF A V] s by (force simp: V vquot_fm_def intro: PfP_implies_ModPon_PfP [OF PfP_implies_ModPon_PfP] thin1) lemma quote_all_Disj_I1_PfP_ssubst: assumes "V \ Vs" "supp \ \ atom ` Vs" "supp \ \ atom ` Vs" and prems: "H \ PfP (ssubst \\\V V F)" "quote_all p V \ H" shows "H \ PfP (ssubst \\ OR \\V V F)" proof - have "{} \ \ IMP (\ OR \)" by (blast intro: Disj_I1) hence "quote_all p V \ PfP (ssubst \\\V V F) IMP PfP (ssubst \\ OR \\V V F)" using assms by (auto simp: quote_all_MonPon_PfP_ssubst) thus ?thesis by (metis MP_same prems thin) qed lemma quote_all_Disj_I2_PfP_ssubst: assumes "V \ Vs" "supp \ \ atom ` Vs" "supp \ \ atom ` Vs" and prems: "H \ PfP (ssubst \\\V V F)" "quote_all p V \ H" shows "H \ PfP (ssubst \\ OR \\V V F)" proof - have "{} \ \ IMP (\ OR \)" by (blast intro: Disj_I2) hence "quote_all p V \ PfP (ssubst \\\V V F) IMP PfP (ssubst \\ OR \\V V F)" using assms by (auto simp: quote_all_MonPon_PfP_ssubst) thus ?thesis by (metis MP_same prems thin) qed lemma quote_all_Conj_I_PfP_ssubst: assumes "V \ Vs" "supp \ \ atom ` Vs" "supp \ \ atom ` Vs" and prems: "H \ PfP (ssubst \\\V V F)" "H \ PfP (ssubst \\\V V F)" "quote_all p V \ H" shows "H \ PfP (ssubst \\ AND \\V V F)" proof - have "{} \ \ IMP \ IMP (\ AND \)" by blast hence "quote_all p V \ PfP (ssubst \\\V V F) IMP PfP (ssubst \\\V V F) IMP PfP (ssubst \\ AND \\V V F)" using assms by (auto simp: quote_all_MonPon2_PfP_ssubst) thus ?thesis by (metis MP_same prems thin) qed lemma quote_all_Contra_PfP_ssubst: assumes "V \ Vs" "supp \ \ atom ` Vs" shows "quote_all p V \ PfP (ssubst \\\V V F) IMP PfP (ssubst \Neg \\V V F) IMP PfP (ssubst \Fls\V V F)" proof - have "{} \ \ IMP Neg \ IMP Fls" by blast thus ?thesis using assms by (auto simp: quote_all_MonPon2_PfP_ssubst supp_conv_fresh) qed lemma fresh_ssubst_dbtm: "\atom i \ p\V; V \ Vs\ \ atom i \ ssubst (vquot_dbtm V t) V F" by (induct t rule: dbtm.induct) (auto simp: F_unfold fresh_image permute_set_eq_image) lemma fresh_ssubst_dbfm: "\atom i \ p\V; V \ Vs\ \ atom i \ ssubst (vquot_dbfm V A) V F" by (nominal_induct A rule: dbfm.strong_induct) (auto simp: fresh_ssubst_dbtm) lemma fresh_ssubst_fm: fixes A::fm shows "\atom i \ p\V; V \ Vs\ \ atom i \ ssubst (\A\V) V F" by (simp add: fresh_ssubst_dbfm vquot_fm_def) end section \Star Property. Equality and Membership: Lemmas 9.3 and 9.4\ lemma SeqQuoteP_Mem_imp_QMem_and_Subset: assumes "atom i \ (j,j',i',si,ki,sj,kj)" "atom i' \ (j,j',si,ki,sj,kj)" "atom j \ (j',si,ki,sj,kj)" "atom j' \ (si,ki,sj,kj)" "atom si \ (ki,sj,kj)" "atom sj \ (ki,kj)" shows "{SeqQuoteP (Var i) (Var i') (Var si) ki, SeqQuoteP (Var j) (Var j') (Var sj) kj} \ (Var i IN Var j IMP PfP (Q_Mem (Var i') (Var j'))) AND (Var i SUBS Var j IMP PfP (Q_Subset (Var i') (Var j')))" proof - obtain k::name and l::name and li::name and lj::name and m::name and n::name and sm::name and sn::name and sm'::name and sn'::name where atoms: "atom lj \ (li,l,i,j,j',i',si,ki,sj,kj,i,i',k,m,n,sm,sm',sn,sn')" "atom li \ (l,j,j',i,i',si,ki,sj,kj,i,i',k,m,n,sm,sm',sn,sn')" "atom l \ (j,j',i,i',si,ki,sj,kj,i,i',k,m,n,sm,sm',sn,sn')" "atom k \ (j,j',i,i',si,ki,sj,kj,m,n,sm,sm',sn,sn')" "atom m \ (j,j',i,i',si,ki,sj,kj,n,sm,sm',sn,sn')" "atom n \ (j,j',i,i',si,ki,sj,kj,sm,sm',sn,sn')" "atom sm \ (j,j',i,i',si,ki,sj,kj,sm',sn,sn')" "atom sm' \ (j,j',i,i',si,ki,sj,kj,sn,sn')" "atom sn \ (j,j',i,i',si,ki,sj,kj,sn')" "atom sn' \ (j,j',i,i',si,ki,sj,kj)" by (metis obtain_fresh) have "{OrdP(Var k)} \ All i (All i' (All si (All li (All j (All j' (All sj (All lj (SeqQuoteP (Var i) (Var i') (Var si) (Var li) IMP SeqQuoteP (Var j) (Var j') (Var sj) (Var lj) IMP HaddP (Var li) (Var lj) (Var k) IMP ( (Var i IN Var j IMP PfP (Q_Mem (Var i') (Var j'))) AND (Var i SUBS Var j IMP PfP (Q_Subset (Var i') (Var j'))))))))))))" (is "_ \ ?scheme") proof (rule OrdIndH [where j=l]) show "atom l \ (k, ?scheme)" using atoms by simp next define V p where "V = {i,j,sm,sn}" and "p = (atom i \ atom i') + (atom j \ atom j') + (atom sm \ atom sm') + (atom sn \ atom sn')" define F where "F \ make_F V p" interpret qp: quote_perm p V F proof unfold_locales show "finite V" by (simp add: V_def) show "atom ` (p \ V) \* V" using atoms assms by (auto simp: p_def V_def F_def make_F_def fresh_star_def fresh_finite_insert) show "-p = p" using assms atoms by (simp add: p_def add.assoc perm_self_inverseI fresh_swap fresh_plus_perm) show "F \ make_F V p" by (rule F_def) qed have V_mem: "i \ V" "j \ V" "sm \ V" "sn \ V" by (auto simp: V_def) \ \Part of (2) from page 32\ have Mem1: "{} \ (Var i IN Var sm) IMP (Var i IN Eats (Var sm) (Var sn))" by (blast intro: Mem_Eats_I1) have Q_Mem1: "quote_all p V \ PfP (Q_Mem (Var i') (Var sm')) IMP PfP (Q_Mem (Var i') (Q_Eats (Var sm') (Var sn')))" using qp.quote_all_MonPon_PfP_ssubst [OF Mem1 subset_refl] assms atoms V_mem by (simp add: vquot_fm_def qp.Vs) (simp add: qp.F_unfold p_def) have Mem2: "{} \ (Var i EQ Var sn) IMP (Var i IN Eats (Var sm) (Var sn))" by (blast intro: Mem_Eats_I2) have Q_Mem2: "quote_all p V \ PfP (Q_Eq (Var i') (Var sn')) IMP PfP (Q_Mem (Var i') (Q_Eats (Var sm') (Var sn')))" using qp.quote_all_MonPon_PfP_ssubst [OF Mem2 subset_refl] assms atoms V_mem by (simp add: vquot_fm_def qp.Vs) (simp add: qp.F_unfold p_def) have Subs1: "{} \ Zero SUBS Var j" by blast have Q_Subs1: "{QuoteP (Var j) (Var j')} \ PfP (Q_Subset Zero (Var j'))" using qp.quote_all_PfP_ssubst [OF Subs1, of "{j}"] assms atoms by (simp add: qp.ssubst_Subset vquot_tm_def supp_conv_fresh fresh_at_base del: qp.ssubst_single) (simp add: qp.F_unfold p_def V_def) have Subs2: "{} \ Var sm SUBS Var j IMP Var sn IN Var j IMP Eats (Var sm) (Var sn) SUBS Var j" by blast have Q_Subs2: "quote_all p V \ PfP (Q_Subset (Var sm') (Var j')) IMP PfP (Q_Mem (Var sn') (Var j')) IMP PfP (Q_Subset (Q_Eats (Var sm') (Var sn')) (Var j'))" using qp.quote_all_MonPon2_PfP_ssubst [OF Subs2 subset_refl] assms atoms V_mem by (simp add: qp.ssubst_Subset vquot_tm_def supp_conv_fresh subset_eq fresh_at_base) (simp add: vquot_fm_def qp.F_unfold p_def V_def) have Ext: "{} \ Var i SUBS Var sn IMP Var sn SUBS Var i IMP Var i EQ Var sn" by (blast intro: Equality_I) have Q_Ext: "{QuoteP (Var i) (Var i'), QuoteP (Var sn) (Var sn')} \ PfP (Q_Subset (Var i') (Var sn')) IMP PfP (Q_Subset (Var sn') (Var i')) IMP PfP (Q_Eq (Var i') (Var sn'))" using qp.quote_all_MonPon2_PfP_ssubst [OF Ext, of "{i,sn}"] assms atoms by (simp add: qp.ssubst_Subset vquot_tm_def supp_conv_fresh subset_eq fresh_at_base del: qp.ssubst_single) (simp add: vquot_fm_def qp.F_unfold p_def V_def) show "{} \ All k (OrdP (Var k) IMP (All2 l (Var k) (?scheme(k::= Var l)) IMP ?scheme))" apply (rule All_I Imp_I)+ using atoms assms apply simp_all apply (rule cut_same [where A = "QuoteP (Var i) (Var i')"]) apply (blast intro: QuoteP_I) apply (rule cut_same [where A = "QuoteP (Var j) (Var j')"]) apply (blast intro: QuoteP_I) apply (rule rotate6) apply (rule Conj_I) \ \@{term"Var i IN Var j IMP PfP (Q_Mem (Var i') (Var j'))"}\ apply (rule cut_same) apply (rule cut1 [OF SeqQuoteP_lemma [of m "Var j" "Var j'" "Var sj" "Var lj" n sm sm' sn sn']], simp_all, blast) apply (rule Imp_I Disj_EH Conj_EH)+ \ \case 1, @{term "Var j EQ Zero"}\ apply (rule cut_same [where A = "Var i IN Zero"]) apply (blast intro: Mem_cong [THEN Iff_MP_same], blast) \ \case 2, @{term "Var j EQ Eats (Var sm) (Var sn)"}\ apply (rule Imp_I Conj_EH Ex_EH)+ apply simp_all apply (rule Var_Eq_subst_Iff [THEN rotate2, THEN Iff_MP_same], simp) apply (rule cut_same [where A = "QuoteP (Var sm) (Var sm')"]) apply (blast intro: QuoteP_I) apply (rule cut_same [where A = "QuoteP (Var sn) (Var sn')"]) apply (blast intro: QuoteP_I) apply (rule cut_same [where A = "Var i IN Eats (Var sm) (Var sn)"]) apply (rule Mem_cong [OF Refl, THEN Iff_MP_same]) apply (rule AssumeH Mem_Eats_E)+ \ \Eats case 1. IH for sm\ apply (rule cut_same [where A = "OrdP (Var m)"]) apply (blast intro: Hyp Ord_IN_Ord SeqQuoteP_imp_OrdP [THEN cut1]) apply (rule cut_same [OF exists_HaddP [where j=l and x="Var li" and y="Var m"]]) apply auto apply (rule All2_E [where x="Var l", THEN rotate13], simp_all) apply (blast intro: Hyp HaddP_Mem_cancel_left [THEN Iff_MP2_same] SeqQuoteP_imp_OrdP [THEN cut1]) apply (rule All_E [where x="Var i"], simp) apply (rule All_E [where x="Var i'"], simp) apply (rule All_E [where x="Var si"], simp) apply (rule All_E [where x="Var li"], simp) apply (rule All_E [where x="Var sm"], simp) apply (rule All_E [where x="Var sm'"], simp) apply (rule All_E [where x="Var sj"], simp) apply (rule All_E [where x="Var m"], simp) apply (force intro: MP_thin [OF Q_Mem1] simp add: V_def p_def) \ \Eats case 2\ apply (rule rotate13) apply (rule cut_same [where A = "OrdP (Var n)"]) apply (blast intro: Hyp Ord_IN_Ord SeqQuoteP_imp_OrdP [THEN cut1]) apply (rule cut_same [OF exists_HaddP [where j=l and x="Var li" and y="Var n"]]) apply auto apply (rule MP_same) apply (rule Q_Mem2 [THEN thin]) apply (simp add: V_def p_def) apply (rule MP_same) apply (rule MP_same) apply (rule Q_Ext [THEN thin]) apply (simp add: V_def p_def) \ \@{term"PfP (Q_Subset (Var i') (Var sn'))"}\ apply (rule All2_E [where x="Var l", THEN rotate14], simp_all) apply (blast intro: Hyp HaddP_Mem_cancel_left [THEN Iff_MP2_same] SeqQuoteP_imp_OrdP [THEN cut1]) apply (rule All_E [where x="Var i"], simp) apply (rule All_E [where x="Var i'"], simp) apply (rule All_E [where x="Var si"], simp) apply (rule All_E [where x="Var li"], simp) apply (rule All_E [where x="Var sn"], simp) apply (rule All_E [where x="Var sn'"], simp) apply (rule All_E [where x="Var sj"], simp) apply (rule All_E [where x="Var n"], simp) apply (rule Imp_E, blast intro: Hyp)+ apply (rule Conj_E) apply (rule thin1) apply (blast intro!: Imp_E EQ_imp_SUBS [THEN cut1]) \ \@{term"PfP (Q_Subset (Var sn') (Var i'))"}\ apply (rule All2_E [where x="Var l", THEN rotate14], simp_all) apply (blast intro: Hyp HaddP_Mem_cancel_left [THEN Iff_MP2_same] SeqQuoteP_imp_OrdP [THEN cut1]) apply (rule All_E [where x="Var sn"], simp) apply (rule All_E [where x="Var sn'"], simp) apply (rule All_E [where x="Var sj"], simp) apply (rule All_E [where x="Var n"], simp) apply (rule All_E [where x="Var i"], simp) apply (rule All_E [where x="Var i'"], simp) apply (rule All_E [where x="Var si"], simp) apply (rule All_E [where x="Var li"], simp) apply (rule Imp_E, blast intro: Hyp)+ apply (rule Imp_E) apply (blast intro: Hyp HaddP_commute [THEN cut2] SeqQuoteP_imp_OrdP [THEN cut1]) apply (rule Conj_E) apply (rule thin1) apply (blast intro!: Imp_E EQ_imp_SUBS2 [THEN cut1]) \ \@{term"Var i SUBS Var j IMP PfP (Q_Subset (Var i') (Var j'))"}\ apply (rule cut_same) apply (rule cut1 [OF SeqQuoteP_lemma [of m "Var i" "Var i'" "Var si" "Var li" n sm sm' sn sn']], simp_all, blast) apply (rule Imp_I Disj_EH Conj_EH)+ \ \case 1, Var i EQ Zero\ apply (rule cut_same [where A = "PfP (Q_Subset Zero (Var j'))"]) apply (blast intro: Q_Subs1 [THEN cut1] SeqQuoteP_imp_QuoteP [THEN cut1]) apply (force intro: Var_Eq_subst_Iff [THEN Iff_MP_same, THEN rotate3]) \ \case 2, @{term "Var i EQ Eats (Var sm) (Var sn)"}\ apply (rule Conj_EH Ex_EH)+ apply simp_all apply (rule cut_same [where A = "OrdP (Var lj)"]) apply (blast intro: Hyp SeqQuoteP_imp_OrdP [THEN cut1]) apply (rule Var_Eq_subst_Iff [THEN Iff_MP_same, THEN rotate3], simp) apply (rule cut_same [where A = "QuoteP (Var sm) (Var sm')"]) apply (blast intro: QuoteP_I) apply (rule cut_same [where A = "QuoteP (Var sn) (Var sn')"]) apply (blast intro: QuoteP_I) apply (rule cut_same [where A = "Eats (Var sm) (Var sn) SUBS Var j"]) apply (rule Subset_cong [OF _ Refl, THEN Iff_MP_same]) apply (rule AssumeH Mem_Eats_E)+ \ \Eats case split\ apply (rule Eats_Subset_E) apply (rule rotate15) apply (rule MP_same [THEN MP_same]) apply (rule Q_Subs2 [THEN thin]) apply (simp add: V_def p_def) \ \Eats case 1: @{term "PfP (Q_Subset (Var sm') (Var j'))"}\ apply (rule cut_same [OF exists_HaddP [where j=l and x="Var m" and y="Var lj"]]) apply (rule AssumeH Ex_EH Conj_EH | simp)+ \ \IH for sm\ apply (rule All2_E [where x="Var l", THEN rotate15], simp_all) apply (blast intro: Hyp HaddP_Mem_cancel_right_Mem SeqQuoteP_imp_OrdP [THEN cut1]) apply (rule All_E [where x="Var sm"], simp) apply (rule All_E [where x="Var sm'"], simp) apply (rule All_E [where x="Var si"], simp) apply (rule All_E [where x="Var m"], simp) apply (rule All_E [where x="Var j"], simp) apply (rule All_E [where x="Var j'"], simp) apply (rule All_E [where x="Var sj"], simp) apply (rule All_E [where x="Var lj"], simp) apply (blast intro: thin1 Imp_E) \ \Eats case 2: @{term "PfP (Q_Mem (Var sn') (Var j'))"}\ apply (rule cut_same [OF exists_HaddP [where j=l and x="Var n" and y="Var lj"]]) apply (rule AssumeH Ex_EH Conj_EH | simp)+ \ \IH for sn\ apply (rule All2_E [where x="Var l", THEN rotate15], simp_all) apply (blast intro: Hyp HaddP_Mem_cancel_right_Mem SeqQuoteP_imp_OrdP [THEN cut1]) apply (rule All_E [where x="Var sn"], simp) apply (rule All_E [where x="Var sn'"], simp) apply (rule All_E [where x="Var si"], simp) apply (rule All_E [where x="Var n"], simp) apply (rule All_E [where x="Var j"], simp) apply (rule All_E [where x="Var j'"], simp) apply (rule All_E [where x="Var sj"], simp) apply (rule All_E [where x="Var lj"], simp) apply (blast intro: Hyp Imp_E) done qed hence p1: "{OrdP(Var k)} \ (All i' (All si (All li (All j (All j' (All sj (All lj (SeqQuoteP (Var i) (Var i') (Var si) (Var li) IMP SeqQuoteP (Var j) (Var j') (Var sj) (Var lj) IMP HaddP (Var li) (Var lj) (Var k) IMP (Var i IN Var j IMP PfP (Q_Mem (Var i') (Var j'))) AND (Var i SUBS Var j IMP PfP (Q_Subset (Var i') (Var j'))))))))))) (i::= Var i)" by (metis All_D) have p2: "{OrdP(Var k)} \ (All si (All li (All j (All j' (All sj (All lj (SeqQuoteP (Var i) (Var i') (Var si) (Var li) IMP SeqQuoteP (Var j) (Var j') (Var sj) (Var lj) IMP HaddP (Var li) (Var lj) (Var k) IMP (Var i IN Var j IMP PfP (Q_Mem (Var i') (Var j'))) AND (Var i SUBS Var j IMP PfP (Q_Subset (Var i') (Var j'))))))))))(i'::= Var i')" apply (rule All_D) using atoms p1 by simp have p3: "{OrdP(Var k)} \ (All li (All j (All j' (All sj (All lj (SeqQuoteP (Var i) (Var i') (Var si) (Var li) IMP SeqQuoteP (Var j) (Var j') (Var sj) (Var lj) IMP HaddP (Var li) (Var lj) (Var k) IMP (Var i IN Var j IMP PfP (Q_Mem (Var i') (Var j'))) AND (Var i SUBS Var j IMP PfP (Q_Subset (Var i') (Var j'))))))))) (si::= Var si)" apply (rule All_D) using atoms p2 by simp have p4: "{OrdP(Var k)} \ (All j (All j' (All sj (All lj (SeqQuoteP (Var i) (Var i') (Var si) (Var li) IMP SeqQuoteP (Var j) (Var j') (Var sj) (Var lj) IMP HaddP (Var li) (Var lj) (Var k) IMP (Var i IN Var j IMP PfP (Q_Mem (Var i') (Var j'))) AND (Var i SUBS Var j IMP PfP (Q_Subset (Var i') (Var j')))))))) (li::= ki)" apply (rule All_D) using atoms p3 by simp have p5: "{OrdP(Var k)} \ (All j' (All sj (All lj (SeqQuoteP (Var i) (Var i') (Var si) ki IMP SeqQuoteP (Var j) (Var j') (Var sj) (Var lj) IMP HaddP ki (Var lj) (Var k) IMP (Var i IN Var j IMP PfP (Q_Mem (Var i') (Var j'))) AND (Var i SUBS Var j IMP PfP (Q_Subset (Var i') (Var j'))))))) (j::= Var j)" apply (rule All_D) using atoms assms p4 by simp have p6: "{OrdP(Var k)} \ (All sj (All lj (SeqQuoteP (Var i) (Var i') (Var si) ki IMP SeqQuoteP (Var j) (Var j') (Var sj) (Var lj) IMP HaddP ki (Var lj) (Var k) IMP (Var i IN Var j IMP PfP (Q_Mem (Var i') (Var j'))) AND (Var i SUBS Var j IMP PfP (Q_Subset (Var i') (Var j')))))) (j'::= Var j')" apply (rule All_D) using atoms p5 by simp have p7: "{OrdP(Var k)} \ (All lj (SeqQuoteP (Var i) (Var i') (Var si) ki IMP SeqQuoteP (Var j) (Var j') (Var sj) (Var lj) IMP HaddP ki (Var lj) (Var k) IMP (Var i IN Var j IMP PfP (Q_Mem (Var i') (Var j'))) AND (Var i SUBS Var j IMP PfP (Q_Subset (Var i') (Var j'))))) (sj::= Var sj)" apply (rule All_D) using atoms p6 by simp have p8: "{OrdP(Var k)} \ (SeqQuoteP (Var i) (Var i') (Var si) ki IMP SeqQuoteP (Var j) (Var j') (Var sj) (Var lj) IMP HaddP ki (Var lj) (Var k) IMP (Var i IN Var j IMP PfP (Q_Mem (Var i') (Var j'))) AND (Var i SUBS Var j IMP PfP (Q_Subset (Var i') (Var j')))) (lj::= kj)" apply (rule All_D) using atoms p7 by simp hence p9: "{OrdP(Var k)} \ SeqQuoteP (Var i) (Var i') (Var si) ki IMP SeqQuoteP (Var j) (Var j') (Var sj) kj IMP HaddP ki kj (Var k) IMP (Var i IN Var j IMP PfP (Q_Mem (Var i') (Var j'))) AND (Var i SUBS Var j IMP PfP (Q_Subset (Var i') (Var j')))" using assms atoms by simp have p10: "{ HaddP ki kj (Var k), SeqQuoteP (Var i) (Var i') (Var si) ki, SeqQuoteP (Var j) (Var j') (Var sj) kj, OrdP (Var k) } \ (Var i IN Var j IMP PfP (Q_Mem (Var i') (Var j'))) AND (Var i SUBS Var j IMP PfP (Q_Subset (Var i') (Var j')))" apply (rule MP_same [THEN MP_same [THEN MP_same]]) apply (rule p9 [THEN thin]) apply (auto intro: MP_same) done show ?thesis apply (rule cut_same [OF exists_HaddP [where j=k and x=ki and y=kj]]) apply (metis SeqQuoteP_imp_OrdP thin1) prefer 2 apply (rule Ex_E) apply (rule p10 [THEN cut4]) using assms atoms apply (auto intro: HaddP_OrdP SeqQuoteP_imp_OrdP [THEN cut1]) done qed lemma assumes "atom i \ (j,j',i')" "atom i' \ (j,j')" "atom j \ (j')" shows QuoteP_Mem_imp_QMem: "{QuoteP (Var i) (Var i'), QuoteP (Var j) (Var j'), Var i IN Var j} \ PfP (Q_Mem (Var i') (Var j'))" (is ?thesis1) and QuoteP_Mem_imp_QSubset: "{QuoteP (Var i) (Var i'), QuoteP (Var j) (Var j'), Var i SUBS Var j} \ PfP (Q_Subset (Var i') (Var j'))" (is ?thesis2) proof - obtain si::name and ki::name and sj::name and kj::name where atoms: "atom si \ (ki,sj,kj,i,j,j',i')" "atom ki \ (sj,kj,i,j,j',i')" "atom sj \ (kj,i,j,j',i')" "atom kj \ (i,j,j',i')" by (metis obtain_fresh) hence C: "{QuoteP (Var i) (Var i'), QuoteP (Var j) (Var j')} \ (Var i IN Var j IMP PfP (Q_Mem (Var i') (Var j'))) AND (Var i SUBS Var j IMP PfP (Q_Subset (Var i') (Var j')))" using assms by (auto simp: QuoteP.simps [of si "Var i" _ ki] QuoteP.simps [of sj "Var j" _ kj] intro!: SeqQuoteP_Mem_imp_QMem_and_Subset del: Conj_I) show ?thesis1 by (best intro: Conj_E1 [OF C, THEN MP_thin]) show ?thesis2 by (best intro: Conj_E2 [OF C, THEN MP_thin]) qed section \Star Property. Universal Quantifier: Lemma 9.7\ lemma (in quote_perm) SeqQuoteP_Mem_imp_All2: assumes IH: "insert (QuoteP (Var i) (Var i')) (quote_all p Vs) \ \ IMP PfP (ssubst \\\(insert i Vs) (insert i Vs) Fi)" and sp: "supp \ - {atom i} \ atom ` Vs" and j: "j \ Vs" and j': "p \ j = j'" and pi: "pi = (atom i \ atom i') + p" and Fi: "Fi = make_F (insert i Vs) pi" and atoms: "atom i \ (j,j',s,k,p)" "atom i' \ (i,p,\)" "atom j \ (j',s,k,\)" "atom j' \ (s,k,\)" "atom s \ (k,\)" "atom k \ (\,p)" shows "insert (SeqQuoteP (Var j) (Var j') (Var s) (Var k)) (quote_all p (Vs-{j})) \ All2 i (Var j) \ IMP PfP (ssubst \All2 i (Var j) \\Vs Vs F)" proof - have pj' [simp]: "p \ j' = j" using pinv j' by (metis permute_minus_cancel(2)) have [simp]: "F j = Var j'" using j j' by (auto simp: F_unfold) hence i': "atom i' \ Vs" using atoms by (auto simp: Vs) have fresh_ss [simp]: "\i A::fm. atom i \ p \ atom i \ ssubst (\A\Vs) Vs F" by (simp add: vquot_fm_def fresh_ssubst_dbfm) obtain l::name and m::name and n::name and sm::name and sn::name and sm'::name and sn'::name where atoms': "atom l \ (p,\,i,j,j',s,k,m,n,sm,sm',sn,sn')" "atom m \ (p,\,i,j,j',s,k,n,sm,sm',sn,sn')" "atom n \ (p,\,i,j,j',s,k,sm,sm',sn,sn')" "atom sm \ (p,\,i,j,j',s,k,sm',sn,sn')" "atom sm' \ (p,\,i,j,j',s,k,sn,sn')" "atom sn \ (p,\,i,j,j',s,k,sn')" "atom sn' \ (p,\,i,j,j',s,k)" by (metis obtain_fresh) define V' p' where "V' = {sm,sn} \ Vs" and "p' = (atom sm \ atom sm') + (atom sn \ atom sn') + p" define F' where "F' \ make_F V' p'" interpret qp': quote_perm p' V' F' proof unfold_locales show "finite V'" by (simp add: V'_def) show "atom ` (p' \ V') \* V'" using atoms atoms' p by (auto simp: p'_def V'_def swap_fresh_fresh fresh_at_base_permI fresh_star_finite_insert fresh_finite_insert atom_fresh_star_atom_set_conv) show "F' \ make_F V' p'" by (rule F'_def) show "- p' = p'" using atoms atoms' pinv by (simp add: p'_def add.assoc perm_self_inverseI fresh_swap fresh_plus_perm) qed have All2_Zero: "{} \ All2 i Zero \" by auto have Q_All2_Zero: "quote_all p Vs \ PfP (Q_All (Q_Imp (Q_Mem (Q_Ind Zero) Zero) (ssubst (vquot_dbfm Vs (trans_fm [i] \)) Vs F)))" using quote_all_PfP_ssubst [OF All2_Zero] assms by (force simp add: vquot_fm_def supp_conv_fresh) have All2_Eats: "{} \ All2 i (Var sm) \ IMP \(i::=Var sn) IMP All2 i (Eats (Var sm) (Var sn)) \" using atoms' apply auto apply (rule Ex_I [where x = "Var i"], auto) apply (rule rotate2) apply (blast intro: ContraProve Var_Eq_imp_subst_Iff [THEN Iff_MP_same]) done have [simp]: "F' sm = Var sm'" "F' sn = Var sn'" using atoms' by (auto simp: V'_def p'_def qp'.F_unfold swap_fresh_fresh fresh_at_base_permI) have smn' [simp]: "sm \ V'" "sn \ V'" "sm \ Vs" "sn \ Vs" using atoms' by (auto simp: V'_def fresh_finite_set_at_base [symmetric]) hence Q_All2_Eats: "quote_all p' V' \ PfP (ssubst \All2 i (Var sm) \\V' V' F') IMP PfP (ssubst \\(i::=Var sn)\V' V' F') IMP PfP (ssubst \All2 i (Eats (Var sm) (Var sn)) \\V' V' F')" using sp qp'.quote_all_MonPon2_PfP_ssubst [OF All2_Eats subset_refl] by (simp add: supp_conv_fresh subset_eq V'_def) (metis Diff_iff empty_iff fresh_ineq_at_base insertE mem_Collect_eq) interpret qpi: quote_perm pi "insert i Vs" Fi unfolding pi apply (rule qp_insert) using atoms apply (auto simp: Fi pi) done have F'_eq_F: "\name. name \ Vs \ F' name = F name" using atoms' by (auto simp: F_unfold qp'.F_unfold p'_def swap_fresh_fresh V'_def fresh_pj) { fix t::dbtm assume "supp t \ atom ` V'" "supp t \ atom ` Vs" hence "ssubst (vquot_dbtm V' t) V' F' = ssubst (vquot_dbtm Vs t) Vs F" by (induction t rule: dbtm.induct) (auto simp: F'_eq_F) } note ssubst_v_tm = this { fix A::dbfm assume "supp A \ atom ` V'" "supp A \ atom ` Vs" hence "ssubst (vquot_dbfm V' A) V' F' = ssubst (vquot_dbfm Vs A) Vs F" by (induction A rule: dbfm.induct) (auto simp: ssubst_v_tm F'_eq_F) } note ssubst_v_fm = this have ss_noprimes: "ssubst (vquot_dbfm V' (trans_fm [i] \)) V' F' = ssubst (vquot_dbfm Vs (trans_fm [i] \)) Vs F" apply (rule ssubst_v_fm) using sp apply (auto simp: V'_def supp_conv_fresh) done { fix t::dbtm assume "supp t - {atom i} \ atom ` Vs" hence "subst i' (Var sn') (ssubst (vquot_dbtm (insert i Vs) t) (insert i Vs) Fi) = ssubst (vquot_dbtm V' (subst_dbtm (DBVar sn) i t)) V' F'" apply (induction t rule: dbtm.induct) using atoms atoms' apply (auto simp: vquot_tm_def pi V'_def qpi.F_unfold qp'.F_unfold p'_def fresh_pj swap_fresh_fresh fresh_at_base_permI) done } note perm_v_tm = this { fix A::dbfm assume "supp A - {atom i} \ atom ` Vs" hence "subst i' (Var sn') (ssubst (vquot_dbfm (insert i Vs) A) (insert i Vs) Fi) = ssubst (vquot_dbfm V' (subst_dbfm (DBVar sn) i A)) V' F'" by (induct A rule: dbfm.induct) (auto simp: Un_Diff perm_v_tm) } note perm_v_fm = this have "quote_all p Vs \ QuoteP (Var i) (Var i') IMP (\ IMP PfP (ssubst \\\(insert i Vs) (insert i Vs) Fi))" using IH by auto hence "quote_all p Vs \ (QuoteP (Var i) (Var i') IMP (\ IMP PfP (ssubst \\\(insert i Vs) (insert i Vs) Fi))) (i'::=Var sn')" using atoms IH by (force intro!: Subst elim!: fresh_quote_all_mem) hence "quote_all p Vs \ QuoteP (Var i) (Var sn') IMP (\ IMP PfP (subst i' (Var sn') (ssubst \\\(insert i Vs) (insert i Vs) Fi)))" using atoms by simp moreover have "subst i' (Var sn') (ssubst \\\(insert i Vs) (insert i Vs) Fi) = ssubst \\(i::=Var sn)\V' V' F'" using sp by (auto simp: vquot_fm_def perm_v_fm supp_conv_fresh subst_fm_trans_commute [symmetric]) ultimately have "quote_all p Vs \ QuoteP (Var i) (Var sn') IMP (\ IMP PfP (ssubst \\(i::=Var sn)\V' V' F'))" by simp hence "quote_all p Vs \ (QuoteP (Var i) (Var sn') IMP (\ IMP PfP (ssubst \\(i::=Var sn)\V' V' F'))) (i::=Var sn)" using \atom i \ _\ by (force intro!: Subst elim!: fresh_quote_all_mem) hence "quote_all p Vs \ (QuoteP (Var sn) (Var sn') IMP (\(i::=Var sn) IMP PfP (subst i (Var sn) (ssubst \\(i::=Var sn)\V' V' F'))))" using atoms atoms' by simp moreover have "subst i (Var sn) (ssubst \\(i::=Var sn)\V' V' F') = ssubst \\(i::=Var sn)\V' V' F'" using atoms atoms' i' by (auto simp: swap_fresh_fresh fresh_at_base_permI p'_def intro!: forget_subst_tm [OF qp'.fresh_ssubst']) ultimately have "quote_all p Vs \ QuoteP (Var sn) (Var sn') IMP (\(i::=Var sn) IMP PfP (ssubst \\(i::=Var sn)\V' V' F'))" using atoms atoms' by simp hence star0: "insert (QuoteP (Var sn) (Var sn')) (quote_all p Vs) \ \(i::=Var sn) IMP PfP (ssubst \\(i::=Var sn)\V' V' F')" by (rule anti_deduction) have subst_i_star: "quote_all p' V' \ \(i::=Var sn) IMP PfP (ssubst \\(i::=Var sn)\V' V' F')" apply (rule thin [OF star0]) using atoms' apply (force simp: V'_def p'_def fresh_swap fresh_plus_perm fresh_at_base_permI add.assoc quote_all_perm_eq) done have "insert (OrdP (Var k)) (quote_all p (Vs-{j})) \ All j (All j' (SeqQuoteP (Var j) (Var j') (Var s) (Var k) IMP All2 i (Var j) \ IMP PfP (ssubst \All2 i (Var j) \\Vs Vs F)))" (is "_ \ ?scheme") proof (rule OrdIndH [where j=l]) show "atom l \ (k, ?scheme)" using atoms atoms' j j' fresh_pVs by (simp add: fresh_Pair F_unfold) next have substj: "\t j. atom j \ \ \ atom (p \ j) \ \ \ subst j t (ssubst (vquot_dbfm Vs (trans_fm [i] \)) Vs F) = ssubst (vquot_dbfm Vs (trans_fm [i] \)) Vs F" by (auto simp: fresh_ssubst') { fix W assume W: "W \ Vs" hence "finite W" by (metis Vs infinite_super) hence "quote_all p' W = quote_all p W" using W proof (induction) case empty thus ?case by simp next case (insert w W) hence "w \ Vs" "atom sm \ p \ Vs" "atom sm' \ p \ Vs" "atom sn \ p \ Vs" "atom sn' \ p \ Vs" using atoms' Vs by (auto simp: fresh_pVs) hence "atom sm \ p \ w" "atom sm' \ p \ w" "atom sn \ p \ w" "atom sn' \ p \ w" by (metis Vs fresh_at_base(2) fresh_finite_set_at_base fresh_permute_left)+ thus ?case using insert by (simp add: p'_def swap_fresh_fresh) qed } hence "quote_all p' Vs = quote_all p Vs" by (metis subset_refl) also have "... = insert (QuoteP (Var j) (Var j')) (quote_all p (Vs - {j}))" using j j' by (auto simp: quote_all_def) finally have "quote_all p' V' = {QuoteP (Var sn) (Var sn'), QuoteP (Var sm) (Var sm')} \ insert (QuoteP (Var j) (Var j')) (quote_all p (Vs - {j}))" using atoms' by (auto simp: p'_def V'_def fresh_at_base_permI Collect_disj_Un) also have "... = {QuoteP (Var sn) (Var sn'), QuoteP (Var sm) (Var sm'), QuoteP (Var j) (Var j')} \ quote_all p (Vs - {j})" by blast finally have quote_all'_eq: "quote_all p' V' = {QuoteP (Var sn) (Var sn'), QuoteP (Var sm) (Var sm'), QuoteP (Var j) (Var j')} \ quote_all p (Vs - {j})" . have pjV: "p \ j \ Vs" by (metis j perm_exits_Vs) hence jpV: "atom j \ p \ Vs" by (simp add: fresh_permute_left pinv fresh_finite_set_at_base) show "quote_all p (Vs-{j}) \ All k (OrdP (Var k) IMP (All2 l (Var k) (?scheme(k::= Var l)) IMP ?scheme))" apply (rule All_I Imp_I)+ using atoms atoms' j jpV pjV apply (auto simp: fresh_at_base fresh_finite_set_at_base j' elim!: fresh_quote_all_mem) apply (rule cut_same [where A = "QuoteP (Var j) (Var j')"]) apply (blast intro: QuoteP_I) apply (rule cut_same) apply (rule cut1 [OF SeqQuoteP_lemma [of m "Var j" "Var j'" "Var s" "Var k" n sm sm' sn sn']], simp_all, blast) apply (rule Imp_I Disj_EH Conj_EH)+ \ \case 1, Var j EQ Zero\ apply (simp add: vquot_fm_def) apply (rule thin1) apply (rule Var_Eq_subst_Iff [THEN Iff_MP_same], simp) apply (simp add: substj) apply (rule Q_All2_Zero [THEN thin]) using assms apply (simp add: quote_all_def, blast) \ \case 2, @{term "Var j EQ Eats (Var sm) (Var sn)"}\ apply (rule Imp_I Conj_EH Ex_EH)+ using atoms apply (auto elim!: fresh_quote_all_mem) apply (rule cut_same [where A = "QuoteP (Var sm) (Var sm')"]) apply (blast intro: QuoteP_I) apply (rule cut_same [where A = "QuoteP (Var sn) (Var sn')"]) apply (blast intro: QuoteP_I) \ \Eats case. IH for sm\ apply (rule All2_E [where x="Var m", THEN rotate12], simp_all, blast) apply (rule All_E [where x="Var sm"], simp) apply (rule All_E [where x="Var sm'"], simp) apply (rule Imp_E, blast) \ \Setting up the subgoal\ apply (rule cut_same [where A = "PfP (ssubst \All2 i (Eats (Var sm) (Var sn)) \\V' V' F')"]) defer 1 apply (rule rotate6) apply (simp add: vquot_fm_def) apply (rule Var_Eq_subst_Iff [THEN Iff_MP_same], force simp add: substj ss_noprimes j') apply (rule cut_same [where A = "All2 i (Eats (Var sm) (Var sn)) \"]) apply (rule All2_cong [OF Hyp Iff_refl, THEN Iff_MP_same], blast) apply (force elim!: fresh_quote_all_mem simp add: fresh_at_base fresh_finite_set_at_base, blast) apply (rule All2_Eats_E, simp) apply (rule MP_same [THEN MP_same]) apply (rule Q_All2_Eats [THEN thin]) apply (force simp add: quote_all'_eq) \ \Proving @{term "PfP (ssubst \All2 i (Var sm) \\V' V' F')"}\ apply (force intro!: Imp_E [THEN rotate3] simp add: vquot_fm_def substj j' ss_noprimes) \ \Proving @{term "PfP (ssubst \\(i::=Var sn)\V' V' F')"}\ apply (rule MP_same [OF subst_i_star [THEN thin]]) apply (force simp add: quote_all'_eq, blast) done qed hence p1: "insert (OrdP (Var k)) (quote_all p (Vs-{j})) \ (All j' (SeqQuoteP (Var j) (Var j') (Var s) (Var k) IMP All2 i (Var j) \ IMP PfP (ssubst \All2 i (Var j) \\Vs Vs F))) (j::=Var j)" by (metis All_D) have "insert (OrdP (Var k)) (quote_all p (Vs-{j})) \ (SeqQuoteP (Var j) (Var j') (Var s) (Var k) IMP All2 i (Var j) \ IMP PfP (ssubst \All2 i (Var j) \\Vs Vs F)) (j'::=Var j')" apply (rule All_D) using p1 atoms by simp thus ?thesis using atoms by simp (metis SeqQuoteP_imp_OrdP Imp_cut anti_deduction) qed lemma (in quote_perm) quote_all_Mem_imp_All2: assumes IH: "insert (QuoteP (Var i) (Var i')) (quote_all p Vs) \ \ IMP PfP (ssubst \\\(insert i Vs) (insert i Vs) Fi)" and "supp (All2 i (Var j) \) \ atom ` Vs" and j: "atom j \ (i,\)" and i: "atom i \ p" and i': "atom i' \ (i,p,\)" and pi: "pi = (atom i \ atom i') + p" and Fi: "Fi = make_F (insert i Vs) pi" shows "insert (All2 i (Var j) \) (quote_all p Vs) \ PfP (ssubst \All2 i (Var j) \\Vs Vs F)" proof - have sp: "supp \ - {atom i} \ atom ` Vs" and jV: "j \ Vs" using assms by (auto simp: fresh_def supp_Pair) obtain s::name and k::name where atoms: "atom s \ (k,i,j,p\j,\,p)" "atom k \ (i,j,p\j,\,p)" by (metis obtain_fresh) hence ii: "atom i \ (j, p \ j, s, k, p)" using i j by (simp add: fresh_Pair) (metis fresh_at_base(2) fresh_perm fresh_permute_left pinv) have jj: "atom j \ (p \ j, s, k, \)" using atoms j by (auto simp: fresh_Pair) (metis atom_fresh_perm jV) have pj: "atom (p \ j) \ (s, k, \)" using atoms ii sp jV by (simp add: fresh_Pair) (auto simp: fresh_def perm_exits_Vs dest!: subsetD) show ?thesis apply (rule cut_same [where A = "QuoteP (Var j) (Var (p \ j))"]) apply (force intro: jV Hyp simp add: quote_all_def) using atoms apply (auto simp: QuoteP.simps [of s _ _ k] elim!: fresh_quote_all_mem) apply (rule MP_same) apply (rule SeqQuoteP_Mem_imp_All2 [OF IH sp jV refl pi Fi ii i' jj pj, THEN thin]) apply (auto simp: fresh_at_base_permI quote_all_def intro!: fresh_ssubst') done qed section \The Derivability Condition, Theorem 9.1\ lemma SpecI: "H \ A IMP Ex i A" by (metis Imp_I Assume Ex_I subst_fm_id) lemma star: fixes p :: perm and F :: "name \ tm" assumes C: "ss_fm \" and p: "atom ` (p \ V) \* V" "-p = p" and V: "finite V" "supp \ \ atom ` V" and F: "F = make_F V p" shows "insert \ (quote_all p V) \ PfP (ssubst \\\V V F)" using C V p F proof (nominal_induct avoiding: p arbitrary: V F rule: ss_fm.strong_induct) case (MemI i j) show ?case proof (cases "i=j") case True thus ?thesis by auto next case False hence ij: "atom i \ j" "{i, j} \ V" using MemI by auto interpret qp: quote_perm p V F by unfold_locales (auto simp: image_iff F make_F_def p MemI) have "insert (Var i IN Var j) (quote_all p V) \ PfP (Q_Mem (Var (p \ i)) (Var (p \ j)))" apply (rule QuoteP_Mem_imp_QMem [of i j, THEN cut3]) using ij apply (auto simp: quote_all_def qp.atom_fresh_perm intro: Hyp) apply (metis atom_eqvt fresh_Pair fresh_at_base(2) fresh_permute_iff qp.atom_fresh_perm) done thus ?thesis apply (simp add: vquot_fm_def) using MemI apply (auto simp: make_F_def) done qed next case (DisjI A B) interpret qp: quote_perm p V F by unfold_locales (auto simp: image_iff DisjI) show ?case apply auto apply (rule_tac [2] qp.quote_all_Disj_I2_PfP_ssubst) apply (rule qp.quote_all_Disj_I1_PfP_ssubst) using DisjI by auto next case (ConjI A B) interpret qp: quote_perm p V F by unfold_locales (auto simp: image_iff ConjI) show ?case apply (rule qp.quote_all_Conj_I_PfP_ssubst) using ConjI by (auto intro: thin1 thin2) next case (ExI A i) interpret qp: quote_perm p V F by unfold_locales (auto simp: image_iff ExI) obtain i'::name where i': "atom i' \ (i,p,A)" by (metis obtain_fresh) define p' where "p' = (atom i \ atom i') + p" define F' where "F' = make_F (insert i V) p'" have p'_apply [simp]: "!!v. p' \ v = (if v=i then i' else if v=i' then i else p \ v)" using \atom i \ p\ i' by (auto simp: p'_def fresh_Pair fresh_at_base_permI) (metis atom_eq_iff fresh_at_base_permI permute_eq_iff swap_at_base_simps(3)) have p'V: "p' \ V = p \ V" by (metis i' p'_def permute_plus fresh_Pair qp.fresh_pVs swap_fresh_fresh \atom i \ p\) have i: "i \ V" "i \ p \ V" "atom i \ V" "atom i \ p \ V" "atom i \ p' \ V" using ExI by (auto simp: p'V fresh_finite_set_at_base notin_V) interpret qp': quote_perm p' "insert i V" F' by (auto simp: qp.qp_insert i' p'_def F'_def \atom i \ p\) { fix W t assume W: "W \ V" "i\W" "i'\W" hence "finite W" by (metis \finite V\ infinite_super) hence "ssubst t W F' = ssubst t W F" using W by induct (auto simp: qp.ssubst_insert_if qp'.ssubst_insert_if qp.F_unfold qp'.F_unfold) } hence ss_simp: "ssubst \Ex i A\(insert i V) (insert i V) F' = ssubst \Ex i A\V V F" using i by (metis equalityE insertCI p'_apply qp'.perm_exits_Vs qp'.ssubst_vquot_Ex qp.Vs) have qa_p': "quote_all p' V = quote_all p V" using i i' ExI.hyps(1) by (auto simp: p'_def quote_all_perm_eq) have ss: "(quote_all p' (insert i V)) \ PfP (ssubst \A\(insert i V) (insert i V) F') IMP PfP (ssubst \Ex i A\(insert i V) (insert i V) F')" apply (rule qp'.quote_all_MonPon_PfP_ssubst [OF SpecI]) using ExI apply auto done hence "insert A (quote_all p' (insert i V)) \ PfP (ssubst \Ex i A\(insert i V) (insert i V) F')" apply (rule MP_thin) apply (rule ExI(3) [of "insert i V" p' F']) apply (metis \finite V\ finite_insert) using \supp (Ex i A) \ _\ qp'.p qp'.pinv i' apply (auto simp: F'_def fresh_finite_insert) done hence "insert (QuoteP (Var i) (Var i')) (insert A (quote_all p V)) \ PfP (ssubst \Ex i A\V V F)" by (auto simp: insert_commute ss_simp qa_p') hence Exi': "insert (Ex i' (QuoteP (Var i) (Var i'))) (insert A (quote_all p V)) \ PfP (ssubst \Ex i A\V V F)" by (auto intro!: qp.fresh_ssubst_fm) (auto simp: ExI i' fresh_quote_all_mem) have "insert A (quote_all p V) \ PfP (ssubst \Ex i A\V V F)" using i' by (auto intro: cut0 [OF exists_QuoteP Exi']) thus "insert (Ex i A) (quote_all p V) \ PfP (ssubst \Ex i A\V V F)" apply (rule Ex_E, simp) apply (rule qp.fresh_ssubst_fm) using i ExI apply (auto simp: fresh_quote_all_mem) done next case (All2I A j i p V F) interpret qp: quote_perm p V F by unfold_locales (auto simp: image_iff All2I) obtain i'::name where i': "atom i' \ (i,p,A)" by (metis obtain_fresh) define p' where "p' = (atom i \ atom i') + p" define F' where "F' = make_F (insert i V) p'" interpret qp': quote_perm p' "insert i V" F' using \atom i \ p\ i' by (auto simp: qp.qp_insert p'_def F'_def) have p'_apply [simp]: "p' \ i = i'" using \atom i \ p\ by (auto simp: p'_def fresh_at_base_permI) have qa_p': "quote_all p' V = quote_all p V" using i' All2I by (auto simp: p'_def quote_all_perm_eq) have "insert A (quote_all p' (insert i V)) \ PfP (ssubst \A\(insert i V) (insert i V) F')" apply (rule All2I.hyps) using \supp (All2 i _ A) \ _\ qp'.p qp'.pinv apply (auto simp: F'_def fresh_finite_insert) done hence "insert (QuoteP (Var i) (Var i')) (quote_all p V) \ A IMP PfP (ssubst \A\(insert i V) (insert i V) (make_F (insert i V) p'))" by (auto simp: insert_commute qa_p' F'_def) thus "insert (All2 i (Var j) A) (quote_all p V) \ PfP (ssubst \All2 i (Var j) A\V V F)" using All2I i' qp.quote_all_Mem_imp_All2 by (simp add: p'_def) qed theorem Provability: assumes "Sigma_fm \" "ground_fm \" - shows "{\} \ PfP \\\" + shows "{\} \ PfP \\\" proof - obtain \ where \: "ss_fm \" "ground_fm \" "{} \ \ IFF \" using assms by (auto simp: Sigma_fm_def ground_fm_aux_def) - hence "{\} \ PfP \\\" using star [of \ 0 "{}"] + hence "{\} \ PfP \\\" using star [of \ 0 "{}"] by (auto simp: ground_fm_aux_def fresh_star_def) - then have "{\} \ PfP \\\" using \ + then have "{\} \ PfP \\\" using \ by (metis Iff_MP_left') - moreover have "{} \ PfP \\ IMP \\" using \ + moreover have "{} \ PfP \\ IMP \\" using \ by (metis Conj_E2 Iff_def proved_imp_proved_PfP) ultimately show ?thesis by (metis PfP_implies_ModPon_PfP_quot thin0) qed end