{-# OPTIONS --allow-unsolved-metas #-} open import Level open import Ordinals module filter {n : Level } (O : Ordinals {n}) where open import zf open import logic import OD open import Relation.Nullary open import Data.Empty open import Relation.Binary.Core open import Relation.Binary.PropositionalEquality import BAlgebra open BAlgebra O open inOrdinal O open OD O open OD.OD open ODAxiom odAxiom import OrdUtil import ODUtil open Ordinals.Ordinals O open Ordinals.IsOrdinals isOrdinal open Ordinals.IsNext isNext open OrdUtil O open ODUtil O import ODC open ODC O open _∧_ open _∨_ open Bool -- L is a boolean algebra, but we don't assume this explicitly -- -- NEG : {p : HOD} → L ∋ p → L ∋ (P \ p) -- CAP : {p q : HOD} → L ∋ p → L ∋ q → L ∋ (p ∩ q ) -- -- Kunen p.76 and p.53, we use ⊆ record Filter { L P : HOD } (LP : L ⊆ Power P) : Set (suc n) where field filter : HOD f⊆L : filter ⊆ L filter1 : { p q : HOD } → L ∋ q → filter ∋ p → p ⊆ q → filter ∋ q filter2 : { p q : HOD } → filter ∋ p → filter ∋ q → L ∋ (p ∩ q) → filter ∋ (p ∩ q) open Filter record prime-filter { L P : HOD } {LP : L ⊆ Power P} (F : Filter {L} {P} LP) : Set (suc (suc n)) where field proper : ¬ (filter F ∋ od∅) prime : {p q : HOD } → L ∋ p → L ∋ q → filter F ∋ (p ∪ q) → ( filter F ∋ p ) ∨ ( filter F ∋ q ) record ultra-filter { L P : HOD } {LP : L ⊆ Power P} (F : Filter {L} {P} LP) : Set (suc (suc n)) where field proper : ¬ (filter F ∋ od∅) ultra : {p : HOD } → L ∋ p → L ∋ ( P \ p) → ( filter F ∋ p ) ∨ ( filter F ∋ ( P \ p) ) ∈-filter : {L P p : HOD} → {LP : L ⊆ Power P} → (F : Filter {L} {P} LP ) → filter F ∋ p → L ∋ p ∈-filter {L} {p} {LP} F lt = ( f⊆L F) lt ⊆-filter : {L P p q : HOD } → {LP : L ⊆ Power P } → (F : Filter {L} {P} LP) → L ∋ q → q ⊆ P ⊆-filter {L} {P} {p} {q} {LP} F lt = power→⊆ P q ( LP lt ) ∪-lemma1 : {L p q : HOD } → (p ∪ q) ⊆ L → p ⊆ L ∪-lemma1 {L} {p} {q} lt p∋x = lt (case1 p∋x) ∪-lemma2 : {L p q : HOD } → (p ∪ q) ⊆ L → q ⊆ L ∪-lemma2 {L} {p} {q} lt p∋x = lt (case2 p∋x) q∩q⊆q : {p q : HOD } → (q ∩ p) ⊆ q q∩q⊆q lt = proj1 lt ∩→≡1 : {p q : HOD } → p ⊆ q → (q ∩ p) ≡ p ∩→≡1 {p} {q} p⊆q = ==→o≡ record { eq→ = c00 ; eq← = c01 } where c00 : {x : Ordinal} → odef (q ∩ p) x → odef p x c00 {x} qpx = proj2 qpx c01 : {x : Ordinal} → odef p x → odef (q ∩ p) x c01 {x} px = ⟪ p⊆q px , px ⟫ ∩→≡2 : {p q : HOD } → q ⊆ p → (q ∩ p) ≡ q ∩→≡2 {p} {q} q⊆p = ==→o≡ record { eq→ = c00 ; eq← = c01 } where c00 : {x : Ordinal} → odef (q ∩ p) x → odef q x c00 {x} qpx = proj1 qpx c01 : {x : Ordinal} → odef q x → odef (q ∩ p) x c01 {x} qx = ⟪ qx , q⊆p qx ⟫ open HOD ----- -- -- ultra filter is prime -- filter-lemma1 : {P L : HOD} → (LP : L ⊆ Power P) → ({p : HOD} → L ∋ p → L ∋ (P \ p)) → ({p q : HOD} → L ∋ p → L ∋ q → L ∋ (p ∩ q )) → (F : Filter {L} {P} LP) → ultra-filter F → prime-filter F filter-lemma1 {P} {L} LNEG NEG CAP F u = record { proper = ultra-filter.proper u ; prime = lemma3 } where lemma3 : {p q : HOD} → L ∋ p → L ∋ q → filter F ∋ (p ∪ q) → ( filter F ∋ p ) ∨ ( filter F ∋ q ) lemma3 {p} {q} Lp Lq lt with ultra-filter.ultra u Lp (NEG Lp) ... | case1 p∈P = case1 p∈P ... | case2 ¬p∈P = case2 (filter1 F {q ∩ (P \ p)} Lq lemma7 lemma8) where lemma5 : ((p ∪ q ) ∩ (P \ p)) =h= (q ∩ (P \ p)) lemma5 = record { eq→ = λ {x} lt → ⟪ lemma4 x lt , proj2 lt ⟫ ; eq← = λ {x} lt → ⟪ case2 (proj1 lt) , proj2 lt ⟫ } where lemma4 : (x : Ordinal ) → odef ((p ∪ q) ∩ (P \ p)) x → odef q x lemma4 x lt with proj1 lt lemma4 x lt | case1 px = ⊥-elim ( proj2 (proj2 lt) px ) lemma4 x lt | case2 qx = qx lemma9 : L ∋ ((p ∪ q ) ∩ (P \ p)) lemma9 = subst (λ k → L ∋ k ) (sym (==→o≡ lemma5)) (CAP Lq (NEG Lp)) lemma6 : filter F ∋ ((p ∪ q ) ∩ (P \ p)) lemma6 = filter2 F lt ¬p∈P lemma9 lemma7 : filter F ∋ (q ∩ (P \ p)) lemma7 = subst (λ k → filter F ∋ k ) (==→o≡ lemma5 ) lemma6 lemma8 : (q ∩ (P \ p)) ⊆ q lemma8 lt = proj1 lt ----- -- -- if Filter {L} {P} contains L, prime filter is ultra -- filter-lemma2 : {P L : HOD} → (LP : L ⊆ Power P) → ({p : HOD} → L ∋ p → L ∋ ( P \ p)) → (F : Filter {L} {P} LP) → filter F ∋ P → prime-filter F → ultra-filter F filter-lemma2 {P} {L} LP NEG F f∋P prime = record { proper = prime-filter.proper prime ; ultra = λ {p} L∋p _ → prime-filter.prime prime L∋p (NEG L∋p) (lemma p (p⊆L L∋p )) } where open _==_ p⊆L : {p : HOD} → L ∋ p → p ⊆ P p⊆L {p} lt = power→⊆ P p ( LP lt ) p+1-p=1 : {p : HOD} → p ⊆ P → P =h= (p ∪ (P \ p)) eq→ (p+1-p=1 {p} p⊆P) {x} lt with ODC.decp O (odef p x) eq→ (p+1-p=1 {p} p⊆P) {x} lt | yes p∋x = case1 p∋x eq→ (p+1-p=1 {p} p⊆P) {x} lt | no ¬p = case2 ⟪ lt , ¬p ⟫ eq← (p+1-p=1 {p} p⊆P) {x} ( case1 p∋x ) = subst (λ k → odef P k ) &iso (p⊆P ( subst (λ k → odef p k) (sym &iso) p∋x )) eq← (p+1-p=1 {p} p⊆P) {x} ( case2 ¬p ) = proj1 ¬p lemma : (p : HOD) → p ⊆ P → filter F ∋ (p ∪ (P \ p)) lemma p p⊆P = subst (λ k → filter F ∋ k ) (==→o≡ (p+1-p=1 {p} p⊆P)) f∋P record Ideal {L P : HOD } (LP : L ⊆ Power P) : Set (suc n) where field ideal : HOD i⊆L : ideal ⊆ L ideal1 : { p q : HOD } → L ∋ q → ideal ∋ p → q ⊆ p → ideal ∋ q ideal2 : { p q : HOD } → ideal ∋ p → ideal ∋ q → L ∋ (p ∪ q) → ideal ∋ (p ∪ q) open Ideal proper-ideal : {L P : HOD} → (LP : L ⊆ Power P) → (P : Ideal {L} {P} LP ) → {p : HOD} → Set n proper-ideal {L} {P} LP I = ideal I ∋ od∅ prime-ideal : {L P : HOD} → (LP : L ⊆ Power P) → Ideal {L} {P} LP → ∀ {p q : HOD } → Set n prime-ideal {L} {P} LP I {p} {q} = ideal I ∋ ( p ∩ q) → ( ideal I ∋ p ) ∨ ( ideal I ∋ q ) open import Relation.Binary.Definitions record MaximumFilter {L P : HOD} (LP : L ⊆ Power P) (F : Filter {L} {P} LP) : Set (suc n) where field mf : Filter {L} {P} LP F⊆mf : filter F ⊆ filter mf proper : ¬ (filter mf ∋ od∅) is-maximum : ( f : Filter {L} {P} LP ) → ¬ (filter f ∋ od∅) → filter F ⊆ filter f → ¬ ( filter mf ⊂ filter f ) record Fp {L P : HOD} (LP : L ⊆ Power P) (F : Filter {L} {P} LP) (mx : MaximumFilter {L} {P} LP F ) (p x : Ordinal ) : Set n where field y : Ordinal mfy : odef (filter (MaximumFilter.mf mx)) y y-p⊂x : ( * y \ * p ) ⊆ * x max→ultra : {L P : HOD} (LP : L ⊆ Power P) → ({p q : HOD} → L ∋ p → L ∋ q → L ∋ (p ∩ q)) → (F0 : Filter {L} {P} LP) → {y : Ordinal } → odef (filter F0) y → (mx : MaximumFilter {L} {P} LP F0 ) → ultra-filter ( MaximumFilter.mf mx ) max→ultra {L} {P} LP CAP F0 {y} mfy mx = record { proper = MaximumFilter.proper mx ; ultra = ultra } where mf = MaximumFilter.mf mx ultra : {p : HOD} → L ∋ p → L ∋ (P \ p) → (filter mf ∋ p) ∨ (filter mf ∋ (P \ p)) ultra {p} Lp Lnp with ODC.∋-p O (filter mf) p ... | yes y = case1 y ... | no np = case2 (subst (λ k → k ∋ (P \ p)) F=mf F∋P-p) where F : HOD F = record { od = record { def = λ x → odef L x ∧ Fp {L} {P} LP F0 mx (& p) x } ; odmax = & L ;