Theory Proper_Extension

section‹Separative notions and proper extensions›
theory Proper_Extension
  imports
    Names

begin

text‹The key ingredient to obtain a proper extension is to have
a ∗‹separative preorder›:›

locale separative_notion = forcing_notion +
  assumes separative: "p∈ℙ ⟹ ∃q∈ℙ. ∃r∈ℙ. q ≼ p ∧ r ≼ p ∧ q ⊥ r"
begin

text‹For separative preorders, the complement of every filter is
dense. Hence an $M$-generic filter cannot belong to the ground model.›

lemma filter_complement_dense:
  assumes "filter(G)"
  shows "dense(ℙ - G)"
proof
  fix p
  assume "p∈ℙ"
  show "∃d∈ℙ - G. d ≼ p"
  proof (cases "p∈G")
    case True
    note ‹p∈ℙ› assms
    moreover
    obtain q r where "q ≼ p" "r ≼ p" "q ⊥ r" "q∈ℙ" "r∈ℙ"
      using separative[OF ‹p∈ℙ›]
      by force
    with ‹filter(G)›
    obtain s where "s ≼ p" "s ∉ G" "s ∈ ℙ"
      using filter_imp_compat[of G q r]
      by auto
    then
    show ?thesis
      by blast
  next
    case False
    with ‹p∈ℙ›
    show ?thesis
      using refl_leq unfolding Diff_def by auto
  qed
qed

end ― ‹locale‹separative_notion››

locale ctm_separative = forcing_data1 + separative_notion
begin

context
  fixes G
  assumes generic: "M_generic(G)"
begin

interpretation G_generic1 ℙ leq 𝟭 M enum G
  by unfold_locales (simp add:generic)

lemma generic_not_in_M:
  shows "G ∉ M"
proof
  assume "G∈M"
  then
  have "ℙ - G ∈ M"
    using Diff_closed by simp
  moreover
  have "¬(∃q∈G. q ∈ ℙ - G)" "(ℙ - G) ⊆ ℙ"
    unfolding Diff_def by auto
  moreover
  note generic
  ultimately
  show "False"
    using filter_complement_dense[of G] M_generic_denseD[of "ℙ-G"]
    by auto
qed

theorem proper_extension: "M ≠ M[G]"
  using generic G_in_Gen_Ext one_in_G generic_not_in_M
  by force
end
end ― ‹locale‹ctm_separative››

end