Theory MaximalSet
theory MaximalSet
imports FinitenessClosedCharProp 
begin
definition maximal :: "'a set ⇒ 'a set set ⇒ bool" where
  "maximal S 𝒞 = (∀S'∈ 𝒞. S ⊆ S' ⟶ S = S')"
primrec sucP :: "'b formula set ⇒ 'b formula set set ⇒ (nat ⇒ 'b formula) ⇒ nat ⇒ 'b formula set"
where
  "sucP S 𝒞 f 0 = S"
| "sucP S 𝒞 f (Suc n) =
    (if sucP S 𝒞 f n ∪ {f n} ∈ 𝒞    
     then sucP S 𝒞 f n ∪ {f n}
     else sucP S 𝒞 f n)" 
definition MsucP :: "'b formula set ⇒ 'b formula set set ⇒ (nat ⇒ 'b formula) ⇒ 'b formula set" 
where 
"MsucP S 𝒞 f = (⋃n. sucP S 𝒞 f n)"
theorem Max_subsetuntoP: "S ⊆ MsucP S 𝒞 f"
proof (rule subsetI)
  fix x
  assume "x ∈ S"
  hence "x ∈ sucP S 𝒞 f 0" by simp
  hence  "∃n. x ∈ sucP S 𝒞 f n" by (rule exI)
  thus "x ∈ MsucP S 𝒞 f" by (simp add: MsucP_def)
qed 
definition chain :: "(nat ⇒ 'a set) ⇒ bool" where
  "chain S = (∀n. S n ⊆ S (Suc n))"
 
lemma chainD:
  assumes "chain S" and "x ∈ S m"
  shows "x ∈ S (m + n)"
proof -
  show ?thesis using assms by (induct n)(auto simp add: chain_def)  
qed
lemma chainD':
  assumes hip1: "chain S" and hip2: "x ∈ S m" and hip3: "m ≤ k"
  shows "x ∈ S k"
proof -
  have "∃n. k = m + n" using hip3 by arith
  then obtain n where n: "k = m + n" by (rule exE) 
  moreover
  have "x ∈ S (m + n)" using hip1 hip2 by (rule chainD)  
  thus ?thesis using n by simp
qed
lemma chain_index:
  assumes ch: "chain S" and fin: "finite F"
  shows "F ⊆ (⋃n. S n) ⟹ ∃n. F ⊆ S n" using fin
proof (induct rule: finite_induct)
  assume "{} ⊆ (⋃n. S n)"
  show "∃n.{} ⊆ S n"  by simp
  next
    fix x F
    assume 
      h1: "finite F" 
      and h2: "x ∉ F" 
      and h3: "F ⊆ (⋃n. S n)⟹ ∃n. F ⊆ S n" 
      and h4: "insert x F ⊆ (⋃n. S n)"
  show "∃n. insert x F ⊆ S n"
  proof -
    have "∃m. x ∈ S m" using h4 by simp
    then obtain m where m: "x ∈ S m" by (rule exE)
    have "F ⊆ (⋃n. S n)" using h4 by simp
    hence  "∃n. F ⊆ S n" using h3 by simp
    then obtain n where n: "F ⊆ S n" by (rule exE)
    have "m ≤ (max m n)"  by (simp add: max_def)      
    with ch m  have 1: "x ∈ S (max m n)" by (rule chainD')   
    have 2:  "F ⊆ S (max m n)" 
    proof (rule subsetI)
      fix y
      assume "y ∈ F"
      hence "y ∈ S n" using n by blast
      moreover
      have "n ≤ (max m n)" by simp
      ultimately
      show "y ∈ S (max m n)"  by (rule chainD'[OF ch _ _])
    qed 
    have "insert x F  ⊆ S (max m n)" using 1 2 by simp
    thus ?thesis by (rule exI)
  qed
qed
theorem chain_union_closed:
  assumes hip1: "finite_character 𝒞" 
  and hip2:"chain S" 
  and hip3: "∀n. S n ∈ 𝒞"
  shows "(⋃n. S n) ∈ 𝒞"
proof -
  have "∀S. (S ∈ 𝒞) = (∀T. finite T ⟶ T ⊆ S ⟶ T ∈ 𝒞)" 
  using hip1 by (unfold finite_character_def)
  hence 1: "(⋃n. S n) ∈ 𝒞 = (∀T. finite T ⟶ T ⊆ (⋃n. S n) ⟶ T ∈ 𝒞)" 
  by (rule allE)
  thus "(⋃n. S n) ∈ 𝒞"
  proof -
    have "(∀T. finite T ⟶ T ⊆ (⋃n. S n) ⟶ T ∈ 𝒞)"
    proof (rule allI impI)+
      fix T
      assume h1: "finite T" and h2: "T ⊆ (⋃n. S n)"
      have "∃n. T ⊆ S n" using hip2 h1 h2 by (rule chain_index)
      moreover  
      have "subset_closed 𝒞" using hip1 by (rule finite_character_closed)
      hence "∀S∈𝒞. ∀S'⊆S. S' ∈ 𝒞"  by (unfold subset_closed_def)
      ultimately
      show "T ∈ 𝒞" using hip3 by auto   
    qed         
    thus "(⋃n. S n) ∈ 𝒞" using 1 by simp
  qed
qed    
lemma chain_suc: "chain (sucP S 𝒞 f)"
by (simp add: chain_def) blast
theorem MaxP_in_C:
  assumes hip1: "finite_character 𝒞" and hip2: "S ∈ 𝒞" 
  shows  "MsucP S 𝒞 f ∈ 𝒞"
proof (unfold MsucP_def) 
  have "chain (sucP S 𝒞 f)" by (rule chain_suc)
  moreover
  have "∀n. sucP S 𝒞 f n ∈ 𝒞"
  proof (rule allI)
    fix n
    show "sucP S 𝒞 f n ∈ 𝒞" using hip2 
      by (induct n)(auto simp add: sucP_def)
  qed   
  ultimately  
  show "(⋃ n. sucP S 𝒞 f n) ∈ 𝒞" by (rule chain_union_closed[OF hip1]) 
qed 
definition enumeration :: "(nat ⇒'b) ⇒ bool" where
  "enumeration f = (∀y.∃n. y = (f n))"
lemma enum_nat: "∃g. enumeration (g:: nat ⇒ nat)"
proof -
  have "∀y. ∃ n. y = (λn. n) n" by simp
  hence "enumeration (λn. n)" by (unfold enumeration_def)
  thus ?thesis by auto
qed
theorem suc_maximalP: 
  assumes hip1: "enumeration f" and hip2: "subset_closed 𝒞"  
  shows "maximal (MsucP S 𝒞 f) 𝒞"
proof -  
  have "∀S'∈𝒞. (⋃x. sucP S 𝒞 f x) ⊆ S' ⟶ (⋃x. sucP S 𝒞 f x) = S'"
  proof (rule ballI impI)+
    fix S'
    assume h1: "S' ∈ 𝒞" and h2: "(⋃x. sucP S 𝒞 f x) ⊆ S'"
    show "(⋃x. sucP S 𝒞 f x) = S'"    
    proof (rule ccontr)
      assume "(⋃x. sucP S 𝒞 f x) ≠ S'"
      hence  "∃z. z ∈ S' ∧ z ∉ (⋃x. sucP S 𝒞 f x)" using h2 by blast
      then obtain z where z: "z ∈ S' ∧ z ∉ (⋃x. sucP S 𝒞 f x)" by (rule exE)
      have "∃n. z = f n" using hip1 h1 by (unfold enumeration_def) simp 
      then obtain n where n: "z = f n" by (rule exE) 
      have "sucP S 𝒞 f n ∪ {f n} ⊆ S'"
      proof - 
        have "f n ∈ S'" using z n  by simp
        moreover        
        have "sucP S 𝒞 f n ⊆ (⋃x. sucP S 𝒞 f x)" by auto 
        ultimately 
        show ?thesis using h2 by simp
      qed      
      hence "sucP S 𝒞 f n ∪ {f n} ∈ 𝒞" 
        using h1 hip2 by (unfold subset_closed_def) simp
      hence "f n ∈ sucP S 𝒞 f (Suc n)" by simp      
      moreover
      have "∀x. f n ∉ sucP S 𝒞 f x" using z n by simp
      ultimately show False
        by blast
    qed
  qed
  thus ?thesis
    by  (simp add: maximal_def MsucP_def) 
qed
corollary ConsistentExtensionP:
  assumes hip1: "finite_character 𝒞" 
  and hip2: "S ∈ 𝒞" 
  and hip3:  "enumeration f" 
  shows "S ⊆ MsucP S 𝒞 f" 
  and "MsucP S 𝒞 f ∈ 𝒞" 
  and "maximal (MsucP S 𝒞 f) 𝒞"
proof -
  show "S ⊆ MsucP S 𝒞 f" using Max_subsetuntoP by auto
next
  show "MsucP S 𝒞 f ∈ 𝒞" using  MaxP_in_C[OF hip1 hip2] by simp
next
  show "maximal (MsucP S 𝒞 f) 𝒞" 
    using finite_character_closed[OF hip1] and hip3 suc_maximalP
    by auto
qed
end