{-# OPTIONS --cubical-compatible --safe #-} open import Level open import Ordinals import HODBase module OD {n : Level } (O : Ordinals {n} ) (HODAxiom : HODBase.ODAxiom O) where open import Data.Nat renaming ( zero to Zero ; suc to Suc ; ℕ to Nat ; _⊔_ to _n⊔_ ) open import Relation.Binary.PropositionalEquality hiding ( [_] ) open import Data.Nat.Properties open import Data.Empty open import Data.Unit open import Relation.Nullary open import Relation.Binary hiding (_⇔_) open import Relation.Binary.Core hiding (_⇔_) open import logic import OrdUtil open import nat open Ordinals.Ordinals O open Ordinals.IsOrdinals isOrdinal -- open Ordinals.IsNext isNext open OrdUtil O -- Ordinal Definable Set open HODBase.HOD open HODBase.OD open _∧_ open _∨_ open Bool open HODBase._==_ open HODBase.ODAxiom HODAxiom HOD = HODBase.HOD O OD = HODBase.OD O Ords = HODBase.Ords O _==_ = HODBase._==_ O ==-refl = HODBase.==-refl O ==-trans = HODBase.==-trans O ==-sym = HODBase.==-sym O ⇔→== = HODBase.⇔→== O ==-Setoid = HODBase.==-Setoid O -- use like this open import Relation.Binary.Reasoning.Setoid ==-Setoid -- possible order restriction (required in the axiom of Omega ) -- postulate odAxiom-ho< : ODAxiom-ho< -- open ODAxiom-ho< odAxiom-ho< -- odmax minimality -- -- since we have ==→o≡ , so odmax have to be unique. We should have odmaxmin in HOD. -- We can calculate the minimum using sup but it is tedius. -- Only Select has non minimum odmax. -- We have the same problem on 'def' itself, but we leave it. odmaxmin : Set (suc n) odmaxmin = (y : HOD) (z : Ordinal) → ((x : Ordinal)→ def (od y) x → x o< z) → odmax y o< osuc z -- OD ⇔ Ordinal leads a contradiction, so we need bounded HOD ¬OD-order : ( & : OD → Ordinal ) → ( * : Ordinal → OD ) → ( { x y : OD } → def y ( & x ) → & x o< & y) → ⊥ ¬OD-order & * c<→o< = o≤> <-osuc (c<→o< {Ords} (lift tt) ) -- Ordinal in OD ( and ZFSet ) Transitive Set Ord : ( a : Ordinal ) → HOD Ord a = record { od = record { def = λ y → y o< a } ; odmax = a ; ¬a ¬b c = ⊥-elim ( ¬x<0 c ) ∅6 : { x : HOD } → ¬ ( x ∋ x ) -- no Russel paradox ∅6 {x} x∋x = o<¬≡ refl ( c<→o< {x} {x} x∋x ) odef-iso : {A B : HOD } {x y : Ordinal } → x ≡ y → (odef A y → odef B y) → odef A x → odef B x odef-iso refl t = t is-o∅ : ( x : Ordinal ) → Dec ( x ≡ o∅ ) is-o∅ x with trio< x o∅ is-o∅ x | tri< a ¬b ¬c = no ¬b is-o∅ x | tri≈ ¬a b ¬c = yes b is-o∅ x | tri> ¬a ¬b c = no ¬b odef< : {b : Ordinal } { A : HOD } → odef A b → b o< & A odef< {b} {A} ab = subst (λ k → k o< & A) &iso ( c<→o< (subst (λ k → odef A k ) (sym &iso ) ab)) odef∧< : {A : HOD } {y : Ordinal} {n : Level } → {P : Set n} → odef A y ∧ P → y o< & A odef∧< {A } {y} p = subst (λ k → k o< & A) &iso ( c<→o< (subst (λ k → odef A k ) (sym &iso ) (proj1 p ))) -- the pair _,_ : HOD → HOD → HOD x , y = record { od = record { def = λ t → (t ≡ & x ) ∨ ( t ≡ & y ) } ; odmax = omax (& x) (& y) ; ¬a ¬b c = ⊥-elim ( o<> (⊆→o≤ {x , x} {y} y⊆x,x ) lemma1 ) where lemma : {z : Ordinal} → (z ≡ & x) ∨ (z ≡ & x) → & x ≡ z lemma (case1 refl) = refl lemma (case2 refl) = refl y⊆x,x : {z : Ordinal} → def (od (x , x)) z → def (od y) z y⊆x,x {z} lt = subst (λ k → def (od y) k ) (lemma lt) y∋x lemma1 : osuc (& y) o< & (x , x) lemma1 = subst (λ k → osuc (& y) o< k ) (sym (peq {x})) (osucc c ) ε-induction : { ψ : HOD → Set (suc n)} → ( {x : HOD } → ({ y : HOD } → x ∋ y → ψ y ) → ψ x ) → (x : HOD ) → ψ x ε-induction {ψ} ind x = ε-induction-hod _ {& x} <-osuc x <-osuc where induction2 : (x₁ : Ordinal) → ((y : Ordinal) → y o< x₁ → (y₁ : HOD) → & y₁ o< osuc y → ψ y₁) → (y : HOD) → & y o< osuc x₁ → ψ y induction2 x prev y y≤x = ind (λ {y₁} lt → prev (& y₁) (lemma1 y₁ lt) y₁ <-osuc ) where lemma1 : (y₁ : HOD) → y ∋ y₁ → & y₁ o< x lemma1 y₁ lt with trio< (& y₁) x ... | tri< a ¬b ¬c = a ... | tri> ¬a ¬b c = ⊥-elim (o≤> (ordtrans (c<→o< lt) y≤x) c ) ... | tri≈ ¬a b ¬c with osuc-≡< y≤x ... | case1 y=x = subst (λ k → & y₁ o< k ) y=x (c<→o< lt) ... | case2 y <-osuc (sup-o< next-ord (sup-o next-ord)) where next-ord : Ordinal → Ordinal next-ord x = osuc x _=h=_ : (x y : HOD) → Set n x =h= y = od x == od y record Own (A : HOD) (x : Ordinal) : Set n where field owner : Ordinal ao : odef A owner ox : odef (* owner) x Union : HOD → HOD Union U = record { od = record { def = λ x → Own U x } ; odmax = osuc (& U) ; ¬a ¬b c = ⊥-elim (¬x<0 c) ¬0=ux : {x : HOD} → ¬ o∅ ≡ & (Union ( x , ( x , x))) ¬0=ux {x} eq = ⊥-elim ( o<¬≡ eq (ordtrans≤-< o∅ ¬a ¬b c with lt (o<-subst c (sym &iso) refl ) ... | ttt = ⊥-elim ( o<¬≡ refl (o<-subst ttt &iso refl )) open import zf Select : (X : HOD ) → (ψ : (x : HOD ) → Set n ) ( zψ : ZPred HOD _∋_ _=h=_ ψ ) → HOD Select X ψ zψ = record { od = record { def = λ x → ( odef X x ∧ ψ ( * x )) } ; odmax = odmax X ;