Theory Semantics
section ‹Semantics›
theory Semantics
imports
"ZFC_in_HOL.ZFC_Typeclasses"
Syntax
Boolean_Algebra
begin
unbundle no funcset_syntax
notation funcset (infixr ‹⇸› 60)
abbreviation vfuncset :: "V ⇒ V ⇒ V" (infixr ‹⟼› 60) where
"A ⟼ B ≡ VPi A (λ_. B)"
notation app (infixl ‹∙› 300)
syntax
"_vlambda" :: "pttrn ⇒ V ⇒ (V ⇒ V) ⇒ V" (‹(3❙λ_❙:_ ❙./ _)› [0, 0, 3] 3)
syntax_consts
"_vlambda" ⇌ VLambda
translations
"❙λx ❙: A❙. f" ⇌ "CONST VLambda A (λx. f)"
lemma vlambda_extensionality:
assumes "⋀x. x ∈ elts A ⟹ f x = g x"
shows "(❙λx ❙: A❙. f x) = (❙λx ❙: A❙. g x)"
unfolding VLambda_def using assms by auto
subsection ‹Frames›
locale frame =
fixes 𝒟 :: "type ⇒ V"
assumes truth_values_domain_def: "𝒟 o = 𝔹"
and function_domain_def: "∀α β. 𝒟 (α→β) ≤ 𝒟 α ⟼ 𝒟 β"
and domain_nonemptiness: "∀α. 𝒟 α ≠ 0"
begin
lemma function_domainD:
assumes "f ∈ elts (𝒟 (α→β))"
shows "f ∈ elts (𝒟 α ⟼ 𝒟 β)"
using assms and function_domain_def by blast
lemma vlambda_from_function_domain:
assumes "f ∈ elts (𝒟 (α→β))"
obtains b where "f = (❙λx ❙: 𝒟 α❙. b x)" and "∀x ∈ elts (𝒟 α). b x ∈ elts (𝒟 β)"
using function_domainD[OF assms] by (metis VPi_D eta)
lemma app_is_domain_respecting:
assumes "f ∈ elts (𝒟 (α→β))" and "x ∈ elts (𝒟 α)"
shows "f ∙ x ∈ elts (𝒟 β)"
by (fact VPi_D[OF function_domainD[OF assms(1)] assms(2)])
text ‹One-element function on @{term ‹𝒟 α›}:›
definition one_element_function :: "V ⇒ type ⇒ V" (‹{_}⇘_⇙› [901, 0] 900) where
[simp]: "{x}⇘α⇙ = (❙λy ❙: 𝒟 α❙. bool_to_V (y = x))"
lemma one_element_function_is_domain_respecting:
shows "{x}⇘α⇙ ∈ elts (𝒟 α ⟼ 𝒟 o)"
unfolding one_element_function_def and truth_values_domain_def by (intro VPi_I) (simp, metis)
lemma one_element_function_simps:
shows "x ∈ elts (𝒟 α) ⟹ {x}⇘α⇙ ∙ x = ❙T"
and "⟦{x, y} ⊆ elts (𝒟 α); y ≠ x⟧ ⟹ {x}⇘α⇙ ∙ y = ❙F"
by simp_all
lemma one_element_function_injectivity:
assumes "{x, x'} ⊆ elts (𝒟 i)" and "{x}⇘i⇙ = {x'}⇘i⇙"
shows "x = x'"
using assms(1) and VLambda_eq_D2[OF assms(2)[unfolded one_element_function_def]]
and injD[OF bool_to_V_injectivity] by blast
lemma one_element_function_uniqueness:
assumes "x ∈ elts (𝒟 i)"
shows "(SOME x'. x' ∈ elts (𝒟 i) ∧ {x}⇘i⇙ = {x'}⇘i⇙) = x"
by (auto simp add: assms one_element_function_injectivity)
text ‹Identity relation on @{term ‹𝒟 α›}:›
definition identity_relation :: "type ⇒ V" (‹q⇘_⇙› [0] 100) where
[simp]: "q⇘α⇙ = (❙λx ❙: 𝒟 α❙. {x}⇘α⇙)"
lemma identity_relation_is_domain_respecting:
shows "q⇘α⇙ ∈ elts (𝒟 α ⟼ 𝒟 α ⟼ 𝒟 o)"
using VPi_I and one_element_function_is_domain_respecting by simp
lemma q_is_equality:
assumes "{x, y} ⊆ elts (𝒟 α)"
shows "(q⇘α⇙) ∙ x ∙ y = ❙T ⟷ x = y"
unfolding identity_relation_def
using assms and injD[OF bool_to_V_injectivity] by fastforce
text ‹Unique member selector:›
definition is_unique_member_selector :: "V ⇒ bool" where
[iff]: "is_unique_member_selector f ⟷ (∀x ∈ elts (𝒟 i). f ∙ {x}⇘i⇙ = x)"
text ‹Assignment:›
definition is_assignment :: "(var ⇒ V) ⇒ bool" where
[iff]: "is_assignment φ ⟷ (∀x α. φ (x, α) ∈ elts (𝒟 α))"
end
abbreviation one_element_function_in (‹{_}⇘_⇙⇗_⇖› [901, 0, 0] 900) where
"{x}⇘α⇙⇗𝒟⇖ ≡ frame.one_element_function 𝒟 x α"
abbreviation identity_relation_in (‹q⇘_⇙⇗_⇖› [0, 0] 100) where
"q⇘α⇙⇗𝒟⇖ ≡ frame.identity_relation 𝒟 α"
text ‹
‹ψ› is a ``‹v›-variant'' of ‹φ› if ‹ψ› is an assignment that agrees with ‹φ› except possibly on
‹v›:
›
definition is_variant_of :: "(var ⇒ V) ⇒ var ⇒ (var ⇒ V) ⇒ bool" (‹_ ∼⇘_⇙ _› [51, 0, 51] 50) where
[iff]: "ψ ∼⇘v⇙ φ ⟷ (∀v'. v' ≠ v ⟶ ψ v' = φ v')"
subsection ‹Pre-models (interpretations)›
text ‹We use the term ``pre-model'' instead of ``interpretation'' since the latter is already a keyword:›
locale premodel = frame +
fixes 𝒥 :: "con ⇒ V"
assumes Q_denotation: "∀α. 𝒥 (Q_constant_of_type α) = q⇘α⇙"
and ι_denotation: "is_unique_member_selector (𝒥 iota_constant)"
and non_logical_constant_denotation: "∀c α. ¬ is_logical_constant (c, α) ⟶ 𝒥 (c, α) ∈ elts (𝒟 α)"
begin
text ‹Wff denotation function:›
definition is_wff_denotation_function :: "((var ⇒ V) ⇒ form ⇒ V) ⇒ bool" where
[iff]: "is_wff_denotation_function 𝒱 ⟷
(
∀φ. is_assignment φ ⟶
(∀A α. A ∈ wffs⇘α⇙ ⟶ 𝒱 φ A ∈ elts (𝒟 α)) ∧
(∀x α. 𝒱 φ (x⇘α⇙) = φ (x, α)) ∧
(∀c α. 𝒱 φ (⦃c⦄⇘α⇙) = 𝒥 (c, α)) ∧
(∀A B α β. A ∈ wffs⇘β→α⇙ ∧ B ∈ wffs⇘β⇙ ⟶ 𝒱 φ (A · B) = (𝒱 φ A) ∙ (𝒱 φ B)) ∧
(∀x B α β. B ∈ wffs⇘β⇙ ⟶ 𝒱 φ (λx⇘α⇙. B) = (❙λz ❙: 𝒟 α❙. 𝒱 (φ((x, α) := z)) B))
)"
lemma wff_denotation_function_is_domain_respecting:
assumes "is_wff_denotation_function 𝒱"
and "A ∈ wffs⇘α⇙"
and "is_assignment φ"
shows "𝒱 φ A ∈ elts (𝒟 α)"
using assms by force
lemma wff_var_denotation:
assumes "is_wff_denotation_function 𝒱"
and "is_assignment φ"
shows "𝒱 φ (x⇘α⇙) = φ (x, α)"
using assms by force
lemma wff_Q_denotation:
assumes "is_wff_denotation_function 𝒱"
and "is_assignment φ"
shows "𝒱 φ (Q⇘α⇙) = q⇘α⇙"
using assms and Q_denotation by force
lemma wff_iota_denotation:
assumes "is_wff_denotation_function 𝒱"
and "is_assignment φ"
shows "is_unique_member_selector (𝒱 φ ι)"
using assms and ι_denotation by fastforce
lemma wff_non_logical_constant_denotation:
assumes "is_wff_denotation_function 𝒱"
and "is_assignment φ"
and "¬ is_logical_constant (c, α)"
shows "𝒱 φ (⦃c⦄⇘α⇙) = 𝒥 (c, α)"
using assms by auto
lemma wff_app_denotation:
assumes "is_wff_denotation_function 𝒱"
and "is_assignment φ"
and "A ∈ wffs⇘β→α⇙"
and "B ∈ wffs⇘β⇙"
shows "𝒱 φ (A · B) = 𝒱 φ A ∙ 𝒱 φ B"
using assms by blast
lemma wff_abs_denotation:
assumes "is_wff_denotation_function 𝒱"
and "is_assignment φ"
and "B ∈ wffs⇘β⇙"
shows "𝒱 φ (λx⇘α⇙. B) = (❙λz ❙: 𝒟 α❙. 𝒱 (φ((x, α) := z)) B)"
using assms unfolding is_wff_denotation_function_def by metis
lemma wff_denotation_function_is_uniquely_determined:
assumes "is_wff_denotation_function 𝒱"
and "is_wff_denotation_function 𝒱'"
and "is_assignment φ"
and "A ∈ wffs"
shows "𝒱 φ A = 𝒱' φ A"
proof -
obtain α where "A ∈ wffs⇘α⇙"
using assms(4) by blast
then show ?thesis
using assms(3) proof (induction A arbitrary: φ)
case var_is_wff
with assms(1,2) show ?case
by auto
next
case con_is_wff
with assms(1,2) show ?case
by auto
next
case app_is_wff
with assms(1,2) show ?case
using wff_app_denotation by metis
next
case (abs_is_wff β A α x)
have "is_assignment (φ((x, α) := z))" if "z ∈ elts (𝒟 α)" for z
using that and abs_is_wff.prems by simp
then have *: "𝒱 (φ((x, α) := z)) A = 𝒱' (φ((x, α) := z)) A" if "z ∈ elts (𝒟 α)" for z
using abs_is_wff.IH and that by blast
have "𝒱 φ (λx⇘α⇙. A) = (❙λz ❙: 𝒟 α❙. 𝒱 (φ((x, α) := z)) A)"
by (fact wff_abs_denotation[OF assms(1) abs_is_wff.prems abs_is_wff.hyps])
also have "… = (❙λz ❙: 𝒟 α❙. 𝒱' (φ((x, α) := z)) A)"
using * and vlambda_extensionality by fastforce
also have "… = 𝒱' φ (λx⇘α⇙. A)"
by (fact wff_abs_denotation[OF assms(2) abs_is_wff.prems abs_is_wff.hyps, symmetric])
finally show ?case .
qed
qed
end
subsection ‹General models›
type_synonym model_structure = "(type ⇒ V) × (con ⇒ V) × ((var ⇒ V) ⇒ form ⇒ V)"
text ‹
The assumption in the following locale implies that there must exist a function that is a wff
denotation function for the pre-model, which is a requirement in the definition of general model
in \<^cite>‹"andrews:2002"›:
›
locale general_model = premodel +
fixes 𝒱 :: "(var ⇒ V) ⇒ form ⇒ V"
assumes 𝒱_is_wff_denotation_function: "is_wff_denotation_function 𝒱"
begin
lemma mixed_beta_conversion:
assumes "is_assignment φ"
and "y ∈ elts (𝒟 α)"
and "B ∈ wffs⇘β⇙"
shows "𝒱 φ (λx⇘α⇙. B) ∙ y = 𝒱 (φ((x, α) := y)) B"
using wff_abs_denotation[OF 𝒱_is_wff_denotation_function assms(1,3)] and beta[OF assms(2)] by simp
lemma conj_fun_is_domain_respecting:
assumes "is_assignment φ"
shows "𝒱 φ (∧⇘o→o→o⇙) ∈ elts (𝒟 (o→o→o))"
using assms and conj_fun_wff and 𝒱_is_wff_denotation_function by auto
lemma fully_applied_conj_fun_is_domain_respecting:
assumes "is_assignment φ"
and "{x, y} ⊆ elts (𝒟 o)"
shows "𝒱 φ (∧⇘o→o→o⇙) ∙ x ∙ y ∈ elts (𝒟 o)"
using assms and conj_fun_is_domain_respecting and app_is_domain_respecting by (meson insert_subset)
lemma imp_fun_denotation_is_domain_respecting:
assumes "is_assignment φ"
shows "𝒱 φ (⊃⇘o→o→o⇙) ∈ elts (𝒟 (o→o→o))"
using assms and imp_fun_wff and 𝒱_is_wff_denotation_function by simp
lemma fully_applied_imp_fun_denotation_is_domain_respecting:
assumes "is_assignment φ"
and "{x, y} ⊆ elts (𝒟 o)"
shows "𝒱 φ (⊃⇘o→o→o⇙) ∙ x ∙ y ∈ elts (𝒟 o)"
using assms and imp_fun_denotation_is_domain_respecting and app_is_domain_respecting
by (meson insert_subset)
end
abbreviation is_general_model :: "model_structure ⇒ bool" where
"is_general_model ℳ ≡ case ℳ of (𝒟, 𝒥, 𝒱) ⇒ general_model 𝒟 𝒥 𝒱"
subsection ‹Standard models›
locale standard_model = general_model +
assumes full_function_domain_def: "∀α β. 𝒟 (α→β) = 𝒟 α ⟼ 𝒟 β"
abbreviation is_standard_model :: "model_structure ⇒ bool" where
"is_standard_model ℳ ≡ case ℳ of (𝒟, 𝒥, 𝒱) ⇒ standard_model 𝒟 𝒥 𝒱"
lemma standard_model_is_general_model:
assumes "is_standard_model ℳ"
shows "is_general_model ℳ"
using assms and standard_model.axioms(1) by force
subsection ‹Validity›
abbreviation is_assignment_into_frame (‹_ ↝ _› [51, 51] 50) where
"φ ↝ 𝒟 ≡ frame.is_assignment 𝒟 φ"
abbreviation is_assignment_into_model (‹_ ↝⇩M _› [51, 51] 50) where
"φ ↝⇩M ℳ ≡ (case ℳ of (𝒟, 𝒥, 𝒱) ⇒ φ ↝ 𝒟)"
abbreviation satisfies (‹_ ⊨⇘_⇙ _› [50, 50, 50] 50) where
"ℳ ⊨⇘φ⇙ A ≡ case ℳ of (𝒟, 𝒥, 𝒱) ⇒ 𝒱 φ A = ❙T"
abbreviation is_satisfiable_in where
"is_satisfiable_in A ℳ ≡ ∃φ. φ ↝⇩M ℳ ∧ ℳ ⊨⇘φ⇙ A"
abbreviation is_valid_in (‹_ ⊨ _› [50, 50] 50) where
"ℳ ⊨ A ≡ ∀φ. φ ↝⇩M ℳ ⟶ ℳ ⊨⇘φ⇙ A"
abbreviation is_valid_in_the_general_sense (‹⊨ _› [50] 50) where
"⊨ A ≡ ∀ℳ. is_general_model ℳ ⟶ ℳ ⊨ A"
abbreviation is_valid_in_the_standard_sense (‹⊨⇩S _› [50] 50) where
"⊨⇩S A ≡ ∀ℳ. is_standard_model ℳ ⟶ ℳ ⊨ A"
abbreviation is_true_sentence_in where
"is_true_sentence_in A ℳ ≡ is_sentence A ∧ ℳ ⊨⇘undefined⇙ A"
abbreviation is_false_sentence_in where
"is_false_sentence_in A ℳ ≡ is_sentence A ∧ ¬ ℳ ⊨⇘undefined⇙ A"
abbreviation is_model_for where
"is_model_for ℳ 𝒢 ≡ ∀A ∈ 𝒢. ℳ ⊨ A"
lemma general_validity_in_standard_validity:
assumes "⊨ A"
shows "⊨⇩S A"
using assms and standard_model_is_general_model by blast
end