fun vars :: "trm ==> (var_sym * type_sym) set"where "vars (Var x α) = {(x,α)}"
| "vars (Cst _ _) = {}"
| "vars (A \<cdot> B) = vars A ∪ vars B"
| "vars ([\<lambda>x:α. A]) = {(x,α)} ∪ vars A"
fun frees :: "trm ==> (var_sym * type_sym) set"where "frees (Var x α) = {(x,α)}"
| "frees (Cst _ _) = {}"
| "frees (A \<cdot> B) = frees A ∪ frees B"
| "frees ([\<lambda>x:α. A]) = frees A - {(x,α)}"
lemma frees_subset_vars: "frees A ⊆ vars A" by (induction A) auto
fun type_of :: "trm ==> type_sym"where "type_of (Var x α) = α"
| "type_of (Cst c α) = α"
| "type_of (A \<cdot> B) = (case type_of A of β \<Leftarrow> α ==> β)"
| "type_of [\<lambda>x:α. A] = (type_of A) \<Leftarrow> α"
lemma type_of[simp]: "wff α A ==> type_of A = α" by (induction rule: wff.induct) auto
lemma wff_Var'[simp, code]: "wff β (Var x α) ⟷ β = α" using wff.cases wff_Var by auto
lemma wff_Cst'[simp, code]: "wff β (Cst c α) ⟷ β = α" using wff.cases wff_Cst by auto
lemma wff_App'[simp]: "wff α (A \<cdot> B) ⟷ (∃β. wff (α \<Leftarrow> β) A ∧ wff β B)" proof assume"wff α (A \<cdot> B)" thenshow"∃β. wff (α \<Leftarrow> β) A ∧ wff β B" using wff.cases by fastforce next assume"∃β. wff (α \<Leftarrow> β) A ∧ wff β B" thenshow"wff α (A \<cdot> B)" using wff_App by auto qed
lemma wff_Abs'[simp]: "wff γ ([\<lambda>x:α. A]) ⟷ (∃β. wff β A ∧ γ = β \<Leftarrow> α)" proof assume"wff γ [\<lambda>x:α. A]" thenshow"∃β. wff β A ∧ γ = β \<Leftarrow> α" using wff.cases by blast next assume"∃β. wff β A ∧ γ = β \<Leftarrow> α" thenshow"wff γ [\<lambda>x:α. A]" using wff_Abs by auto qed
lemma wff_Abs_type_of[code]: "wff γ [\<lambda>x:α. A]⟷ (wff (type_of A) A ∧ γ = (type_of A) \<Leftarrow> α)" proof assume"wff γ [\<lambda>x:α. A]" thenshow"wff (type_of A) A ∧ γ = (type_of A) \<Leftarrow> α" using wff.cases by auto next assume"wff (type_of A) A ∧ γ = (type_of A) \<Leftarrow> α" thenshow"wff γ [\<lambda>x:α. A]" using wff_Abs by auto qed
lemma wff_App_type_of[code]: "wff γ ((A \<cdot> B)) ⟷ (wff (type_of A) A ∧ wff (type_of B) B ∧ type_of A = γ \<Leftarrow> (type_of B))" proof assume"wff γ (A \<cdot> B)" thenshow"wff (type_of A) A ∧ wff (type_of B) B ∧ type_of A = γ \<Leftarrow> (type_of B)" by auto next assume"wff (type_of A) A ∧ wff (type_of B) B ∧ type_of A = γ \<Leftarrow> (type_of B)" thenshow"wff γ (A \<cdot> B)" by (metis wff_App') qed
lemma unique_type: "wff β A ==> wff α A ==> α = β" proof (induction arbitrary: α rule: wff.induct) case (wff_Var α' y) thenshow ?case by simp next case (wff_Cst α' c) thenshow ?case by simp next case (wff_App α' β A B) thenshow ?case using wff_App' by blast next case (wff_Abs β A α x) thenshow ?case using wff_Abs_type_of by blast qed
section‹Replacement›
inductive replacement :: "trm ==> trm ==> trm ==> trm ==> bool"where
replace: "replacement A B A B"
| replace_App_left: "replacement A B C E ==> replacement A B (C \<cdot> D) (E \<cdot> D)"
| replace_App_right: "replacement A B D E ==> replacement A B (C \<cdot> D) (C \<cdot> E)"
| replace_Abs: "replacement A B C D ==> replacement A B [\<lambda>x:α. C][\<lambda>x:α. D]"
lemma replacement_preserves_type: assumes"replacement A B C D" assumes"wff α A" assumes"wff α B" assumes"wff β C" shows"wff β D" using assms proof (induction arbitrary: α β rule: replacement.induct) case (replace A B) thenshow ?case using unique_type by auto next case (replace_App_left A B C E D) thenhave"∃β'. wff (β \<Leftarrow> β') C" by auto thenobtain β' where wff_C: "wff (β \<Leftarrow> β') C" by auto thenhave e: "wff (β \<Leftarrow> β') E" using replace_App_left by auto define α' where"α' = β \<Leftarrow> β'" have"wff β' D" using wff_C unique_type replace_App_left.prems(3) by auto thenhave"wff β (E \<cdot> D)" using e by auto thenshow ?case by auto next case (replace_App_right A B D E C) have"∃β'. wff (β \<Leftarrow> β') C" using replace_App_right.prems(3) by auto thenobtain β' where wff_C: "wff (β \<Leftarrow> β') C" by auto have wff_E: "wff β' E" using wff_C unique_type replace_App_right by fastforce define α' where α': "α' = β \<Leftarrow> β'" have"wff β (C \<cdot> E)" using wff_C wff_E by auto thenshow ?case using α' by auto next case (replace_Abs A B C D x α') thenhave"∃β'. wff β' D" by auto thenobtain β' where wff_D: "wff β' D" by auto have β: "β = β' \<Leftarrow> α'" using wff_D unique_type replace_Abs by auto have"wff (β' \<Leftarrow> α') ([\<lambda>x:α'. D])" using wff_D by auto thenshow ?case using β by auto qed
lemma replacement_preserved_type: assumes"replacement A B C D" assumes"wff α A" assumes"wff α B" assumes"wff β D" shows"wff β C" using assms proof (induction arbitrary: α β rule: replacement.induct) case (replace A B) thenshow ?case using unique_type by auto next case (replace_App_left A B C E D) thenobtain γ where γ: "wff (β \<Leftarrow> γ) E ∧ wff γ D" by auto thenhave"wff (β \<Leftarrow> γ) C" using replace_App_left by auto thenshow ?case using γ by auto next case (replace_App_right A B D E C) thenobtain γ where γ: "wff (β \<Leftarrow> γ) C ∧ wff γ E" by auto thenhave"wff γ D" using replace_App_right by auto thenshow ?case using γ by auto next case (replace_Abs A B C D x α') thenobtain γ where"wff γ D" by auto thenshow ?case using unique_type replace_Abs by auto qed
section‹Defined wffs› ―‹This section formalizes most of the definitions and abbreviations from page 212.
We formalize enough to define the Q0 proof system.›
subsection‹Common expressions›
abbreviation (input) Var_yi (‹yi›) where "yi == Cst ''y'' Ind"
abbreviation (input) Var_xo (‹xo›) where "xo == Var ''x'' Tv"
abbreviation (input) Var_yo (‹yo›) where "yo == Var ''y'' Tv"
abbreviation (input) Fun_oo (‹oo›) where "oo == Tv \<Leftarrow> Tv"
abbreviation (input) Fun_ooo (‹ooo›) where "ooo == oo \<Leftarrow> Tv"
abbreviation (input) Var_goo (‹goo›) where "goo == Var ''g'' oo"
abbreviation (input) Var_gooo (‹gooo›) where "gooo == Var ''g'' ooo"
lemma wff_Forall[simp]: "wff Tv A ==> wff Tv [\<forall>x:α. A]" unfolding Forall_def by force
lemma wff_Forall_iff[simp]: "wff β [\<forall>x:α. A]⟷ wff Tv A ∧ β = Tv" proof assume"wff β [\<forall>x:α. A]" thenshow"wff Tv A ∧ β = Tv" by (smt Forall_def unique_type type_sym.inject wff_Abs' wff_App' wff_PI) next assume"wff Tv A ∧ β = Tv" thenshow"wff β [\<forall>x:α. A]" unfolding Forall_def by force qed
subsection‹Conjunction symbol›
definition Con_sym :: trm where "Con_sym ≡ [\<lambda>''x'':Tv. [\<lambda>''y'':Tv. [[\<lambda>''g'':ooo. gooo\<cdot> T \<cdot> T]=Tv \<Leftarrow> ooo=[\<lambda>''g'':ooo. gooo\<cdot> xo\<cdot> yo]] ]]"
lemma wff_Con_sym[simp]: "wff ooo Con_sym" unfolding Con_sym_def by auto
lemma wff_Con_sym'[simp]: "wff α Con_sym ⟷ α = ooo" unfolding Con_sym_def by auto
lemma wff_Con_sym_subterm0[simp]: "wff Tv A ==> wff Tv B ==> wff (Tv \<Leftarrow> ooo) [\<lambda>''g'':ooo. gooo\<cdot> A \<cdot> B]" by force
lemma wff_Con_sym_subterm0_iff[simp]: "wff β [\<lambda>''g'':ooo. gooo\<cdot> A \<cdot> B]⟷ wff Tv A ∧ wff Tv B ∧ β = (Tv\<Leftarrow> ooo)" proof assume wff: "wff β [\<lambda>''g'':ooo. gooo\<cdot> A \<cdot> B]" thenhave"wff Tv A" by auto moreover from wff have"wff Tv B" by auto moreover from wff have"β = Tv \<Leftarrow> ooo" by auto ultimatelyshow"wff Tv A ∧ wff Tv B ∧ β = Tv \<Leftarrow> ooo" by auto next assume"wff Tv A ∧ wff Tv B ∧ β = Tv \<Leftarrow> ooo" thenshow"wff β [\<lambda>''g'':ooo. gooo\<cdot> A \<cdot> B]" by force qed
lemma wff_Con_sym_subterm1[simp]: "wff Tv [[\<lambda>''g'':ooo. gooo\<cdot> T \<cdot> T]=(Tv \<Leftarrow> ooo)=[\<lambda>''g'':ooo. gooo\<cdot> xo\<cdot> yo]]" by auto
lemma wff_Con_sym_subterm1_iff[simp]: "wff α [[\<lambda>''g'':ooo. gooo\<cdot> T \<cdot> T]=(Tv \<Leftarrow> ooo)=[\<lambda>''g'':ooo. gooo\<cdot> xo\<cdot> yo]]⟷ α = Tv" using unique_type wff_Con_sym_subterm1 by blast
lemma wff_Con_sym_subterm2[simp]: "wff oo [\<lambda> ''y'':Tv. [[\<lambda>''g'':ooo. gooo\<cdot> T \<cdot> T]=(Tv \<Leftarrow> ooo)=[\<lambda>''g'':ooo. gooo\<cdot> xo\<cdot> yo]]]" by auto
lemma wff_Con_sym_subterm2_iff[simp]: "wff α [\<lambda> ''y'':Tv. [[\<lambda>''g'':ooo. gooo\<cdot> T \<cdot> T]=(Tv \<Leftarrow> ooo)=[\<lambda>''g'':ooo. gooo\<cdot> xo\<cdot> yo]]]⟷ α = oo" by auto
subsection‹Conjunction›
definition Con :: "trm ==> trm ==> trm" (infix‹\∧›80) where "A \<and> B = Con_sym \<cdot> A \<cdot> B"
lemma wff_Con[simp]: "wff Tv A ==> wff Tv B ==> wff Tv (A \<and> B)" unfolding Con_def by auto
lemma wff_Con_iff[simp]: "wff α (A \<and> B) ⟷ wff Tv A ∧ wff Tv B ∧ α = Tv" unfolding Con_def by auto
definition axiom_4_1 :: "var_sym ==> type_sym ==> trm ==> type_sym ==> trm ==> trm"where "axiom_4_1 x α B β A ≡[([\<lambda>x:α. B]\<cdot> A) =β= B]"
definition axiom_4_1_side_condition :: "var_sym ==> type_sym ==> trm ==> type_sym ==> trm ==> bool"where "axiom_4_1_side_condition x α B β A ≡ (∃c. B = Cst c β) ∨ (∃y. B = Var y β ∧ (x ≠ y ∨ α ≠ β))"
definition axiom_4_2 :: "var_sym ==> type_sym ==> trm ==> trm"where "axiom_4_2 x α A = [([\<lambda>x:α. Var x α]\<cdot> A) =α= A]"
definition axiom_4_3 :: "var_sym ==> type_sym ==> trm ==> type_sym ==> type_sym ==> trm ==> trm ==> trm"where "axiom_4_3 x α B β γ C A = [([\<lambda>x:α. B \<cdot> C]\<cdot> A) =β= (([\<lambda>x:α. B]\<cdot> A) \<cdot> ([\<lambda>x:α. C]\<cdot> A))]"
definition axiom_4_4 :: "var_sym ==> type_sym ==> var_sym ==> type_sym ==> trm ==>type_sym ==> trm ==> trm"where "axiom_4_4 x α y γ B δ A = [([\<lambda>x:α. [\<lambda>y:γ. B]]\<cdot> A) =δ \<Leftarrow> γ=[\<lambda>y:γ. [\<lambda>x:α. B]\<cdot> A]]"
definition axiom_4_4_side_condition :: "var_sym ==> type_sym ==> var_sym ==> type_sym ==> trm ==> type_sym ==> trm ==> bool"where "axiom_4_4_side_condition x α y γ B δ A ≡ (x ≠ y ∨ α ≠ γ) ∧ (y, γ) ∉ vars A"
definition axiom_4_5 :: "var_sym ==> type_sym ==> trm ==> type_sym ==> trm ==> trm"where "axiom_4_5 x α B δ A = [([\<lambda>x:α. [\<lambda>x:α. B]]\<cdot> A) =δ \<Leftarrow> α =[\<lambda>x:α. B]]"
definition axiom_5 where "axiom_5 = [(\<iota> \<cdot> ((Q (Tv \<Leftarrow> Ind \<Leftarrow> Ind)) \<cdot> yi))=Ind= yi]"
inductive axiom :: "trm ==> bool"where
by_axiom_1: "axiom axiom_1"
| by_axiom_2: "axiom (axiom_2 α)"
| by_axiom_3: "axiom (axiom_3 α β)"
| by_axiom_4_1: "wff α A ==> wff β B ==> axiom_4_1_side_condition x α B β A ==> axiom (axiom_4_1 x α B β A)"
| by_axiom_4_2: "wff α A ==> axiom (axiom_4_2 x α A)"
| by_axiom_4_3: "wff α A ==> wff (β \<Leftarrow> γ) B ==> wff γ C ==> axiom (axiom_4_3 x α B β γ C A)"
| by_axiom_4_4: "wff α A ==> wff δ B ==> axiom_4_4_side_condition x α y γ B δ A ==> axiom (axiom_4_4 x α y γ B δ A)"
| by_axiom_4_5: "wff α A ==> wff δ B ==> axiom (axiom_4_5 x α B δ A)"
| by_axiom_5: "axiom (axiom_5)"
inductive rule_R :: "trm ==> trm ==> trm ==> bool"where "replacement A B C D ==> rule_R C ([A =α= B]) D"
definition"proof" :: "trm ==> trm list ==> bool"where "proof A p ⟷ (p ≠ [] ∧ last p = A ∧ (∀i<length p. axiom (p ! i) ∨ (∃j<i. ∃k<i. rule_R (p ! j) (p ! k) (p ! i))))"
(* Peter Andrews defines theorems directly from "proof", here I instead define it as an inductive predicate based on rule_R *) inductive"theorem" :: "trm ==> bool"where
by_axiom: "axiom A ==> theorem A"
| by_rule_R: "theorem A ==> theorem B ==> rule_R A B C ==> theorem C"
(* Two variant formulations of axiom 4_1: *) definition axiom_4_1_variant_cst :: "var_sym ==> type_sym ==> var_sym ==> type_sym ==> trm ==> trm"where "axiom_4_1_variant_cst x α c β A ≡[([\<lambda>x:α. Cst c β]\<cdot> A) =β= (Cst c β)]"
definition axiom_4_1_variant_var :: "var_sym ==> type_sym ==> var_sym ==> type_sym ==> trm ==> trm"where "axiom_4_1_variant_var x α y β A ≡[([\<lambda>x:α. Var y β]\<cdot> A) =β= Var y β]"
definition axiom_4_1_variant_var_side_condition :: "var_sym ==> type_sym ==> var_sym ==> type_sym ==> trm ==> bool"where "axiom_4_1_variant_var_side_condition x α y β A ≡ x ≠ y ∨ α ≠ β"
(* Note that because Isabelle's HOL is total, val will also give values to trms that are not wffs *) fun val :: "'s frame ==> 's denotation ==> 's asg ==> trm ==> 's"where "val D I φ (Var x α) = φ (x,α)"
| "val D I φ (Cst c α) = I c α"
| "val D I φ (A \<cdot> B) = val D I φ A ⋅ val D I φ B"
| "val D I φ [\<lambda>x:α. B] = abstract (D α) (D (type_of B)) (λz. val D I (φ((x,α):=z)) B)"
fun general_model :: "'s frame ==> 's denotation ==> bool"where "general_model D I ⟷ wf_interp D I ∧ (∀φ A α. asg_into_interp φ D I ⟶ wff α A ⟶ val D I φ A ∈: D α)"
fun standard_model :: "'s frame ==> 's denotation ==> bool"where "standard_model D I ⟷ wf_interp D I ∧ (∀α β. D (α \<Leftarrow> β) = funspace (D β) (D α))"
lemma asg_into_frame_fun_upd: assumes"asg_into_frame φ D" assumes"xa ∈: D α" shows"asg_into_frame (φ((x, α) := xa)) D" using assms unfolding asg_into_frame_def by auto
lemma asg_into_interp_fun_upd: assumes"general_model D I" assumes"asg_into_interp φ D I" assumes"wff α A" shows"asg_into_interp (φ((x, α) := val D I φ A)) D I" using assms asg_into_frame_fun_upd by auto
lemma standard_model_is_general_model: (* property mentioned on page 239 *) assumes"standard_model D I" shows"general_model D I" proof - have"wf_interp D I" using assms by auto moreover have"wff α A ==> asg_into_interp φ D I ==> val D I φ A ∈: D α"for φ α A proof (induction arbitrary: φ rule: wff.induct) case (wff_Var α uu) thenshow ?case unfolding asg_into_frame_def using assms by auto next case (wff_Cst α uv) thenshow ?case using assms using wf_interp.simps by auto next case (wff_App α β A B) thenshow ?case using apply_in_rng assms by fastforce next case (wff_Abs β A α x) thenshow ?case using assms abstract_in_funspace asg_into_frame_fun_upd by force qed ultimately have"general_model D I" unfolding general_model.simps by auto thenshow"general_model D I" by auto qed
(* Corresponds to Andrews' proposition 5400 *)
proposition prop_5400: assumes"general_model D I" assumes"asg_into_interp φ D I" assumes"asg_into_interp ψ D I" assumes"wff α A" assumes"∀(x,α) ∈ frees A. agree_on_asg φ ψ x α" shows"val D I φ A = val D I ψ A" using assms(4) assms(1-3,5) proof (induction arbitrary: φ ψ rule: wff.induct) case (wff_Var α x) thenshow ?caseby auto next case (wff_Cst α c) thenshow ?caseby auto next case (wff_App α β A B) show ?case using wff_App(1,2,5,6,7,8) wff_App(3,4)[of φ ψ] by auto next case (wff_Abs β A α x) have"abstract (D α) (D β) (λz. val D I (φ((x, α) := z)) A) = abstract (D α) (D β) (λz. val D I (ψ((x, α) := z)) A)" proof (rule abstract_extensional, rule, rule) fix xa assume"xa ∈: D α" thenhave"val D I (φ((x, α) := xa)) A ∈: D β" using wff_Abs asg_into_frame_fun_upd by auto moreover
{ have"asg_into_frame (ψ((x, α) := xa)) D" using‹xa ∈: D α› asg_into_frame_fun_upd wff_Abs by auto moreover have"asg_into_frame (φ((x, α) := xa)) D" using‹xa ∈: D α› asg_into_frame_fun_upd wff_Abs by auto moreover have"(∀y∈frees A. (φ((x, α) := xa)) y = (ψ((x, α) := xa)) y)" using wff_Abs by auto ultimately have"val D I (φ((x, α) := xa)) A = val D I (ψ((x, α) := xa)) A" using assms wff_Abs by (smt case_prodI2)
} ultimately show"val D I (φ((x, α) := xa)) A ∈: D β ∧ val D I (φ((x, α) := xa)) A = val D I (ψ((x, α) := xa)) A" by auto qed thenshow ?case using wff_Abs by auto qed
(* definitions on page 239 *) abbreviation satisfies :: "'s frame ==> 's denotation ==> 's asg ==> trm ==> bool"where "satisfies D I φ A ≡ (val D I φ A = true)"
definition valid_in_model :: "'s frame ==> 's denotation ==> trm ==> bool"where "valid_in_model D I A ≡ (∀φ. asg_into_interp φ D I ⟶ val D I φ A = true)"
definition valid_general :: "trm ==> bool"where "valid_general A ≡∀D I. general_model D I ⟶ valid_in_model D I A"
definition valid_standard :: "trm ==> bool"where "valid_standard A ≡∀D I. standard_model D I ⟶ valid_in_model D I A"
section‹Semantics of defined wffs›
(* Corresponds to Andrews' lemma 5401 a *) lemma lemma_5401_a: assumes"general_model D I" assumes"asg_into_interp φ D I" assumes"wff α A""wff β B" shows"val D I φ ([\<lambda>x:α. B]\<cdot> A) = val D I (φ((x,α):=val D I φ A)) B" proof - have val_A: "val D I φ A ∈: D α" using assms by simp have"asg_into_interp (φ((x, α) := val D I φ A)) D I" using assms asg_into_frame_fun_upd by force thenhave val_B: "val D I (φ((x, α) := val D I φ A)) B ∈: D β" using assms by simp
have"val D I φ ([\<lambda>x:α. B]\<cdot> A) = (abstract (D α) (D β) (λz. val D I (φ((x, α) := z)) B)) ⋅ val D I φ A" using assms by auto also have"... = val D I (φ((x, α) := val D I φ A)) B" using apply_abstract val_A val_B by auto finally show ?thesis by auto qed
(* Corresponds to Andrews' lemma 5401 b *) lemma lemma_5401_b_variant_1: assumes"general_model D I" assumes"asg_into_interp φ D I" assumes"wff α A""wff α B" shows"val D I φ ([A =α= B]) = (boolean (val D I φ A = val D I φ B))" proof - have"val D I φ ([A =α= B]) = (I ''Q'' (Tv \<Leftarrow> α \<Leftarrow> α)) ⋅ val D I φ A⋅ val D I φ B" unfolding Eql_def by auto have"... = (iden (D α)) ⋅ val D I φ A ⋅ val D I φ B" using assms general_model.simps wf_interp.simps by auto also have"... = boolean (val D I φ A = val D I φ B)" using apply_id using assms general_model.simps by blast finallyshow ?thesis unfolding Eql_def by simp qed
(* Corresponds to Andrews' lemma 5401 b *) lemma lemma_5401_b: assumes"general_model D I" assumes"asg_into_interp φ D I" assumes"wff α A""wff α B" shows"val D I φ ([A =α= B]) = true ⟷ val D I φ A = val D I φ B" using lemma_5401_b_variant_1[OF assms] boolean_eq_true by auto
(* Corresponds to Andrews' lemma 5401 b *) lemma lemma_5401_b_variant_2: ―‹Just a reformulation of @{thm [source] lemma_5401_b}'s directions› assumes"general_model D I" assumes"asg_into_interp φ D I" assumes"wff α A""wff α B" assumes"val D I φ A = val D I φ B" shows"val D I φ ([A =α= B]) = true" using assms(5) lemma_5401_b[OF assms(1,2,3,4)] by auto
(* Corresponds to Andrews' lemma 5401 b *) lemma lemma_5401_b_variant_3: ―‹Just a reformulation of @{thm [source] lemma_5401_b}'s directions› assumes"general_model D I" assumes"asg_into_interp φ D I" assumes"wff α A""wff α B" assumes"val D I φ A ≠ val D I φ B" shows"val D I φ ([A =α= B]) = false" using assms(5) lemma_5401_b_variant_1[OF assms(1,2,3,4)] by (simp add: boolean_def)
(* Corresponds to Andrews' lemma 5401 c *) lemma lemma_5401_c: assumes"general_model D I" assumes"asg_into_interp φ D I" shows"val D I φ T = true" using assms lemma_5401_b[OF assms(1,2)] unfolding T_def by auto
(* Corresponds to Andrews' lemma 5401 d *) lemma lemma_5401_d: assumes"general_model D I" assumes"asg_into_interp φ D I" shows"val D I φ F = false" proof - have"iden boolset ∈: D ooo" using assms general_model.simps wf_interp.simps wf_frame_def by metis thenhave"(val D I φ [\<lambda>''x'':Tv. T]) ⋅ false ≠ (val D I φ [\<lambda>''x'':Tv. xo]) ⋅ false" using assms wf_interp.simps wf_frame_def true_neq_false
apply_id[of "iden boolset""(D ooo)""iden boolset"] unfolding boolean_def Eql_def T_def by auto thenhave neqLR: "val D I φ [\<lambda>''x'':Tv. T]≠ val D I φ [\<lambda>''x'':Tv. xo]" by metis have"val D I φ F = boolean (val D I φ ([\<lambda>''x'':Tv. T]) = val D I φ [\<lambda>''x'':Tv. xo])" using lemma_5401_b_variant_1[OF assms(1,2),
of "oo""([\<lambda>''x'':Tv. T])""[\<lambda>''x'':Tv. xo]"] assms by auto also have"... = boolean False" using neqLR by auto also have"... = false" unfolding boolean_def by auto finally show ?thesis by auto qed
lemma asg_into_interp_fun_upd_true: assumes"general_model D I" assumes"asg_into_interp φ D I" shows"asg_into_interp (φ((x, Tv) := true)) D I" using asg_into_interp_fun_upd[OF assms wff_T, of x] lemma_5401_c[OF assms(1,2)] by auto
lemma asg_into_interp_fun_upd_false: assumes"general_model D I" assumes"asg_into_interp φ D I" shows"asg_into_interp (φ((x, Tv) := false)) D I" using asg_into_interp_fun_upd[OF assms wff_F, of x] lemma_5401_d[OF assms] by auto
(* Corresponds to Andrews' lemma 5401 e_1 *) lemma lemma_5401_e_1: assumes"general_model D I" assumes"asg_into_interp φ D I" shows"(val D I φ Con_sym) ⋅ true ⋅ true = true" proof - define φ' where"φ' ≡ φ((''x'',Tv) := val D I φ T)" define φ'' where"φ'' ≡ φ'((''y'',Tv) := val D I φ' T)" define φ''' where"φ''' ≡ λz. φ''((''g'', ooo) := z)" have φ'_asg_into: "asg_into_interp φ' D I" unfolding φ'_defusing asg_into_interp_fun_upd[OF assms wff_T] by blast have φ''_asg_into: "asg_into_interp φ'' D I" unfolding φ''_defusing asg_into_interp_fun_upd[OF assms(1) φ'_asg_into wff_T] by blast
have"(val D I φ Con_sym) ⋅ true ⋅ true = val D I φ (Con_sym \<cdot> T \<cdot> T)" using lemma_5401_c[OF assms(1,2)] by auto also have"... = val D I φ ([\<lambda>''x'':Tv. [\<lambda>''y'':Tv. [[\<lambda>''g'':ooo. gooo\<cdot> T \<cdot> T]=(Tv \<Leftarrow> ooo)=[\<lambda>''g'':ooo. gooo\<cdot> xo\<cdot> yo]]]]\<cdot> T \<cdot> T)" unfolding Con_sym_def by auto also have"... = (val D I φ (([\<lambda>''x'':Tv. [\<lambda>''y'':Tv. [[\<lambda>''g'':ooo. gooo\<cdot> T \<cdot> T]=(Tv \<Leftarrow> ooo)=[\<lambda>''g'':ooo. gooo\<cdot> xo\<cdot> yo]]]]\<cdot> T))) ⋅ val D I φ T" by simp also have"... = (val D I (φ((''x'',Tv) := val D I φ T)) (([\<lambda>''y'':Tv. [[\<lambda>''g'':ooo. gooo\<cdot> T \<cdot> T]=(Tv \<Leftarrow> ooo)=[\<lambda>''g'':ooo. gooo\<cdot> xo\<cdot> yo]]]))) ⋅ val D I φ T" by (metis lemma_5401_a[OF assms(1,2)] wff_Con_sym_subterm2 wff_T) also have"... = (val D I φ' (([\<lambda>''y'':Tv. [[\<lambda>''g'':ooo. gooo\<cdot> T \<cdot> T]=(Tv \<Leftarrow> ooo)=[\<lambda>''g'':ooo. gooo\<cdot> xo\<cdot> yo]]])))⋅ val D I φ T" unfolding φ'_def .. also have"... = (val D I φ' (([\<lambda>''y'':Tv. [[\<lambda>''g'':ooo. gooo\<cdot> T \<cdot> T]=(Tv \<Leftarrow> ooo)=[\<lambda>''g'':ooo. gooo\<cdot> xo\<cdot> yo]]])))⋅ val D I φ' T" using φ'_asg_into assms(2) lemma_5401_c[OF assms(1)] by auto also have"... = (val D I φ' ([\<lambda>''y'':Tv. [[\<lambda>''g'':ooo. gooo\<cdot> T \<cdot> T]=(Tv \<Leftarrow> ooo)=[\<lambda>''g'':ooo. gooo\<cdot> xo\<cdot> yo]]]\<cdot> T))" by simp also have"... = (val D I (φ'((''y'',Tv) := val D I φ' T)) ([[\<lambda>''g'':ooo. gooo\<cdot> T \<cdot> T]=(Tv \<Leftarrow> ooo)=[\<lambda>''g'':ooo. gooo\<cdot> xo\<cdot> yo]]))" by (meson φ'_asg_into assms(1) lemma_5401_a[OF assms(1)] wff_Con_sym_subterm1 wff_T) also have"... = (val D I φ'' ([[\<lambda>''g'':ooo. gooo\<cdot> T \<cdot> T]=(Tv \<Leftarrow> ooo)=[\<lambda>''g'':ooo. gooo\<cdot> xo\<cdot> yo]]))" unfolding φ''_def .. also have"... = true" proof (rule lemma_5401_b_variant_2[OF assms(1)]) show"wff (Tv \<Leftarrow> ooo) [\<lambda>''g'':ooo. gooo\<cdot> T \<cdot> T]" by auto next show"wff (Tv \<Leftarrow> ooo) [\<lambda>''g'':ooo. gooo\<cdot> xo\<cdot> yo]" by auto next show"asg_into_frame φ'' D" using φ''_asg_into by blast next have"val D I φ'' [\<lambda>''g'':ooo. gooo\<cdot> T \<cdot> T] = abstract (D ooo) (D Tv) (λz. val D I (φ''((''g'', ooo) := z)) (gooo\<cdot> T \<cdot> T))" by (simp only: val.simps(4) type_of.simps type_sym.case) also have"... = abstract (D ooo) (D Tv) (λz. val D I (φ''' z) (gooo\<cdot> T \<cdot> T))" unfolding φ'''_def .. also have"... = abstract (D ooo) (D Tv) (λz. val D I (φ''' z) gooo⋅ val D I (φ''' z) T ⋅ val D I (φ''' z) T)" unfolding val.simps(3) .. also have"... = abstract (D ooo) (D Tv) (λz. val D I (φ''' z) gooo⋅ true ⋅ true)" proof (rule abstract_extensional') fix x assume"x ∈: D ooo" thenhave"val D I (φ''' x) (gooo\<cdot> T \<cdot> T) ∈: D Tv" using φ'''_def φ''_asg_into asg_into_frame_fun_upd assms(1)
general_model.elims(2) type_sym.inject wff_Abs_type_of wff_Con_sym_subterm0 wff_T by (metis wff_App wff_Var) thenshow"val D I (φ''' x) gooo⋅ val D I (φ''' x) T ⋅ val D I (φ''' x) T ∈: D Tv" by simp next fix x assume"x ∈: D ooo" thenhave"val D I (φ''' x) T = true" unfolding φ'''_defusing φ''_asg_into asg_into_frame_fun_upd
lemma_5401_c[OF assms(1)] by blast thenshow"val D I (φ''' x) gooo⋅ val D I (φ''' x) T ⋅ val D I (φ''' x) T = val D I (φ''' x) gooo⋅ true ⋅ true"by auto qed also have"... = abstract (D ooo) (D Tv) (λz. val D I (φ''' z) gooo⋅ val D I (φ''' z) xo⋅ val D I (φ''' z) yo)" proof (rule abstract_extensional') fix x assume x_in_D: "x ∈: D ooo" thenhave"val D I (φ''' x) (gooo\<cdot> T \<cdot> T) ∈: D Tv" using φ'''_def φ''_asg_into asg_into_frame_fun_upd assms(1)
general_model.elims(2) type_sym.inject wff_Abs_type_of wff_Con_sym_subterm0 wff_T by (metis wff_App wff_Var) thenhave"val D I (φ''' x) gooo⋅ val D I (φ''' x) T ⋅ val D I (φ''' x) T ∈: D Tv" by simp thenshow"val D I (φ''' x) gooo⋅ true ⋅ true ∈: D Tv" by (metis φ'''_def φ''_asg_into lemma_5401_c[OF assms(1)] asg_into_frame_fun_upd x_in_D) next fix x assume x_in_D: "x ∈: D ooo" thenhave"val D I (φ''' x) xo = true" unfolding φ'''_def φ''_def φ'_defusing lemma_5401_c[OF assms(1,2)] by auto moreover from x_in_D have"val D I (φ''' x) yo = true" unfolding φ'''_def φ''_defusing φ'_asg_into lemma_5401_c[OF assms(1)] by auto ultimately show"val D I (φ''' x) gooo⋅ true ⋅ true = val D I (φ''' x) gooo⋅ val D I (φ''' x) xo⋅ val D I (φ''' x) yo" by auto qed also have"... = abstract (D ooo) (D Tv) (λz. val D I (φ''' z) (gooo\<cdot> xo\<cdot> yo))" unfolding val.simps(3) .. also have"... = abstract (D ooo) (D Tv) (λz. val D I (φ''((''g'', ooo) := z)) (gooo\<cdot> xo\<cdot> yo))" unfolding φ'''_def .. also have"... = val D I φ'' [\<lambda>''g'':ooo. gooo\<cdot> xo\<cdot> yo]" by (simp only: val.simps(4) type_of.simps type_sym.case) finally show"val D I φ'' [\<lambda>''g'':ooo. gooo\<cdot> T \<cdot> T] = val D I φ'' [\<lambda>''g'':ooo. gooo\<cdot> xo\<cdot> yo]"
. qed finallyshow ?thesis . qed
(* Corresponds to Andrews' lemma 5401 e_2 *) lemma lemma_5401_e_2: assumes"general_model D I" assumes"asg_into_interp φ D I" assumes"y = true ∨ y = false" shows"(val D I φ Con_sym) ⋅ false ⋅ y = false" proof - define give_x :: trm where"give_x = [\<lambda>''y'':Tv. xo]" define give_fst :: trm where"give_fst = [\<lambda> ''x'':Tv. give_x]" define val_give_fst :: 's where"val_give_fst = val D I φ give_fst" have wff_give_x: "wff oo give_x" unfolding give_x_def by auto
have"∧a b. a ∈: D Tv ==> b ∈: D Tv ==> val D I (φ((''x'', Tv) := a)) give_x ∈: D (type_of give_x)" using wff_give_x asg_into_frame_def assms(1,2) by auto moreover have"∧a b. a ∈: D Tv ==> b ∈: D Tv ==> val D I (φ((''x'', Tv) := a)) give_x ⋅ b = a" unfolding give_x_def by auto ultimately have"∧a b. a ∈: D Tv ==> b ∈: D Tv ==> abstract (D Tv) (D (type_of give_x)) (λz. val D I (φ((''x'', Tv) := z)) give_x) ⋅a ⋅ b = a" by auto thenhave val_give_fst_simp: "∧a b. a ∈: D Tv ==> b ∈: D Tv ==> val_give_fst ⋅ a ⋅b = a" unfolding val_give_fst_def give_fst_def by auto
have wff_give_fst: "wff ooo give_fst" unfolding give_fst_def give_x_def by auto thenhave val_give_fst_fun: "val_give_fst ∈: D ooo" unfolding val_give_fst_def using assms by auto
have"val D I (φ((''x'', Tv) := false, (''y'', Tv) := y, (''g'', ooo) := val_give_fst)) T ∈: D Tv" by (smt Pair_inject wff_give_fst assms(1,2,3) fun_upd_twist general_model.simps
asg_into_interp_fun_upd[OF assms(1,2)] asg_into_interp_fun_upd_true[OF assms(1)]
asg_into_interp_fun_upd_false[OF assms(1)] type_sym.distinct(5) val_give_fst_def wff_T) thenhave val_give_fst_D: "val_give_fst ⋅ val D I (φ((''x'', Tv) := false, (''y'', Tv) := y, (''g'', ooo) := val_give_fst)) T ⋅ val D I (φ((''x'', Tv) := false, (''y'', Tv) := y, (''g'', ooo) := val_give_fst)) T ∈: D Tv" using val_give_fst_simp[of "val D I (φ((''x'', Tv) := false, (''y'', Tv) := y, (''g'', ooo) := val_give_fst)) T" "val D I (φ((''x'', Tv) := false, (''y'', Tv) := y, (''g'', ooo) := val_give_fst)) T" ] by auto
have false_y_TV: "false ∈: D Tv ∧ y ∈: D Tv" using assms(1) assms(3) wf_frame_def wf_interp.simps by auto thenhave val_give_fst_in_D: "val_give_fst ⋅ false ⋅ y ∈: D Tv" using val_give_fst_simp by auto
have"true ∈: D Tv" by (metis assms(1) assms(2) general_model.simps lemma_5401_c[OF assms(1,2)] wff_T) from this val_give_fst_in_D false_y_TV have"val_give_fst ⋅ true ⋅ true ≠ val_give_fst ⋅ false ⋅ y" using val_give_fst_simp true_neq_false by auto thenhave val_give_fst_not_false: "val_give_fst ⋅ val D I (φ((''x'', Tv) := false, (''y'', Tv) := y, (''g'', ooo) := val_give_fst)) T ⋅ val D I (φ((''x'', Tv) := false, (''y'', Tv) := y, (''g'', ooo) := val_give_fst)) T ≠ val_give_fst ⋅ false ⋅ y" using asg_into_frame_fun_upd assms(1) assms(2) lemma_5401_c false_y_TV val_give_fst_fun by auto have Con_sym_subterm0TT_neq_Con_sym_subterm0xy: "val D I (φ((''x'', Tv) := false, (''y'', Tv) := y)) [\<lambda>''g'':ooo. gooo\<cdot> T \<cdot> T]≠ val D I (φ((''x'', Tv) := false, (''y'', Tv) := y)) [\<lambda>''g'':ooo. gooo\<cdot> xo\<cdot> yo]" using abstract_cong_specific[of
val_give_fst "(D ooo)" "(λz. z ⋅ val D I (φ((''x'', Tv) := false, (''y'', Tv) := y, (''g'', ooo) := z)) T ⋅ val D I (φ((''x'', Tv) := false, (''y'', Tv) := y, (''g'', ooo) := z)) T)" "(D Tv)" "(λz. z ⋅ false ⋅ y)"] using val_give_fst_fun val_give_fst_D val_give_fst_in_D val_give_fst_not_false by auto
have"asg_into_frame (φ((''x'', Tv) := false, (''y'', Tv) := y)) D" using asg_into_interp_fun_upd_false[OF assms(1)] general_model.simps[of D I] assms wff_Con_sym_subterm1
asg_into_interp_fun_upd_true[OF assms(1)] by auto thenhave val_Con_sym_subterm1: "val D I (φ((''x'', Tv) := false, (''y'', Tv) := y))[[\<lambda>''g'':ooo. gooo\<cdot> T \<cdot> T]=(Tv \<Leftarrow> ooo)=[\<lambda>''g'':ooo. gooo\<cdot> xo\<cdot> yo]] = false" using Con_sym_subterm0TT_neq_Con_sym_subterm0xy lemma_5401_b_variant_3[OF assms(1)] by auto
have"y ∈: D Tv" using general_model.simps lemma_5401_d[OF assms(1,2)] wff_F assms by (metis lemma_5401_c[OF assms(1,2)] wff_T) moreover have"val D I (φ((''x'', Tv) := false, (''y'', Tv) := y)) [[\<lambda>''g'':ooo. gooo\<cdot> T \<cdot> T]=(Tv \<Leftarrow> ooo)=[\<lambda>''g'':ooo. gooo\<cdot> xo\<cdot> yo]]∈: D Tv" using asg_into_interp_fun_upd_false[OF assms(1)] general_model.simps[of D I] assms wff_Con_sym_subterm1
asg_into_interp_fun_upd_true[OF assms(1)] by auto moreover have"val D I (φ((''x'', Tv) := false, (''y'', Tv) := y)) [[\<lambda>''g'':ooo. gooo\<cdot> T \<cdot> T]=(Tv \<Leftarrow> ooo)=[\<lambda>''g'':ooo. gooo\<cdot> xo\<cdot> yo]] = false" using val_Con_sym_subterm1 by auto ultimately have val_y: "(val D I (φ((''x'', Tv) := false)) [\<lambda> ''y'':Tv. [[\<lambda>''g'':ooo. gooo\<cdot> T \<cdot> T]=(Tv \<Leftarrow> ooo)=[\<lambda>''g'':ooo. gooo\<cdot> xo\<cdot> yo]]]) ⋅ y = false" by simp
have11: "val D I (φ((''x'', Tv) := false)) [\<lambda> ''y'':Tv. [[\<lambda>''g'':ooo. gooo\<cdot> T \<cdot> T]=(Tv \<Leftarrow> ooo)=[\<lambda>''g'':ooo. gooo\<cdot> xo\<cdot> yo]]]∈: D oo" using asg_into_interp_fun_upd_false[OF assms(1,2)] general_model.simps[of D I] assms
wff_Con_sym_subterm2 by blast moreover have"val D I (φ((''x'', Tv) := false)) [\<lambda> ''y'':Tv. [[\<lambda>''g'':ooo. gooo\<cdot> T \<cdot> T]=(Tv \<Leftarrow> ooo)=[\<lambda>''g'':ooo. gooo\<cdot> xo\<cdot> yo]]]⋅ y = false" using val_y by auto ultimately have"(val D I φ [\<lambda>''x'':Tv. [\<lambda> ''y'':Tv. [[\<lambda>''g'':ooo. gooo\<cdot> T \<cdot> T]=(Tv \<Leftarrow> ooo)=[\<lambda>''g'':ooo. gooo\<cdot> xo\<cdot> yo]]]]) ⋅ false ⋅ y = false" using false_y_TV by simp thenshow"(val D I φ Con_sym) ⋅ false ⋅ y = false" unfolding Con_sym_def by auto qed
(* Corresponds to Andrews' lemma 5401 e_3 *) lemma lemma_5401_e_3: assumes"general_model D I" assumes"asg_into_interp φ D I" assumes"x = true ∨ x = false" shows"(val D I φ Con_sym) ⋅ x ⋅ false = false" proof - (* proof adapted from lemma_5401_e_2 *) define give_y :: trm where"give_y = ([\<lambda> ''y'':Tv. yo])" define give_snd :: trm where"give_snd = [\<lambda> ''x'':Tv. give_y]" define val_give_snd :: 's where"val_give_snd = val D I φ give_snd" have wff_give_y: "wff oo give_y" unfolding give_y_def by auto
have"∧a b. a ∈: D Tv ==> b ∈: D Tv ==> a ∈: D Tv" by simp moreover have"∧a b. a ∈: D Tv ==> b ∈: D Tv ==> val D I (φ((''x'', Tv) := a)) give_y ∈: D (type_of give_y)" using wff_give_y asg_into_frame_def assms(1) assms(2) by auto moreover have"∧a b. a ∈: D Tv ==> b ∈: D Tv ==> val D I (φ((''x'', Tv) := a)) give_y ⋅ b = b" unfolding give_y_def by auto ultimately have val_give_snd_simp: "∧a b. a ∈: D Tv ==> b ∈: D Tv ==> val_give_snd ⋅ a ⋅ b = b" unfolding val_give_snd_def give_snd_def by auto
have wff_give_snd: "wff ooo give_snd" unfolding give_snd_def give_y_def by auto thenhave val_give_snd_in_D: "val_give_snd ∈: D ooo" unfolding val_give_snd_def using assms by auto
thenhave"val D I (φ((''x'', Tv) := x, (''y'', Tv) := false, (''g'', ooo) := val_give_snd)) T ∈: D Tv" by (smt Pair_inject wff_give_snd assms(1,2,3)
fun_upd_twist general_model.simps asg_into_interp_fun_upd[OF assms(1,2)]
asg_into_interp_fun_upd_false[OF assms(1)] asg_into_interp_fun_upd_true[OF assms(1)]
type_sym.distinct(5) val_give_snd_def wff_T) thenhave val_give_snd_app_in_D: "val_give_snd ⋅ val D I (φ((''x'', Tv) := x, (''y'', Tv) := false, (''g'', ooo) := val_give_snd)) T ⋅ val D I (φ((''x'', Tv) := x, (''y'', Tv) := false, (''g'', ooo) := val_give_snd)) T ∈: D Tv" using val_give_snd_simp[of "val D I (φ((''x'', Tv) := x, (''y'', Tv) := false, (''g'', ooo) := val_give_snd)) T" "val D I (φ((''x'', Tv) := x, (''y'', Tv) := false, (''g'', ooo) := val_give_snd)) T" ] by auto
have false_and_x_in_D: "false ∈: D Tv ∧ x ∈: D Tv" using assms(1,3) wf_frame_def wf_interp.simps by auto thenhave val_give_snd_app_x_false_in_D: "val_give_snd ⋅ x ⋅ false ∈: D Tv" using val_give_snd_simp by auto
have"true ∈: D Tv" by (metis assms(1) assms(2) general_model.simps lemma_5401_c[OF assms(1,2)] wff_T) thenhave"val_give_snd ⋅ true ⋅ true ≠ val_give_snd ⋅ x ⋅ false" using val_give_snd_simp true_neq_false val_give_snd_app_in_D false_and_x_in_D by auto thenhave "val_give_snd ⋅ val D I (φ((''x'', Tv) := x, (''y'', Tv) := false, (''g'', ooo) := val_give_snd)) T ⋅ val D I (φ((''x'', Tv) := x, (''y'', Tv) := false, (''g'', ooo) := val_give_snd)) T ≠ val_give_snd ⋅ x ⋅ false" using asg_into_frame_fun_upd assms(1) assms(2) lemma_5401_c false_and_x_in_D val_give_snd_in_D by auto thenhave"val D I (φ((''x'', Tv) := x, (''y'', Tv) := false)) [\<lambda>''g'':ooo. gooo\<cdot> T \<cdot> T]≠ val D I (φ((''x'', Tv) := x, (''y'', Tv) := false)) [\<lambda>''g'':ooo. gooo\<cdot> xo\<cdot> yo]" using abstract_cong_specific[of
val_give_snd "(D ooo)" "(λz. z ⋅ val D I (φ((''x'', Tv) := x, (''y'', Tv) := false, (''g'', ooo) := z)) T ⋅ val D I (φ((''x'', Tv) := x, (''y'', Tv) := false, (''g'', ooo) := z)) T)" "(D Tv)" "(λz. z ⋅ x ⋅ false)"
] using val_give_snd_in_D val_give_snd_app_x_false_in_D val_give_snd_app_in_D by auto thenhave"val D I (φ((''x'', Tv) := x, (''y'', Tv) := false)) [[\<lambda>''g'':ooo. gooo\<cdot> T \<cdot> T]=(Tv \<Leftarrow> ooo)=[\<lambda>''g'':ooo. gooo\<cdot> xo\<cdot> yo]] = false" using asg_into_frame_fun_upd assms(1,2) lemma_5401_b_variant_3 false_and_x_in_D by auto thenhave val_Con_sym_subterm2_false: "(val D I (φ((''x'', Tv) := x)) [\<lambda> ''y'':Tv. [[\<lambda>''g'':ooo. gooo\<cdot> T \<cdot> T]=(Tv \<Leftarrow> ooo)=[\<lambda>''g'':ooo. gooo\<cdot> xo\<cdot> yo]]]) ⋅ false = false" using false_and_x_in_D by simp
have"x ∈: D Tv" by (simp add: false_and_x_in_D) moreover have"val D I (φ((''x'', Tv) := x)) [\<lambda> ''y'':Tv. [[\<lambda>''g'':ooo. gooo\<cdot> T \<cdot> T]=(Tv \<Leftarrow> ooo)=[\<lambda>''g'':ooo. gooo\<cdot> xo\<cdot> yo]]]∈: D oo" by (metis assms(1,3) general_model.simps lemma_5401_c[OF assms(1,2)]
asg_into_interp_fun_upd[OF assms(1,2)] asg_into_interp_fun_upd_false[OF assms(1,2)]
wff_Con_sym_subterm2 wff_T) moreover have"val D I (φ((''x'', Tv) := x)) [\<lambda> ''y'':Tv. [[\<lambda>''g'':ooo. gooo\<cdot> T \<cdot> T]=(Tv \<Leftarrow> ooo)=[\<lambda>''g'':ooo. gooo\<cdot> xo\<cdot> yo]]]⋅ false = false" using val_Con_sym_subterm2_false by auto ultimately have"(val D I φ [\<lambda>''x'':Tv. [\<lambda> ''y'':Tv. [[\<lambda>''g'':ooo. gooo\<cdot> T \<cdot> T]=(Tv \<Leftarrow> ooo)=[\<lambda>''g'':ooo. gooo\<cdot> xo\<cdot> yo]]]]) ⋅ x ⋅ false = false" by auto thenshow"(val D I φ Con_sym) ⋅ x ⋅ false = false" unfolding Con_sym_def by auto qed
(* Corresponds to Andrews' lemma 5401 e *) lemma lemma_5401_e_variant_1: assumes"asg_into_interp φ D I" assumes"general_model D I" assumes"y = true ∨ y = false" assumes"x = true ∨ x = false" shows"(val D I φ Con_sym) ⋅ x ⋅ y = boolean (x = true ∧ y = true)" proof (cases "y = true") case True note True_outer = this thenshow ?thesis proof (cases "x = true") case True thenshow ?thesis using True_outer assms lemma_5401_e_1 unfolding boolean_def by auto next case False thenshow ?thesis using True_outer assms lemma_5401_e_2 unfolding boolean_def by auto qed next case False note False_outer = this thenshow ?thesis proof (cases "x = true") case True thenshow ?thesis using False_outer assms lemma_5401_e_3 unfolding boolean_def by auto next case False thenshow ?thesis using False_outer assms lemma_5401_e_2 unfolding boolean_def by auto qed qed
lemma asg_into_interp_is_true_or_false: assumes"general_model D I" assumes"asg_into_interp φ D I" shows"φ (x, Tv) = true ∨ φ (x, Tv) = false" proof - have"wff Tv (Var x Tv)" by auto thenhave"val D I φ (Var x Tv) ∈: D Tv" using assms general_model.simps by blast thenhave"val D I φ (Var x Tv) ∈: boolset" using assms unfolding general_model.simps wf_interp.simps wf_frame_def by auto thenshow ?thesis using mem_boolset by simp qed
lemma wff_Tv_is_true_or_false: assumes"asg_into_interp φ D I" assumes"general_model D I" assumes"wff Tv A" shows"val D I φ A = true ∨ val D I φ A = false" proof - have"val D I φ A ∈: D Tv" using assms by auto thenhave"val D I φ A ∈: boolset" using assms unfolding general_model.simps wf_interp.simps wf_frame_def by force thenshow ?thesis using mem_boolset by blast qed
(* Corresponds to Andrews' lemma 5401 e *) lemma lemma_5401_e_variant_2: assumes"asg_into_interp φ D I" assumes"general_model D I" assumes"wff Tv A" assumes"wff Tv B" shows"(val D I φ (A \<and> B)) = boolean (satisfies D I φ A ∧ satisfies D I φ B)" using assms wff_Tv_is_true_or_false[of φ D I] lemma_5401_e_variant_1 unfolding Con_def by auto
(* Corresponds to Andrews' lemma 5401 f_1 *) lemma lemma_5401_f_1: assumes"general_model D I" assumes"asg_into_interp φ D I" assumes"y = true ∨ y = false" shows"(val D I φ Imp_sym) ⋅ false ⋅ y = true" proof - define Imp_subterm2 :: trm where "Imp_subterm2 ≡[\<lambda> ''y'':Tv. [xo=Tv= (xo\<and> yo)]]"
have val_Imp_subterm0_false: "val D I (φ((''x'', Tv) := false, (''y'', Tv) := y)) (xo\<and> yo) = false" using assms asg_into_interp_fun_upd_false[OF assms(1)] asg_into_interp_fun_upd_true[OF assms(1)]
boolean_def lemma_5401_e_variant_2 by auto
have"asg_into_frame (φ((''x'', Tv) := false, (''y'', Tv) := y)) D" using assms(1, 2, 3) lemma_5401_c[OF assms(1)] asg_into_interp_fun_upd wff_T
asg_into_interp_fun_upd_false by metis thenhave"val D I (φ((''x'', Tv) := false, (''y'', Tv) := y)) [xo=Tv= (xo\<and> yo)] = true" using lemma_5401_b_variant_1[OF assms(1)] val_Imp_subterm0_false unfolding boolean_def by auto thenhave val_Imp_subterm2_true: "(val D I (φ((''x'', Tv) := false)) [\<lambda> ''y'':Tv. [xo=Tv= (xo\<and> yo)]]) ⋅ y = true" using assms(1,3) wf_frame_def wf_interp.simps by auto
have"val D I φ [\<lambda> ''x'':Tv. [\<lambda> ''y'':Tv. [xo=Tv= (xo\<and> yo)]]]⋅ false ⋅ y = true" proof - have"false ∈: D Tv" by (metis asg_into_frame_def asg_into_interp_fun_upd_false assms(1) assms(2) fun_upd_same) thenhave"val D I (φ((''x'', Tv) := false)) [\<lambda> ''y'':Tv. [xo=Tv= (xo\<and> yo)]] = val D I φ [\<lambda>''x'':Tv. [\<lambda> ''y'':Tv. [xo=Tv= (xo\<and> yo)]]]⋅ false" using asg_into_interp_fun_upd_false assms(1,2) Imp_subterm2_def[symmetric] wff_Imp_sym_subterm2_iff by force thenshow ?thesis by (metis val_Imp_subterm2_true) qed thenshow"(val D I φ Imp_sym) ⋅ false ⋅ y = true" unfolding Imp_sym_def Imp_subterm2_def by auto qed
(* Corresponds to Andrews' lemma 5401 f_2 *) lemma lemma_5401_f_2: assumes"general_model D I" assumes"asg_into_interp φ D I" assumes"x = true ∨ x = false" shows"(val D I φ Imp_sym) ⋅ x ⋅ true = true" proof - have asg: "asg_into_frame (φ((''x'', Tv) := x, (''y'', Tv) := true)) D" using assms(1,2,3) asg_into_interp_fun_upd_false asg_into_interp_fun_upd_true[OF assms(1)] by blast thenhave"val D I (φ((''x'', Tv) := x, (''y'', Tv) := true)) (xo\<and> yo) = x" using lemma_5401_e_variant_2 assms unfolding boolean_def by auto thenhave val_Imp_subterm1_true: "val D I (φ((''x'', Tv) := x, (''y'', Tv) := true))[xo=Tv= (xo\<and> yo)] = true" using asg lemma_5401_b_variant_1[OF assms(1)] boolean_eq_true by auto
have val_Imp_subterm2_true: "val D I (φ((''x'', Tv) := x)) [\<lambda> ''y'':Tv. [xo=Tv= (xo\<and> yo)]]⋅ true = true" using val_Imp_subterm1_true assms(1) wf_frame_def wf_interp.simps by auto
have"x ∈: D Tv" by (metis asg_into_frame_def assms(1) assms(3) fun_upd_same asg_into_interp_fun_upd_false
asg_into_interp_fun_upd_true[OF assms(1,2)]) moreover have"val D I (φ((''x'', Tv) := x)) [\<lambda> ''y'':Tv. [xo=Tv= (xo\<and> yo)]]∈: D oo" using wff_Imp_sym_subterm2 by (metis assms(1,2,3) general_model.simps lemma_5401_c[OF assms(1,2)]
asg_into_interp_fun_upd[OF assms(1,2)] asg_into_interp_fun_upd_false wff_T) ultimately have"(val D I φ [\<lambda>''x'':Tv. [\<lambda> ''y'':Tv. [xo=Tv= (xo\<and> yo)]]])⋅ x ⋅ true = true" using val_Imp_subterm2_true by auto thenshow"(val D I φ Imp_sym) ⋅ x ⋅ true = true" unfolding Imp_sym_def by auto qed
(* Corresponds to Andrews' lemma 5401 f_3 *) lemma lemma_5401_f_3: assumes"general_model D I" assumes"asg_into_interp φ D I" shows"(val D I φ Imp_sym) ⋅ true ⋅ false = false" proof - have asg: "asg_into_frame (φ((''x'', Tv) := true, (''y'', Tv) := false)) D" by (meson assms(1,2) asg_into_interp_fun_upd_false asg_into_interp_fun_upd_true) moreover have"false = true ∨ false = false" unfolding boolean_def by auto moreover have"boolean (true = true ∧ false = true) = false" unfolding boolean_def by auto ultimately have3: "val D I (φ((''x'', Tv) := true, (''y'', Tv) := false)) (xo\<and> yo) = false" using lemma_5401_e_variant_2 assms by auto thenhave Imp_subterm1_false: "val D I (φ((''x'', Tv) := true, (''y'', Tv) := false)) [xo=Tv= (xo\<and> yo)] = false" using subst lemma_5401_b_variant_1[OF assms(1)] asg boolean_def by auto
have asdff: "wff Tv [xo=Tv= (xo\<and> yo)]" by auto
have false_Tv: "false ∈: D Tv" using assms(1) wf_frame_def wf_interp.simps by auto moreover have"val D I (φ((''x'', Tv) := true, (''y'', Tv) := false)) [xo=Tv= (xo\<and> yo)]∈: D Tv" by (simp add: Imp_subterm1_false false_Tv) moreover have"val D I (φ((''x'', Tv) := true, (''y'', Tv) := false)) [xo=Tv= (xo\<and> yo)] = false" using Imp_subterm1_false by auto ultimately have Imp_subterm2_app_false: "val D I (φ((''x'', Tv) := true)) [\<lambda> ''y'':Tv. [xo=Tv= (xo\<and> yo)]]⋅ false = false" by auto
have wff_Imp_sym_subterm2: "wff oo [\<lambda> ''y'':Tv. [xo=Tv= (xo\<and> yo)]]" by auto
have"(val D I φ [\<lambda> ''x'':Tv. [\<lambda> ''y'':Tv. [xo=Tv= (xo\<and> yo)]]]) ⋅ true ⋅ false = false" proof - have"true ∈: D Tv" by (metis assms(1) assms(2) general_model.simps lemma_5401_c[OF assms(1,2)] wff_T) moreover have"val D I (φ((''x'', Tv) := true)) [\<lambda> ''y'':Tv. [xo=Tv= (xo\<and> yo)]]∈: D oo" using wff_Imp_sym_subterm2 by (metis assms(1) general_model.simps asg_into_interp_fun_upd_true[OF assms(1,2)]) moreover have"val D I (φ((''x'', Tv) := true)) [\<lambda> ''y'':Tv. [xo=Tv= (xo\<and> yo)]]⋅ false = false" using Imp_subterm2_app_false by auto ultimately show ?thesis by auto qed thenshow"(val D I φ Imp_sym) ⋅ true ⋅ false = false" unfolding Imp_sym_def by auto qed
(* Corresponds to Andrews' lemma 5401 f *) lemma lemma_5401_f_variant_1: assumes"asg_into_interp φ D I" assumes"general_model D I" assumes"x = true ∨ x = false" assumes"y = true ∨ y = false" shows"(val D I φ Imp_sym) ⋅ x ⋅ y = boolean (x = true ⟶ y = true)" proof (cases "y = true") case True note True_outer = this thenshow ?thesis proof (cases "x = true") case True thenshow ?thesis using True_outer assms lemma_5401_f_2 unfolding boolean_def by auto next case False thenshow ?thesis using True_outer assms lemma_5401_f_2 unfolding boolean_def by auto qed next case False note False_outer = this thenshow ?thesis proof (cases "x = true") case True thenshow ?thesis using False_outer assms lemma_5401_f_3 unfolding boolean_def by auto next case False thenshow ?thesis using False_outer assms lemma_5401_f_1 unfolding boolean_def by auto qed qed
(* Corresponds to Andrews' lemma 5401 f *) lemma lemma_5401_f_variant_2: assumes"asg_into_interp φ D I" assumes"general_model D I" assumes"wff Tv A" assumes"wff Tv B" shows"(val D I φ (A \<longrightarrow> B)) = boolean (satisfies D I φ A ⟶ satisfies D I φ B)" using assms unfolding Imp_def by (simp add: lemma_5401_f_variant_1 wff_Tv_is_true_or_false)
(* Corresponds to Andrews' lemma 5401 g *) lemma lemma_5401_g: assumes"general_model D I" assumes"asg_into_interp φ D I" assumes"wff Tv A" shows"satisfies D I φ [\<forall>x:α. A]⟷ (∀ψ. asg_into_interp ψ D I ⟶ agree_off_asg ψ φ x α ⟶ satisfies D I ψ A)" proof - have"wff (Tv \<Leftarrow> α) [\<lambda> ''x'':α. T]" by auto thenhave PI_subterm_in_D: "val D I φ [\<lambda> ''x'':α. T]∈: D (Tv \<Leftarrow> α)" using assms(1,2) general_model.simps by blast
have"wff (Tv \<Leftarrow> α) ([\<lambda>x:α. A])" using assms by auto moreover have"∀φ. asg_into_frame φ D ⟶ (∀A α. wff α A ⟶ val D I φ A ∈: D α)" using assms(1) by auto thenhave"∀t cs. val D I φ [\<lambda>cs:t. A]∈: D (Tv \<Leftarrow> t)" using wff_Abs assms(1,2,3) by presburger thenhave"abstract (D α) (D Tv) (λu. val D I (φ((x, α) := u)) A) ∈: D (Tv \<Leftarrow> α)" using assms(3) by simp ultimately have val_lambda_A: "val D I φ ([\<lambda>x:α. A]) ∈: D (Tv \<Leftarrow> α)" using assms by auto
have true_and_A_in_D: "∀z. z ∈: D α ⟶ true ∈: D Tv ∧ val D I (φ((x, α) := z)) A ∈: D Tv" by (metis assms(1,2,3) general_model.simps lemma_5401_c[OF assms(1,2)] asg_into_frame_fun_upd wff_T)
have"satisfies D I φ [\<forall> x: α. A]⟷ val D I φ [\<forall>x: α. A] = true" by auto moreoverhave"... ⟷ val D I φ (PI α) ⋅ val D I φ [\<lambda>x:α. A] = true" unfolding Forall_def by simp moreoverhave"... ⟷ I ''Q'' ((Tv \<Leftarrow> (Tv \<Leftarrow> α)) \<Leftarrow> (Tv \<Leftarrow> α)) ⋅ val D I φ [\<lambda> ''x'':α. T]⋅ val D I φ [\<lambda>x:α. A] = true" unfolding PI_def by simp moreoverhave"... ⟷ (iden (D (Tv \<Leftarrow> α))) ⋅ val D I φ [\<lambda> ''x'':α. T]⋅ val D I φ [\<lambda>x:α. A] = true" unfolding PI_def using wf_interp.simps assms by simp moreoverhave"... ⟷ val D I φ [\<lambda>''x'':α. T] = val D I φ [\<lambda>x:α. A]" using PI_subterm_in_D val_lambda_A apply_id_true by auto moreoverhave"... ⟷ abstract (D α) (D Tv) (λz. val D I (φ((''x'', α) := z)) T) = val D I φ [\<lambda>x:α. A]" using assms wff_T by simp moreoverhave"... ⟷ abstract (D α) (D Tv) (λz. true) = val D I φ [\<lambda>x:α. A]" proof - have"∀x. x ∈: D α ⟶ val D I (φ((''x'', α) := x)) T ∈: D Tv ∧ true ∈: D Tv" using true_and_A_in_D assms(1,2) asg_into_frame_fun_upd by auto moreover have"∀x. x ∈: D α ⟶ val D I (φ((''x'', α) := x)) T ∈: D Tv ∧ satisfies D I (φ((''x'', α) := x)) T" using true_and_A_in_D assms(1) assms(2) lemma_5401_c[OF assms(1)] asg_into_frame_fun_upd by auto ultimately have"abstract (D α) (D Tv) (λz. val D I (φ((''x'', α) := z)) T) = abstract (D α) (D Tv) (λz. true)" using abstract_extensional by auto thenshow ?thesis by auto qed moreoverhave"... ⟷ abstract (D α) (D Tv) (λz. true) = val D I φ ([\<lambda>x:α. A])" by auto moreoverhave"... ⟷ abstract (D α) (D Tv) (λz. true) = abstract (D α) (D Tv) (λz. val D I (φ((x, α) := z)) A)" using assms by simp moreoverhave"... ⟷ (∀z. z ∈: D α ⟶ true ∈: D Tv ∧ true = val D I (φ((x, α) := z)) A)" proof - have"∀z. z ∈: D α ⟶ true ∈: D Tv ∧ val D I (φ((x, α) := z)) A ∈: D Tv" using true_and_A_in_D by auto thenshow ?thesis using abstract_iff_extensional by auto qed moreoverhave"... ⟷ (∀z. z ∈: D α ⟶ true = val D I (φ((x, α) := z)) A)" by (metis assms(1,2) general_model.simps lemma_5401_c[OF assms(1,2)] wff_T) moreoverhave"... ⟷ (∀z. z ∈: D α ⟶ satisfies D I (φ((x, α) := z)) A)" by auto moreoverhave"... ⟷ (∀ψ. asg_into_interp ψ D I ⟶ agree_off_asg ψ φ x α ⟶ satisfies D I ψ A)" proof - show ?thesis proof assume A_sat: "∀z. z ∈: D α ⟶ satisfies D I (φ((x, α) := z)) A" show"∀ψ. asg_into_frame ψ D ⟶ agree_off_asg ψ φ x α ⟶ satisfies D I ψ A" proof (rule; rule; rule) fix ψ assume a1: "asg_into_frame ψ D" assume a2: "agree_off_asg ψ φ x α" have"∃xa. (φ((x, α) := xa)) = ψ" using a1 a2 agree_off_asg_def2 by blast thenshow"satisfies D I ψ A" using A_sat a1 a2 by (metis asg_into_frame_def fun_upd_same) qed next assume"∀ψ. asg_into_frame ψ D ⟶ agree_off_asg ψ φ x α ⟶ satisfies D I ψ A" thenshow"∀z. z ∈: D α ⟶ satisfies D I (φ((x, α) := z)) A" using asg_into_frame_fun_upd asg_into_interp_fun_upd[OF assms(1,2)] assms(2) fun_upd_other unfolding agree_off_asg_def by auto qed qed ultimatelyshow ?thesis by auto qed
(* Corresponds to Andrews' lemma 5401 g *) theorem lemma_5401_g_variant_1: assumes"asg_into_interp φ D I" assumes"general_model D I" assumes"wff Tv A" shows"val D I φ [\<forall>x:α. A] = boolean (∀ψ. asg_into_interp ψ D I ⟶ agree_off_asg ψ φ x α ⟶ satisfies D I ψ A)" proof - have"val D I φ [\<forall>x:α. A] = (if satisfies D I φ [\<forall>x:α. A] then true else false)" using assms wff_Forall wff_Tv_is_true_or_false by metis thenshow ?thesis using assms lemma_5401_g[symmetric] unfolding boolean_def by auto qed
section‹Soundness›
lemma fun_sym_asg_to_funspace: assumes"asg_into_frame φ D" assumes"general_model D I" shows"φ (f, α \<Leftarrow> β) ∈: funspace (D β) (D α)" proof - have"wff (α \<Leftarrow> β) (Var f (α \<Leftarrow> β))" by auto thenhave"val D I φ (Var f (α \<Leftarrow> β)) ∈: D (α \<Leftarrow> β)" using assms using general_model.simps by blast thenshow"φ (f, α \<Leftarrow> β) ∈: funspace (D β) (D α)" using assms unfolding general_model.simps wf_interp.simps wf_frame_def by (simp add: subs_def) qed
lemma fun_sym_interp_to_funspace: assumes"asg_into_frame φ D" assumes"general_model D I" shows"I f (α \<Leftarrow> β) ∈: funspace (D β) (D α)" proof - have"wff (α \<Leftarrow> β) (Cst f (α \<Leftarrow> β))" by auto thenhave"val D I φ (Cst f (α \<Leftarrow> β)) ∈: D (α \<Leftarrow> β)" using assms general_model.simps by blast thenshow"I f (α \<Leftarrow> β) ∈: funspace (D β) (D α)" using assms subs_def unfolding general_model.simps wf_interp.simps wf_frame_def by auto qed
(* Corresponds to Andrews' theorem 5402 a for rule R *) theorem theorem_5402_a_rule_R: assumes A_eql_B: "valid_general ([A =α= B])" assumes"valid_general C" assumes"rule_R C ([A =α= B]) C'" assumes"wff α A" assumes"wff α B" assumes"wff β C" shows"valid_general C'" unfolding valid_general_def proof (rule allI, rule allI, rule impI) fix D :: "type_sym ==> 's"and I :: "char list ==> type_sym ==> 's" assume DI: "general_model D I" thenhave"valid_in_model D I ([A =α= B])" using A_eql_B unfolding valid_general_def by auto thenhave x: "∀φ. asg_into_frame φ D ⟶ (val D I φ A = val D I φ B)" unfolding valid_in_model_def using lemma_5401_b[OF DI, of _ α A B ] assms(4,5) by auto have r: "replacement A B C C'" using assms(3) using Eql_def rule_R.cases by fastforce from r have"∀φ. asg_into_frame φ D ⟶ (val D I φ C = val D I φ C')" using x assms(4,5,6) proof (induction arbitrary: β rule: replacement.induct) case (replace A B) thenshow ?caseby auto next case (replace_App_left A B C E D') define α' where"α' = type_of C" define β' where"β' = type_of D'" show ?case proof (rule, rule) fix φ assume asg: "asg_into_frame φ D" have α': "α' = β \<Leftarrow> β'" using trm.distinct(11) trm.distinct(3,7) trm.inject(3) replace_App_left.prems(4) wff.simps by (metis α'_def β'_def wff_App_type_of) from asg have"wff α' C" using replace_App_left trm.distinct(3,7,11) trm.inject(3) wff.simps by (metis α' β'_def type_of wff_App') thenhave"val D I φ C = val D I φ E" using asg replace_App_left by auto thenshow"val D I φ (C \<cdot> D') = val D I φ (E \<cdot> D')" using α' by auto qed next case (replace_App_right A B D' E C) define α' where"α' = type_of C" define β' where"β' = type_of D'" show ?case proof (rule, rule) fix φ assume asg: "asg_into_frame φ D" have α': "α' = β \<Leftarrow> β'" using trm.distinct(11) trm.distinct(3) trm.distinct(7) trm.inject(3)
replace_App_right.prems(4) wff.simps by (metis α'_def β'_def type_of wff_App') from asg have"wff β' D'" using β'_def replace_App_right.prems(4) by fastforce thenhave"val D I φ D' = val D I φ E" using asg replace_App_right by auto thenshow"val D I φ (C \<cdot> D') = val D I φ (C \<cdot> E)" using α' by auto qed next case (replace_Abs A B C D' x α') define β' where"β' = type_of C" show ?case proof (rule, rule) fix φ assume asg: "asg_into_frame φ D" thenhave val_C_eql_val_D': "∀z. z ∈: D α' ⟶ val D I (φ((x, α') := z)) C = val D I (φ((x, α') := z)) D'" using asg replace_App_right by (metis trm.distinct(11) trm.distinct(5) trm.distinct(9) trm.inject(4)
asg_into_frame_fun_upd replace_Abs.IH replace_Abs.prems(1) replace_Abs.prems(2)
replace_Abs.prems(3) replace_Abs.prems(4) wff.cases)
have val_C_eql_val_D'_type: "∀z. z ∈: D α' ⟶ val D I (φ((x, α') := z)) C ∈: D (type_of C) ∧ val D I (φ((x, α') := z)) C = val D I (φ((x, α') := z)) D'" proof (rule; rule) fix z assume a2: "z ∈: D α'" have"val D I (φ((x, α') := z)) C ∈: D (type_of C)" using DI asg a2 asg_into_frame_fun_upd replace_Abs.prems(4) by auto moreover have"val D I (φ((x, α') := z)) C = val D I (φ((x, α') := z)) D'" using a2 val_C_eql_val_D' replace_Abs by auto ultimately show "val D I (φ((x, α') := z)) C ∈: D (type_of C) ∧ val D I (φ((x, α') := z)) C = val D I (φ((x, α') := z)) D'" by auto qed have"wff (type_of C) D'" using replacement_preserves_type replace_Abs.hyps replace_Abs.prems(2)
replace_Abs.prems(3) replace_Abs.prems(4) wff_Abs_type_of by blast thenhave same_type: "abstract (D α') (D (type_of C)) (λz. val D I (φ((x, α') := z)) D') = abstract (D α') (D (type_of D')) (λz. val D I (φ((x, α') := z)) D')" using type_of by presburger thenshow"val D I φ [\<lambda>x:α'. C] = val D I φ ([\<lambda>x:α'. D'])" using val_C_eql_val_D'_type same_type
abstract_extensional[of _ _ _ "λxa. val D I (φ((x, α') := xa)) D'"] by (simp add: val_C_eql_val_D'_type same_type) qed qed thenshow"valid_in_model D I C'" using assms(2) DI unfolding valid_in_model_def valid_general_def by auto qed
theorem Fun_Tv_Tv_frame_subs_funspace: assumes"general_model D I" assumes"asg_into_interp φ D I" shows"D oo ⊆: funspace (boolset) (boolset)" by (metis assms(1) general_model.elims(2) wf_frame_def wf_interp.simps)
(* Corresponds to Andrews' theorem 5402 a for axiom 1 *) theorem theorem_5402_a_axiom_1_variant: assumes"general_model D I" assumes"asg_into_interp φ D I" shows"satisfies D I φ axiom_1" proof (cases "(φ (''g'',oo)) ⋅ true = true ∧ (φ (''g'',oo)) ⋅ false = true") case True thenhave val: "val D I φ ((goo\<cdot> T) \<and> (goo\<cdot> F)) = true" using assms lemma_5401_e_variant_2 by (auto simp add: boolean_eq_true lemma_5401_c[OF assms(1,2)] lemma_5401_d[OF assms(1,2)]) have"∀ψ. asg_into_frame ψ D ⟶ agree_off_asg ψ φ ''x'' Tv ⟶ satisfies D I ψ (goo\<cdot> xo)" proof (rule; rule; rule) fix ψ assume ψ: "asg_into_frame ψ D""agree_off_asg ψ φ ''x'' Tv" thenhave"ψ (''x'', Tv) = true ∨ ψ (''x'', Tv) = false" using asg_into_interp_is_true_or_false assms by auto thenshow" satisfies D I ψ (goo\<cdot> xo)" using True ψ unfolding agree_off_asg_def by auto qed thenhave"val D I φ ([\<forall>''x'':Tv. (goo\<cdot> xo)]) = true" using lemma_5401_g using assms by auto thenshow ?thesis unfolding axiom_1_def using lemma_5401_b[OF assms(1,2)] val by auto next case False have"φ (''g'', oo) ∈: D oo" using assms by (simp add: asg_into_frame_def) thenhave0: "φ (''g'', oo) ∈: funspace (D Tv) (D Tv)" using assms(1) assms(2) fun_sym_asg_to_funspace by blast
from False have"(φ (''g'', oo) ⋅ true ≠ true ∨ φ (''g'', oo) ⋅ false ≠ true)" by auto thenhave"∃z. φ (''g'', oo) ⋅ z = false ∧ z ∈: D Tv" proof assume a: "φ (''g'', oo) ⋅ true ≠ true" have"φ (''g'', oo) ⋅ true ∈: boolset" by (metis "0" apply_abstract assms(1) boolset_def general_model.elims(2) in_funspace_abstract
mem_two true_def wf_frame_def wf_interp.simps) from this a have"φ (''g'', oo) ⋅ true = false ∧ true ∈: D Tv" using assms(1) wf_frame_def wf_interp.simps by auto thenshow"∃z. φ (''g'', oo) ⋅ z = false ∧ z ∈: D Tv" by auto next assume a: "φ (''g'', oo) ⋅ false ≠ true" have"φ (''g'', oo) ⋅ false ∈: boolset" by (metis "0" apply_abstract assms(1) boolset_def general_model.elims(2) in_funspace_abstract
mem_two false_def wf_frame_def wf_interp.simps) from this a have"φ (''g'', oo) ⋅ false = false ∧ false ∈: D Tv" using assms(1) wf_frame_def wf_interp.simps by auto thenshow"∃z. φ (''g'', oo) ⋅ z = false ∧ z ∈: D Tv" by auto qed thenobtain z where z_p: "φ (''g'', oo) ⋅ z = false ∧ z ∈: D Tv" by auto have"boolean (satisfies D I φ (goo\<cdot> T) ∧ satisfies D I φ (goo\<cdot> F)) = false" using False by (smt boolean_def val.simps(1) val.simps(3) lemma_5401_c[OF assms(1,2)]
lemma_5401_d[OF assms(1,2)]) thenhave1: "val D I φ ( (goo\<cdot> T) \<and> (goo\<cdot> F)) = false" using lemma_5401_e_variant_2 assms by auto have3: "asg_into_frame (φ((''x'', Tv) := z)) D ∧ agree_off_asg (φ((''x'', Tv) := z)) φ ''x'' Tv ∧ φ (''g'', oo) ⋅ (φ((''x'', Tv) := z)) (''x'', Tv) ≠ true" using z_p Pair_inject agree_off_asg_def2 asg_into_frame_fun_upd assms(2) true_neq_false by fastforce thenhave2: "val D I φ ([\<forall>''x'':Tv. (goo\<cdot> xo)]) = false" using lemma_5401_g_variant_1 assms boolean_def by auto thenshow ?thesis unfolding axiom_1_def using12 lemma_5401_b_variant_2[OF assms(1,2)] by auto qed
(* Corresponds to Andrews' theorem 5402 a for axiom 1 *) theorem theorem_5402_a_axiom_1: "valid_general axiom_1" using theorem_5402_a_axiom_1_variant unfolding valid_general_def valid_in_model_def by auto
(* Corresponds to Andrews' theorem 5402 a for axiom 2 *) theorem theorem_5402_a_axiom_2_variant: assumes"general_model D I" assumes"asg_into_interp φ D I" shows"satisfies D I φ (axiom_2 α)" proof (cases "φ(''x'',α) = φ(''y'',α)") case True have"val D I φ ((Var ''h'' (Tv \<Leftarrow> α)) \<cdot> (Var ''x'' α)) = (φ (''h'', (Tv \<Leftarrow> α))) ⋅ φ (''x'', α)" using assms by auto also have"... = φ (''h'', (Tv \<Leftarrow> α)) ⋅ φ (''y'', α)" using True by auto also have"... = val D I φ ((Var ''h'' (Tv \<Leftarrow> α)) \<cdot> (Var ''y'' α))" using assms by auto finally show ?thesis unfolding axiom_2_def using lemma_5401_f_variant_2 assms lemma_5401_b_variant_1[OF assms(1,2)] boolean_def by auto next case False have"asg_into_frame φ D" using assms(2) by blast moreover have"general_model D I" using assms(1) by blast ultimately have "boolean (satisfies D I φ [Var ''x'' α =α= Var ''y'' α]⟶ satisfies D I φ [(Var ''h'' (Tv \<Leftarrow> α) \<cdot> Var ''x'' α) =Tv= Var ''h'' (Tv \<Leftarrow> α) \<cdot> Var ''y'' α]) = true" using boolean_eq_true lemma_5401_b by auto then show ?thesis using assms lemma_5401_f_variant_2 unfolding axiom_2_def by auto qed
(* Corresponds to Andrews' theorem 5402 a for axiom 2 *) theorem theorem_5402_a_axiom_2: "valid_general (axiom_2 α)" using theorem_5402_a_axiom_2_variant unfolding valid_general_def valid_in_model_def by auto
(* Corresponds to Andrews' theorem 5402 a for axiom 3 *) theorem theorem_5402_a_axiom_3_variant: assumes"general_model D I" assumes"asg_into_interp φ D I" shows"satisfies D I φ (axiom_3 α β)" proof (cases "φ (''f'',α \<Leftarrow> β) = φ (''g'',α \<Leftarrow> β)") case True
{ fix ψ assume agree: "agree_off_asg ψ φ ''x'' β" assume asg: "asg_into_interp ψ D I" have"val D I ψ ((Var ''f'' (α \<Leftarrow> β)) \<cdot> (Var ''x'' β)) = ψ (''f'',α \<Leftarrow> β) ⋅ ψ (''x'', β)" by auto also have"... = φ (''f'',α \<Leftarrow> β) ⋅ ψ (''x'', β)" using agree by auto also have"... = φ (''g'',α \<Leftarrow> β) ⋅ ψ (''x'', β)" using True by auto also have"... = ψ (''g'',α \<Leftarrow> β) ⋅ ψ (''x'', β)" using agree by auto also have"... = val D I ψ ((Var ''g'' (α \<Leftarrow> β)) \<cdot> (Var ''x'' β))" by auto finally have "val D I ψ ([((Var ''f'' (α \<Leftarrow> β)) \<cdot> (Var ''x'' β)) =α= ((Var ''g'' (α \<Leftarrow> β)) \<cdot> (Var ''x'' β))]) = true" using lemma_5401_b_variant_1[OF assms(1)] assms agree asg boolean_eq_true by auto
} thenhave"satisfies D I φ ([\<forall>''x'':β. [(Var ''f'' (α \<Leftarrow> β) \<cdot> Var ''x'' β) =α= Var ''g'' (α \<Leftarrow> β) \<cdot> Var ''x'' β]])" using assms lemma_5401_g by force moreover have"satisfies D I φ [Var ''f'' (α \<Leftarrow> β) =α \<Leftarrow> β= Var ''g'' (α \<Leftarrow> β)]" using True assms using lemma_5401_b_variant_2 wff_Var by auto ultimately show ?thesis using axiom_3_def lemma_5401_b_variant_2 assms by auto next case False thenhave"∃z. z ∈: D β ∧ φ (''f'', α \<Leftarrow> β) ⋅ z ≠ φ (''g'', α \<Leftarrow> β) ⋅ z" using funspace_difference_witness[of "φ (''f'', α \<Leftarrow> β)""D β""D α""φ (''g'', α \<Leftarrow> β)"]
assms(1,2) fun_sym_asg_to_funspace by blast thenobtain z where
zβ: "z ∈: D β"and
z_neq: "φ (''f'', α \<Leftarrow> β) ⋅ z ≠ φ (''g'', α \<Leftarrow> β) ⋅ z" by auto define ψ where"ψ = (φ((''x'',β):= z))" have agree: "agree_off_asg ψ φ ''x'' β" using ψ_def agree_off_asg_def2 by blast have asg: "asg_into_interp ψ D I" using zβ ψ_def asg_into_frame_fun_upd assms(2) by blast have"val D I ψ ((Var ''f'' (α \<Leftarrow> β)) \<cdot> (Var ''x'' β)) = ψ (''f'',α \<Leftarrow> β) ⋅ ψ (''x'', β)" by auto moreover have"... = φ (''f'',α \<Leftarrow> β) ⋅ z" by (simp add: ψ_def) moreover have"... ≠ φ (''g'',α \<Leftarrow> β) ⋅ z" using False z_neq by blast moreover have"φ (''g'',α \<Leftarrow> β) ⋅ z = ψ (''g'',α \<Leftarrow> β) ⋅ ψ (''x'', β)" by (simp add: ψ_def) moreover have"... = val D I ψ ((Var ''g'' (α \<Leftarrow> β)) \<cdot> (Var ''x'' β))" by auto ultimately have "val D I ψ ([((Var ''f'' (α \<Leftarrow> β)) \<cdot> (Var ''x'' β)) =α= ((Var ''g'' (α \<Leftarrow> β)) \<cdot> (Var ''x'' β))]) = false" by (metis asg assms(1) lemma_5401_b_variant_3 wff_App wff_Var) have"val D I φ ([\<forall>''x'':β. [(Var ''f'' (α \<Leftarrow> β) \<cdot> Var ''x'' β) =α= Var ''g'' (α \<Leftarrow> β) \<cdot> Var ''x'' β]]) = false" by (smt (verit) ‹val D I ψ [(Var ''f'' (α \<== β) \⋅ Var ''x'' β) =α= Var ''g'' (α \<== β) \⋅ Var ''x'' β] = false›
agree asg assms(1,2) lemma_5401_g wff_App wff_Eql wff_Forall wff_Tv_is_true_or_false wff_Var) moreover have"val D I φ [Var ''f'' (α \<Leftarrow> β) =α \<Leftarrow> β= Var ''g'' (α \<Leftarrow> β)] = false" using False assms(1,2) lemma_5401_b_variant_3 wff_Var by auto ultimatelyshow ?thesis using assms(1,2) axiom_3_def lemma_5401_b by auto qed
(* Corresponds to Andrews' theorem 5402 a for axiom 3 *) theorem theorem_5402_a_axiom_3: "valid_general (axiom_3 α β)" using theorem_5402_a_axiom_3_variant unfolding valid_general_def valid_in_model_def by auto
(* Corresponds to Andrews' theorem 5402 a for axiom 4_1 with a constant *) theorem theorem_5402_a_axiom_4_1_variant_cst: assumes"general_model D I" assumes"asg_into_interp φ D I" assumes"wff α A" shows"satisfies D I φ (axiom_4_1_variant_cst x α c β A)" proof - let ?ψ = "φ((x,α):=val D I φ A)" have"val D I φ ([\<lambda>x:α. (Cst c β)]\<cdot> A) = val D I ?ψ (Cst c β)" by (rule lemma_5401_a[of _ _ _ _ _ β]; use assms in auto) thenhave"val D I φ ([\<lambda>x:α. Cst c β]\<cdot> A) = val D I φ (Cst c β)" by auto moreover have"wff β ([\<lambda>x:α. Cst c β]\<cdot> A)" using assms by auto ultimately show ?thesis unfolding axiom_4_1_variant_cst_def using lemma_5401_b_variant_2[OF assms(1,2)] by auto qed
(* Corresponds to Andrews' theorem 5402 a for axiom 4_1 *) theorem theorem_5402_a_axiom_4_1_variant_var: assumes"general_model D I" assumes"asg_into_interp φ D I" assumes"wff α A" assumes"axiom_4_1_variant_var_side_condition x α y β A" shows"satisfies D I φ (axiom_4_1_variant_var x α y β A)" proof - let ?ψ = "φ((x,α):=val D I φ A)" have"val D I φ ([\<lambda>x:α. (Var y β)]\<cdot> A) = val D I ?ψ (Var y β)" by (rule lemma_5401_a[of _ _ _ _ _ β], use assms in auto) thenhave"val D I φ ([\<lambda>x:α. Var y β]\<cdot> A) = val D I φ (Var y β)" using assms unfolding axiom_4_1_variant_var_side_condition_def by auto moreover have"wff β ([\<lambda>x:α. Var y β]\<cdot> A)" using assms by auto moreover have"wff β (Var y β)" using assms by auto ultimately show ?thesis unfolding axiom_4_1_variant_var_def using lemma_5401_b_variant_2[OF assms(1,2)] by auto qed
(* Corresponds to Andrews' theorem 5402 a for axiom 4_1 *) theorem theorem_5402_a_axiom_4_1: assumes"asg_into_interp φ D I" assumes"general_model D I" assumes"axiom_4_1_side_condition x α y β A" assumes"wff α A" shows"satisfies D I φ (axiom_4_1 x α y β A)" using assms theorem_5402_a_axiom_4_1_variant_cst theorem_5402_a_axiom_4_1_variant_var unfolding axiom_4_1_variant_cst_def axiom_4_1_variant_var_side_condition_def
axiom_4_1_side_condition_def axiom_4_1_variant_var_def
axiom_4_1_def by auto
(* Corresponds to Andrews' theorem 5402 a for axiom 4_2 *) theorem theorem_5402_a_axiom_4_2: assumes"general_model D I" assumes"asg_into_interp φ D I" assumes"wff α A" shows"satisfies D I φ (axiom_4_2 x α A)" proof - let ?ψ = "φ((x,α):=val D I φ A)" have"wff α ([\<lambda>x:α. Var x α]\<cdot> A)" using assms by auto moreover have"wff α A" using assms by auto moreover have"val D I φ ([\<lambda>x:α. Var x α]\<cdot> A) = val D I φ A" using lemma_5401_a[of _ _ _ _ _ α _ _] assms by auto ultimately show ?thesis unfolding axiom_4_2_def by (rule lemma_5401_b_variant_2[OF assms(1,2)]) qed
(* Corresponds to Andrews' theorem 5402 a for axiom 4_3 *) theorem theorem_5402_a_axiom_4_3: assumes"general_model D I" assumes"asg_into_interp φ D I" assumes"wff α A" assumes"wff (β \<Leftarrow> γ) B" assumes"wff γ C" shows"satisfies D I φ (axiom_4_3 x α B β γ C A)" proof - let ?ψ = "φ((x,α):=val D I φ A)" let ?E = "B \<cdot> C"
have"val D I φ (LHS (axiom_4_3 x α B β γ C A)) = val D I ?ψ ?E" by (metis LHS_def2 assms(3) assms(4) assms(5) axiom_4_3_def lemma_5401_a[OF assms(1,2)] wff_App) moreover have"... = val D I ?ψ (B \<cdot> C)" by simp moreover have"... = (val D I ?ψ B) ⋅ val D I ?ψ C" by simp moreover have"... = (val D I φ ([\<lambda>x:α. B]\<cdot> A)) ⋅ val D I φ (App [\<lambda>x :α. C] A)" by (metis assms(3) assms(4) assms(5) lemma_5401_a[OF assms(1,2)]) moreover have"... = val D I φ (RHS (axiom_4_3 x α B β γ C A))" unfolding axiom_4_3_def by auto ultimately have"val D I φ (LHS (axiom_4_3 x α B β γ C A)) = val D I φ (RHS (axiom_4_3 x α B β γ C A))" by auto thenhave"val D I φ ([\<lambda>x:α. B \<cdot> C]\<cdot> A) = val D I φ ([\<lambda>x:α. B]\<cdot> A \<cdot> ([\<lambda>x:α. C]\<cdot> A))" unfolding axiom_4_3_def by auto moreover have"wff β ([\<lambda>x:α. B \<cdot> C]\<cdot> A)" using assms by auto moreover have"wff β ([\<lambda>x:α. B]\<cdot> A \<cdot> ([\<lambda>x:α. C]\<cdot> A))" using assms by auto ultimately show ?thesis unfolding axiom_4_3_def using lemma_5401_b_variant_2[OF assms(1,2)] by auto qed
lemma lemma_to_help_with_theorem_5402_a_axiom_4_4: assumes lambda_eql_lambda_lambda: "∧z. z ∈: D γ ==> val D I ψ [\<lambda>y:γ. B]⋅ z = val D I φ [\<lambda>y:γ. [\<lambda>x:α. B]\<cdot> A]⋅ z" assumes ψ_eql: "ψ = φ((x, α) := val D I φ A)" assumes"asg_into_frame φ D" assumes"general_model D I" assumes"axiom_4_4_side_condition x α y γ B δ A" assumes"wff α A" assumes"wff δ B" shows"val D I ψ [\<lambda>y:γ. B] = val D I φ [\<lambda>y:γ. [\<lambda>x:α. B]\<cdot> A]" proof -
{ fix e assume e_in_D: "e ∈: D γ" thenhave"val D I (ψ((y, γ) := e)) B ∈: D (type_of B)" using asg_into_frame_fun_upd assms(3,4,6,7) ψ_eql by auto thenhave val_lambda_B: "val D I ψ [\<lambda>y:γ. B]⋅ e = val D I (ψ((y, γ) := e)) B" using e_in_D by auto have "val D I φ [\<lambda>y:γ. [\<lambda>x:α. B]\<cdot> A]⋅ e = abstract (D α) (D (type_of B)) (λz. val D I (φ((y, γ) := e, (x, α) := z)) B) ⋅ val D I (φ((y, γ) := e)) A" using apply_abstract e_in_D asg_into_frame_fun_upd assms(3,4,6,7) by auto thenhave"val D I (ψ((y, γ) := e)) B = abstract (D α) (D (type_of B)) (λz. val D I (φ((y, γ) := e, (x, α) := z)) B) ⋅ val D I (φ((y, γ) := e)) A" using val_lambda_B lambda_eql_lambda_lambda e_in_D by metis
} note val_eql_abstract = this
have "∀e. e ∈: D γ ⟶ val D I (ψ((y, γ) := e)) B ∈: D (type_of B) ∧ val D I (ψ((y, γ) := e)) B = abstract (D α) (D (type_of B)) (λza. val D I (φ((y, γ) := e, (x, α) := za)) B) ⋅ val D I (φ((y, γ) := e)) A" using asg_into_frame_fun_upd assms(3,4,6,7) ψ_eql val_eql_abstract by auto thenhave "abstract (D γ) (D (type_of B)) (λz. val D I (ψ((y, γ) := z)) B) = abstract (D γ) (D (type_of B)) (λz. abstract (D α) (D (type_of B)) (λza. val D I (φ((y, γ) := z, (x, α) := za)) B) ⋅ val D I (φ((y, γ) := z)) A)" by (rule abstract_extensional) thenshow ?thesis by auto qed
(* Corresponds to Andrews' theorem 5402 a for axiom 4_4 *) theorem theorem_5402_a_axiom_4_4: assumes"general_model D I" assumes"asg_into_interp φ D I" assumes"axiom_4_4_side_condition x α y γ B δ A" assumes"wff α A" assumes"wff δ B" shows"satisfies D I φ (axiom_4_4 x α y γ B δ A)" proof - define ψ where"ψ = φ((x,α):=val D I φ A)" let ?E = "[\<lambda>y:γ. B]" have fr: "(y, γ) ∉ vars A" using assms(3) axiom_4_4_side_condition_def by blast
{ fix z assume z_in_D: "z ∈: D γ" define φ' where"φ' = φ((y,γ) := z)" have"asg_into_frame φ' D" using assms z_in_D unfolding asg_into_frame_def φ'_defby auto moreover have"∀(x, α)∈vars A. agree_on_asg φ φ' x α" using fr unfolding φ'_defby auto ultimately have"val D I φ A = val D I φ' A" using prop_5400[OF assms(1), of _ _ α] assms(2) assms(4) frees_subset_vars by blast thenhave Az: "φ'((x,α):=(val D I φ' A)) = ψ((y,γ):=z)" using assms(3) unfolding axiom_4_4_side_condition_def by (simp add: fun_upd_twist φ'_def ψ_def) thenhave"abstract (D γ) (D (type_of B)) (λz. val D I (ψ((y, γ) := z)) B) ⋅ z = val D I (ψ((y, γ) := z)) B" using apply_abstract_matchable assms(1,2,4,5) type_of asg_into_frame_fun_upd
general_model.elims(2) z_in_D by (metis φ'_def) thenhave"(val D I ψ ?E) ⋅ z = (val D I (ψ((y,γ):=z)) B)" by auto moreover have"... = val D I φ' ([\<lambda>x:α. B]\<cdot> A)" using assms(1,2,4,5) asg_into_frame_fun_upd lemma_5401_a z_in_D by (metis Az φ'_def) moreover have"... = val D I φ [\<lambda>y:γ. [\<lambda>x:α. B]\<cdot> A]⋅ z" proof - have valA: "val D I φ' A ∈: D α" using φ'_def asg_into_frame_fun_upd z_in_D assms by simp have valB: "val D I (φ'((x, α) := val D I φ' A)) B ∈: D (type_of B)" using asg_into_frame_fun_upd z_in_D assms by (simp add: Az ψ_def) have valA': "val D I (φ((y, γ) := z)) A ∈: D α" using z_in_D assms asg_into_frame_fun_upd valA unfolding ψ_def φ'_def by blast have valB': "val D I (φ((y, γ) := z, (x, α) := val D I (φ((y, γ) := z)) A)) B ∈: D (type_of B)" using asg_into_frame_fun_upd z_in_D assms valB φ'_defby blast have "val D I (φ'((x, α) := val D I φ' A)) B = val D I (φ((y, γ) := z, (x, α) := val D I (φ((y, γ) := z)) A)) B" unfolding ψ_def φ'_defby (metis apply_abstract asg_into_frame_fun_upd) thenhave valB_eql_abs: "val D I (φ'((x, α) := val D I φ' A)) B = abstract (D α) (D (type_of B)) (λza. val D I (φ((y, γ) := z, (x, α) := za)) B) ⋅ val D I (φ((y, γ) := z)) A" using valA' valB' by auto thenhave"abstract (D α) (D (type_of B)) (λza. val D I (φ((y, γ) := z, (x, α) := za)) B) ⋅ val D I (φ((y, γ) := z)) A ∈: D (type_of B)" using valB assms z_in_D by auto thenhave "val D I (φ'((x, α) := val D I φ' A)) B = abstract (D γ) (D (type_of B)) (λz. abstract (D α) (D (type_of B)) (λza. val D I (φ((y, γ) := z, (x, α) := za)) B) ⋅ val D I (φ((y, γ) := z)) A) ⋅ z" using z_in_D valB_eql_abs by auto thenshow"val D I φ' ([\<lambda>x:α. B]\<cdot> A) = val D I φ [\<lambda>y:γ. [\<lambda>x:α. B]\<cdot> A]⋅ z" using valA valB by auto qed ultimately have"val D I ψ [\<lambda>y:γ. B]⋅ z = val D I φ [\<lambda>y:γ. [\<lambda>x:α. B]\<cdot> A]⋅ z" by simp
} note lambda_eql_lambda_lambda = this have equal_funs: "val D I ψ ?E = val D I φ ([\<lambda>y:γ. ([\<lambda>x:α. B]) \<cdot> A])" using lambda_eql_lambda_lambda ψ_def assms lemma_to_help_with_theorem_5402_a_axiom_4_4 by metis have"val D I φ ([\<lambda>x:α. [\<lambda>y:γ. B]]\<cdot> A) = val D I φ [\<lambda>y:γ. [\<lambda>x:α. B]\<cdot> A]" using equal_funs by (metis ψ_def assms(1,2,4,5) lemma_5401_a wff_Abs) thenhave"satisfies D I φ [([\<lambda>x:α. [\<lambda>y:γ. B]]\<cdot> A) =δ \<Leftarrow> γ=[\<lambda>y:γ. [\<lambda>x:α. B]\<cdot> A]]" using lemma_5401_b[OF assms(1,2)] assms by auto thenshow ?thesis unfolding axiom_4_4_def . qed
(* Corresponds to Andrews' theorem 5402 a for axiom 4_5 *) theorem theorem_5402_a_axiom_4_5: assumes"general_model D I" assumes"asg_into_interp φ D I" assumes"wff α A" assumes"wff δ B" shows"satisfies D I φ (axiom_4_5 x α B δ A)" proof - define ψ where"ψ = φ((x,α):=val D I φ A)" let ?E = "[\<lambda>x:α. B]"
{ assume val: "∀φ. asg_into_frame φ D ⟶ (∀A α. wff α A ⟶ val D I φ A ∈: D α)" assume asg: "asg_into_frame φ D" assume wffA: "wff α A" assume wffB: "wff δ B" have valA: "val D I φ A ∈: D α" using val asg wffA by blast have"∀t cs. val D I φ [\<lambda>cs:t. B]∈: D (δ \<Leftarrow> t)" using val asg wffB wff_Abs by blast thenhave"abstract (D α) (D (δ \<Leftarrow> α)) (λu. abstract (D α) (D δ) (λu. val D I (φ((x, α) := u)) B)) ⋅ val D I φ A = abstract (D α) (D δ) (λu. val D I (φ((x, α) := u)) B)" using valA wffB by simp
} note abstract_eql = this
have"val D I ψ ?E = val D I φ ?E" using prop_5400[OF assms(1), of _ _ "δ \<Leftarrow> α"] ψ_def assms(2) by auto thenshow ?thesis unfolding axiom_4_5_def using lemma_5401_b[OF assms(1,2)] assms abstract_eql by auto qed
(* Corresponds to Andrews' theorem 5402 a for axiom 5 *) theorem theorem_5402_a_axiom_5: assumes"general_model D I" assumes"asg_into_interp φ D I" shows"satisfies D I φ (axiom_5)" proof - have iden_eql: "iden (D Ind) ⋅ I ''y'' Ind = one_elem_fun (I ''y'' Ind) (D Ind)" proof - have"I ''y'' Ind ∈: D Ind" using assms unfolding general_model.simps wf_interp.simps[simplified] iden_def one_elem_fun_def by auto moreover have"abstract (D Ind) boolset (λy. boolean (I ''y'' Ind = y)) ∈: funspace (D Ind) boolset" using boolean_in_boolset by auto ultimately show ?thesis unfolding iden_def one_elem_fun_def by auto qed
have"val D I φ (\<iota> \<cdot> ((Q (Tv \<Leftarrow> Ind \<Leftarrow> Ind)) \<cdot> yi)) = val D I φ \<iota> ⋅ val D I φ ((Q (Tv \<Leftarrow> Ind \<Leftarrow> Ind)) \<cdot> yi)" by auto moreover have"... = val D I φ yi" using assms iden_eql unfolding general_model.simps wf_interp.simps[simplified] by auto ultimately show ?thesis unfolding axiom_5_def using lemma_5401_b[OF assms(1,2)] by auto qed
lemma theorem_isa_Tv: assumes"theorem A" shows"wff Tv A" using assms proof (induction) case (by_axiom A) thenshow ?case proof (induction) case by_axiom_1 thenshow ?case unfolding axiom_1_def by auto next case (by_axiom_2 α) thenshow ?case unfolding axiom_2_def by auto next case (by_axiom_3 α β) thenshow ?case unfolding axiom_3_def by auto next case (by_axiom_4_1 α A β B x) thenshow ?case unfolding axiom_4_1_def by auto next case (by_axiom_4_2 α A x) thenshow ?case unfolding axiom_4_2_def by auto next case (by_axiom_4_3 α A β γ B C x) thenshow ?case unfolding axiom_4_3_def by auto next case (by_axiom_4_4 α A δ B x y γ) thenshow ?case unfolding axiom_4_4_def by auto next case (by_axiom_4_5 α A δ B x) thenshow ?case unfolding axiom_4_5_def by auto next case by_axiom_5 thenshow ?case unfolding axiom_5_def by auto qed next case (by_rule_R A B C) thenshow ?case by (smt replacement_preserves_type rule_R.cases wff_Eql_iff) qed
(* Corresponds to Andrews' theorem 5402 a *) theorem theorem_5402_a_general: assumes"theorem A" shows"valid_general A" using assms proof (induction) case (by_axiom A) thenshow ?case proof (induction) case by_axiom_1 thenshow ?case using theorem_5402_a_axiom_1 by auto next case (by_axiom_2 α) thenshow ?case using theorem_5402_a_axiom_2 by auto next case (by_axiom_3 α β) thenshow ?case using theorem_5402_a_axiom_3 by auto next case (by_axiom_4_1 α A β B x) thenshow ?case using theorem_5402_a_axiom_4_1 unfolding valid_general_def valid_in_model_def by auto next case (by_axiom_4_2 α A x) thenshow ?case using theorem_5402_a_axiom_4_2 unfolding valid_general_def valid_in_model_def by auto next case (by_axiom_4_3 α A β γ B C x) thenshow ?case using theorem_5402_a_axiom_4_3 unfolding valid_general_def valid_in_model_def by auto next case (by_axiom_4_4 α A δ B x y γ) thenshow ?case using theorem_5402_a_axiom_4_4 unfolding valid_general_def valid_in_model_def by auto next case (by_axiom_4_5 α A δ B x) thenshow ?case using theorem_5402_a_axiom_4_5 unfolding valid_general_def valid_in_model_def by auto next case by_axiom_5 thenshow ?case using theorem_5402_a_axiom_5 unfolding valid_general_def valid_in_model_def by auto qed next case (by_rule_R C AB C') thenhave C_isa_Tv: "wff Tv C" using theorem_isa_Tv by blast have"∃A B β. AB = [A =β= B]∧ wff β A ∧ wff β B" using by_rule_R rule_R.simps theorem_isa_Tv by fastforce thenobtain A B β where A_B_β_p: "AB = [A =β= B]∧ wff β A ∧ wff β B" by blast thenhave R: "rule_R C [A =β= B] C'" using by_rule_R by auto thenhave"replacement A B C C'" using Eql_def rule_R.cases by fastforce show ?case using theorem_5402_a_rule_R[of A B β C C' Tv] by_rule_R.IH R
A_B_β_p C_isa_Tv by auto qed
(* Corresponds to Andrews' theorem 5402 a *) theorem theorem_5402_a_standard: assumes"theorem A" shows"valid_standard A" using theorem_5402_a_general assms standard_model_is_general_model valid_general_def
valid_standard_def by blast
end
end
Messung V0.5 in Prozent
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.102Bemerkung:
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.