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: "pP  qP. rP. q  p  r  p  q  r"
begin

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

lemma filter_complement_dense:
  assumes "filter(G)" shows "dense(P - G)"
proof
  fix p
  assume "pP"
  show "dP - G. d  p"
  proof (cases "pG")
    case True
    note pP assms
    moreover
    obtain q r where "q  p" "r  p" "q  r" "qP" "rP" 
      using separative[OF pP]
      by force
    with filter(G)
    obtain s where "s  p" "s  G" "s  P"
      using filter_imp_compat[of G q r]
      by auto
    then
    show ?thesis by blast
  next
    case False
    with pP 
    show ?thesis using leq_reflI unfolding Diff_def by auto
  qed
qed

end (* separative_notion *)

locale ctm_separative = forcing_data + separative_notion
begin

lemma generic_not_in_M: assumes "M_generic(G)"  shows "G  M"
proof
  assume "GM"
  then
  have "P - G  M" 
    using P_in_M Diff_closed by simp
  moreover
  have "¬(qG. q  P - G)" "(P - G)  P"
    unfolding Diff_def by auto
  moreover
  note assms
  ultimately
  show "False"
    using filter_complement_dense[of G] M_generic_denseD[of G "P-G"] 
      M_generic_def by simp ― ‹need to put generic ==> filter in claset›
qed

theorem proper_extension: assumes "M_generic(G)" shows "M  M[G]"
  using assms G_in_Gen_Ext[of G] one_in_G[of G] generic_not_in_M
  by force

end (* ctm_separative *)

end