view src/cardinal.agda @ 1406:ba377f7d0c40

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Thu, 29 Jun 2023 16:58:43 +0900
parents 6db21bb5e704
children 523bd51605cb
line wrap: on
line source

{-# OPTIONS --allow-unsolved-metas #-}

open import Level hiding (suc ; zero )
open import Ordinals
module cardinal {n : Level } (O : Ordinals {n}) where

open import logic
-- import OD
import OD hiding ( _⊆_ )

import ODC
open import Data.Nat 
open import Relation.Binary.PropositionalEquality
open import Data.Nat.Properties
open import Data.Empty
open import Relation.Nullary
open import Relation.Binary
open import Relation.Binary.Core

open inOrdinal O
open OD O
open OD.OD
open ODAxiom odAxiom
open import ZProduct O

import OrdUtil
import ODUtil
open Ordinals.Ordinals  O
open Ordinals.IsOrdinals isOrdinal
-- open Ordinals.IsNext isNext
open OrdUtil O
open ODUtil O

_⊆_ : ( A B : HOD ) → Set n
_⊆_ A B = {x : Ordinal } → odef A x → odef B x


open _∧_
open _∨_
open Bool
open _==_

open HOD

record OrdBijection (A B : Ordinal ) : Set n where
   field
       fun←  : (x : Ordinal ) → odef (* A)  x → Ordinal
       fun→  : (x : Ordinal ) → odef (* B)  x → Ordinal
       funB  : (x : Ordinal ) → ( lt : odef (* A)  x ) → odef (* B) ( fun← x lt )
       funA  : (x : Ordinal ) → ( lt : odef (* B)  x ) → odef (* A) ( fun→ x lt )
       fiso← : (x : Ordinal ) → ( lt : odef (* B)  x ) → fun← ( fun→ x lt ) ( funA x lt ) ≡ x
       fiso→ : (x : Ordinal ) → ( lt : odef (* A)  x ) → fun→ ( fun← x lt ) ( funB x lt ) ≡ x

ordbij-refl : { a b : Ordinal } → a ≡ b → OrdBijection a b
ordbij-refl {a} refl = record {
       fun←  = λ x _ → x 
     ; fun→  = λ x _ → x 
     ; funB  = λ x lt → lt
     ; funA  = λ x lt → lt
     ; fiso← = λ x lt → refl
     ; fiso→ = λ x lt → refl
    }

open Injection
open OrdBijection

record IsImage (a b : Ordinal) (iab : Injection a b ) (x : Ordinal ) : Set n where
   field
      y : Ordinal 
      ay : odef (* a) y
      x=fy : x ≡ i→ iab _ ay

Image : (a : Ordinal) { b : Ordinal } → Injection a b → HOD
Image a {b} iab = record { od = record { def = λ x → IsImage a b iab x } ; odmax = b ; <odmax = im00  } where
    im00 : {x : Ordinal } → IsImage a b iab x → x o< b
    im00 {x} record { y = y ; ay = ay ; x=fy = x=fy } = subst₂ ( λ j k → j o< k) (trans &iso (sym x=fy)) &iso 
         (c<→o< (subst ( λ k → odef (* b) k) (sym &iso) (iB iab y ay)) )

record IsInverseImage (a b : Ordinal) (iab : Injection a b ) (x y : Ordinal ) : Set n where
   field
      ax : odef (* a) x
      x=fy : y ≡ i→ iab x ax

InverseImage : {a : Ordinal} ( b : Ordinal ) → Injection a b → (y : Ordinal ) → HOD
InverseImage {a} b iab y = record { od = record { def = λ x → IsInverseImage a b iab x y } ; odmax = & (* a) ; <odmax = im00  } where
    im00 : {x : Ordinal } → IsInverseImage a b iab x y → x o< & (* a)
    im00 {x} record { ax = ax ; x=fy = x=fy } = odef< ax

Image⊆b : { a b : Ordinal } → (iab : Injection a b) → Image a iab ⊆ * b 
Image⊆b {a} {b} iab {x} record { y = y ; ay = ay ; x=fy = x=fy } = subst (λ k → odef (* b) k) (sym x=fy) (iB iab y ay)

_=c=_ : ( A B : HOD ) → Set n
A =c= B = OrdBijection ( & A ) ( & B )

c=→≡ : {A B : HOD} → A =c= B → (A ≡ ?) ∧ (B ≡ ?)
c=→≡ = ?

≡→c= : {A B : HOD} → A ≡ B → A =c= B
≡→c= = ?

open import BAlgebra O

_-_ : (a b : Ordinal ) → Ordinal 
a - b = & ( (* a) \ (* b) )

-→<  : (a b : Ordinal ) → (a - b) o≤ a
-→< a b = subst₂ (λ j k → j o≤ k) &iso &iso ( ⊆→o≤ ( λ {x} a-b → proj1 (subst ( λ k → odef k x) *iso a-b) ) )

b-a⊆b : {a b x : Ordinal } → odef (* (b - a)) x → odef (* b) x
b-a⊆b {a} {b} {x} lt with subst (λ k → odef k x) *iso lt
... | ⟪ bx , ¬ax ⟫ = bx

open Data.Nat

Injection-⊆ : {a b c : Ordinal } → * c ⊆ * a → Injection a b → Injection c b
Injection-⊆ {a} {b} {c} le f = record { i→ = λ x cx → i→ f x (le cx) ; iB = λ x cx → iB f x (le cx) 
        ; inject = λ x y ix iy eq → inject f x y (le ix) (le iy) eq  } 

Injection-∙ : {a b c : Ordinal } → Injection a b → Injection b c → Injection a c
Injection-∙ {a} {b} {c} f g = record { i→ = λ x ax → i→ g (i→ f x ax) (iB f x ax) ; iB = λ x ax → iB g (i→ f x ax) (iB f x ax)
        ; inject = λ x y ix iy eq → inject f x y ix iy (inject g (i→ f x ix) (i→ f y iy) (iB f x ix) (iB f y iy) eq)   } 


Bernstein : {a b : Ordinal } → Injection a b → Injection b a → OrdBijection a b
Bernstein {a} {b} (f @ record { i→ = fab ; iB = b∋fab ; inject = fab-inject }) ( g @ record { i→ = fba ; iB = a∋fba ; inject = fba-inject })
     = record { 
         fun←  = ?
       ; fun→  = ?
       ; funB  = ?
       ; funA  = ?
       ; fiso← = ?
       ; fiso→ = ? }
 where
      gf : Injection a a
      gf = record { i→ = λ x ax → fba (fab x ax) (b∋fab x ax) ; iB = λ x ax → a∋fba _ (b∋fab x ax) 
         ; inject = λ x y ax ay eq → fab-inject _ _ ax ay ( fba-inject _ _ (b∋fab _ ax) (b∋fab _ ay) eq) } 

      data gfImage : (i : ℕ) (x : Ordinal) → Set n where
          a-g : {x : Ordinal} → (ax : odef (* a) x ) → (¬ib : ¬ ( IsImage b a g x )) → gfImage 0 x
          next-gf : {x : Ordinal} → {i : ℕ} → (ix : IsImage a a gf x) → (gfiy : gfImage i (IsImage.y ix) ) → gfImage (suc i) x

      a∋gfImage : (i : ℕ) → {x : Ordinal } → gfImage i x → odef (* a) x
      a∋gfImage 0 {x} (a-g ax ¬ib) = ax
      a∋gfImage (suc i) {x} (next-gf record { y = y ; ay = ay ; x=fy = x=fy } lt ) = subst (λ k → odef (* a) k ) (sym x=fy) (a∋fba _ (b∋fab y ay) )

      C : ℕ → HOD                                               --  Image {& (C i)} {a} (gf i)  does not work
      C i = record { od = record { def = gfImage i } ; odmax = & (* a) ; <odmax = λ lt → odef< (a∋gfImage i lt) } 

      record CN (x : Ordinal) : Set n where
          field 
             i : ℕ
             gfix : gfImage i x

      UC : HOD
      UC = record { od = record { def = λ x → CN x } ; odmax = & (* a) ; <odmax = λ lt → odef< (a∋gfImage (CN.i lt) (CN.gfix lt))  }

      a-UC : HOD
      a-UC = record { od = record { def = λ x → odef (* a) x ∧ (¬ CN x) } ; odmax = & (* a) 
          ; <odmax = λ lt → odef< (proj1 lt)  }
      
      --  UC ⊆ * a
      --     f : UC → Image f UC    is injection
      --     g : Image f UC → UC    is injection

      UC⊆a : * (& UC) ⊆ * a
      UC⊆a {x} lt = a∋gfImage (CN.i be02) (CN.gfix be02)  where
            be02 : CN x
            be02 = subst (λ k → odef k x) *iso lt

      a-UC⊆a : * (& a-UC) ⊆ * a
      a-UC⊆a {x} lt = proj1 ( subst (λ k → odef k x) *iso lt )

      open import Relation.Binary.HeterogeneousEquality as HE using (_≅_ )

      fab-eq : {x y : Ordinal } → {ax : odef (* a) x} {ax1 : odef (* a) y}  → x ≡ y  → fab x ax ≡ fab y ax1
      fab-eq {x} {x} {ax} {ax1} refl = cong (λ k → fab x k) ( HE.≅-to-≡ ( ∋-irr {* a} ax ax1 ))  

      fba-eq : {x y : Ordinal } → {bx : odef (* b) x} {bx1 : odef (* b) y}  → x ≡ y  → fba x bx ≡ fba y bx1
      fba-eq {x} {x} {bx} {bx1} refl = cong (λ k → fba x k) ( HE.≅-to-≡ ( ∋-irr {* b} bx bx1 ))  

      g⁻¹ : {x : Ordinal } → (ax : odef (* a) x) → ¬ odef (C 0) x → Ordinal
      g⁻¹ {x} ax nc0 with ODC.p∨¬p O ( IsImage b a g x )
      ... | case1 record { y = y ; ay = ay ; x=fy = x=fy } = y
      ... | case2 ¬ism = ⊥-elim ( nc0 ( a-g ax ¬ism ) )

      b∋g⁻¹ : {x : Ordinal } → (ax : odef (* a) x) → (nc0 : ¬ odef (C 0) x) → odef (* b) (g⁻¹ ax nc0)
      b∋g⁻¹ {x} ax nc0 with ODC.p∨¬p O ( IsImage b a g x )
      ... | case1 record { y = y ; ay = ay ; x=fy = x=fy } = ay
      ... | case2 ¬ism = ⊥-elim ( nc0 ( a-g ax ¬ism ) )

      g⁻¹-iso : {x : Ordinal } → (ax : odef (* a) x) → (nc0 : ¬ odef (C 0) x ) → fba (g⁻¹ ax nc0) (b∋g⁻¹ ax nc0) ≡ x
      g⁻¹-iso {x} ax nc0 with ODC.p∨¬p O ( IsImage b a g x )
      ... | case1 record { y = y ; ay = ay ; x=fy = x=fy } = sym x=fy
      ... | case2 ¬ism = ⊥-elim ( nc0 ( a-g ax ¬ism ) )

      be10 : Injection (& a-UC) (b - (& (Image (& UC) (Injection-⊆ UC⊆a f) )) )
      be10 = record { i→ = λ x lt → g⁻¹ (be15 lt) (be16 lt) ; iB = be17 ; inject = ? } where
          be15 : {x : Ordinal } → odef (* (& a-UC)) x → odef (* a) x
          be15 = ?
          be16 : {x : Ordinal } → odef (* (& a-UC)) x → ¬ odef (C 0) x
          be16 = ? 
          be17 : (x : Ordinal) (lt : odef (* (& a-UC)) x) → odef (* (b - & (Image (& UC) (Injection-⊆ UC⊆a f)))) (g⁻¹ (be15 lt) (be16 lt))
          be17 = ?

      be11 : Injection  (b - (& (Image (& UC) (Injection-⊆ UC⊆a f) ))) (& a-UC)
      be11 = record { i→ = be13 ; iB = be14 ; inject = ? } where
          be13 : (x : Ordinal) → odef (* (b - & (Image (& UC) (Injection-⊆ UC⊆a f)))) x → Ordinal
          be13 x lt = fba x ( proj1 ( subst (λ k → odef k x) (*iso) lt ))
          be14 : (x : Ordinal) (lt : odef (* (b - & (Image (& UC) (Injection-⊆ UC⊆a f)))) x) → odef (* (& a-UC)) (be13 x lt)
          be14 x lt = subst (λ k → odef k (be13 x lt)) (sym *iso) ⟪ a∋fba x ( proj1 ( subst (λ k → odef k x) (*iso) lt )) , ? ⟫ where
              be16 : ¬ (odef (* (& (Image (& UC) (Injection-⊆ UC⊆a f)))) x)
              be16 = proj2 ( subst (λ k → odef k x) (*iso) lt )
              be15 : ¬ CN (be13 x lt)
              be15 = ?
     
      a-UC-iso0 : (x : Ordinal ) → (cx : odef (* (& a-UC)) x ) → i→ be11 ( i→ be10 x cx ) (iB be10 x cx)  ≡ x
      a-UC-iso0 x cx = ?

      a-UC-iso1 : (x : Ordinal ) → (cx : odef ? x ) → i→ be10 ( i→ be11 x cx ) (iB be11 x cx)  ≡ x
      a-UC-iso1 x cx = ?

      --   C n → f (C n) 
      fU : (x : Ordinal) → ( odef (* (& UC)) x) → Ordinal
      fU x lt = be03 where
            be02 : CN x
            be02 = subst (λ k → odef k x) *iso lt
            be03 : Ordinal
            be03 with CN.i be02 | CN.gfix be02
            ... | zero | a-g {x} ax ¬ib = fab x ax
            ... | suc i | next-gf record { y = y ; ay = ay ; x=fy = x=fy } gfiy 
                   = fab x (subst (λ k → odef (* a) k) (sym x=fy) (a∋fba _ (b∋fab y ay) ))

      --   f (C n) → g (f (C n) ) ≡ C (suc i)
      Uf : (x : Ordinal) → odef (* (& (Image (& UC) (Injection-⊆ UC⊆a f)))) x → Ordinal
      Uf x lt with subst (λ k → odef k x ) *iso lt
      ... | record { y = y ; ay = ay ; x=fy = x=fy } = y

      be04 : {x : Ordinal } →  (cx : odef (* (& UC)) x) → odef (* (& (Image (& UC) (Injection-⊆ UC⊆a f)))) (fU x cx)
      be04 {x} cx = subst (λ k → odef k (fU x cx) ) (sym *iso) be06 where
            be02 : CN x
            be02 = subst (λ k → odef k x) *iso cx
            be06 :  odef (Image (& UC) (Injection-⊆ UC⊆a f)) (fU x cx)
            be06 with CN.i be02 | CN.gfix be02
            ... | zero | a-g ax ¬ib = record { y = x ; ay = subst (λ k → odef k x) (sym *iso) be02 ; x=fy = fab-eq refl } 
            ... | suc i | next-gf record { y = y ; ay = ay ; x=fy = x=fy } gfiy 
                = record { y = x ; ay = subst (λ k → odef k x) (sym *iso) be02 ; x=fy = fab-eq refl } 

      UC-iso0 : (x : Ordinal ) → (cx : odef (* (& UC)) x ) → Uf ( fU x cx ) (be04 cx)  ≡ x
      UC-iso0 x cx = be03 where
            be02 : CN x
            be02 = subst (λ k → odef k x) *iso cx
            be03 : Uf ( fU x cx ) (be04 cx)  ≡ x
            be03 with CN.i be02 | CN.gfix be02 | be04 cx
            ... | zero | a-g ax ¬ib | cb with subst (λ k → odef k _ ) *iso cb | inspect  (fU x) cx
            ... | record { y = y ; ay = ay ; x=fy = x=fy } | record { eq = refl } = sym ( inject f _ _  ax (UC⊆a ay) x=fy )
            be03 | suc i | next-gf record { y = x1 ; ay = ax1 ; x=fy = x=fx1 } s | cb with 
                      subst (λ k → odef k (fab x (subst (odef (* a)) (sym x=fx1) (a∋fba (fab x1 ax1) (b∋fab x1 ax1))))  ) *iso cb 
            ... | record { y = y ; ay = ay ; x=fy = x=fy } = sym ( inject f _ _  ax (UC⊆a ay) x=fy ) where
                  ax : odef (* a) x
                  ax = subst (λ k → odef (* a) k ) (sym x=fx1) ( a∋fba _ (b∋fab x1 ax1) )

      be08 : {x : Ordinal } →  (cx : odef (* (& (Image (& UC) (Injection-⊆ UC⊆a f)))) x)  → odef (* (& UC)) (Uf x cx)
      be08 {x} cx with subst (λ k → odef k x) *iso cx
      ... | record { y = y ; ay = ay ; x=fy = x=fy } = ay

      UC-iso1 : (x : Ordinal ) → (cx : odef (* (& (Image (& UC) {b} (Injection-⊆ UC⊆a  f)))) x ) → fU ( Uf x cx ) (be08 cx)  ≡ x
      UC-iso1 x cx = be14 where
            be14 : fU ( Uf x cx ) (be08 cx)  ≡ x
            be14 with subst (λ k → odef k x) *iso cx
            ... | record { y = y ; ay = ay ; x=fy = x=fy } with CN.i (subst (λ k → OD.def (od k) y) *iso ay) | CN.gfix (subst (λ k → OD.def (od k) y) *iso ay)
            ... | 0 | a-g ax ¬ib = sym x=fy
            ... | (suc i) | next-gf t ix = sym x=fy

      h : {x : Ordinal } → (ax : odef (* a) x) → Ordinal
      h {x} ax with ODC.p∨¬p O ( CN x )
      ... | case1 cn  = fU x (subst (λ k → odef k x ) (sym *iso) cn)
      ... | case2 ncn = i→ be10 x (subst (λ k → odef k x ) (sym *iso) ⟪ ax , ncn ⟫ )

      h⁻¹ : {x : Ordinal } → (bx : odef (* b) x) → Ordinal
      h⁻¹ {x} bx with ODC.p∨¬p O ( CN (fba x bx ))
      ... | case1 cn  = be63 where -- Uf x (subst (λ k → odef k x ) (sym *iso) record { y = _ ; ay = ? ; x=fy = ? } )
           be63 : Ordinal
           be63 with CN.i cn | CN.gfix cn
           ... | 0 | a-g ax ¬ib = Uf x (subst (λ k → odef k x ) (sym *iso) record { y = _ ; ay = ? ; x=fy = ? } )
           ... | suc i | next-gf {px} ix t = Uf (fab px ?) (subst (λ k → odef k (fab px ?) ) (sym *iso) 
               record { y = _ ; ay = subst (λ k → odef k (fab px ?)) (sym *iso) record { i = ? ; gfix = ? } ; x=fy = ? } )
      ... | case2 ncn = i→ be11 x (subst (λ k → odef k x ) (sym *iso) be60 ) where
           be61 : ¬ odef (Image (& UC) (Injection-⊆ UC⊆a f)) x
           be61 record { y = y ; ay = ay ; x=fy = x=fy } = be62 where
               cny : CN y
               cny = subst (λ k → odef k y ) *iso ay 
               be62 : ⊥
               be62 with CN.i cny | CN.gfix cny
               ... | 0 | a-g ax ¬ib = ncn record { i = 1 ; gfix = next-gf  record { y = _ ; ay = ax ; x=fy = fba-eq x=fy } (a-g ax ¬ib) }
               ... | suc i | t = ncn record { i = suc (suc i) ; gfix = next-gf  record { y = _ ; ay = ? ; x=fy = fba-eq x=fy } t }
           be60 : odef (* b \ * (& (Image (& UC) (Injection-⊆ UC⊆a f)))) x
           be60 = ⟪ bx , subst (λ k → ¬ odef k x ) (sym *iso) be61 ⟫


_c<_ : ( A B : HOD ) → Set n
A c< B = ¬ ( Injection (& A)  (& B) )

Card : OD
Card = record { def = λ x → (a : Ordinal) → a o< x → ¬ OrdBijection a x }

record Cardinal (a : Ordinal ) : Set (Level.suc n) where
   field
       card : Ordinal
       ciso : OrdBijection a card
       cmax : (x : Ordinal) → card o< x → ¬ OrdBijection a x

Cardinal∈ : { s : HOD } → { t : Ordinal } → Ord t ∋ s →   s c< Ord t
Cardinal∈ = {!!}

Cardinal⊆ : { s t : HOD } → s ⊆ t →  ( s c< t ) ∨ ( s =c= t )
Cardinal⊆ = {!!}

Cantor1 : { u : HOD } → u c< Power u
Cantor1 = {!!}

Cantor2 : { u : HOD } → ¬ ( u =c=  Power u )
Cantor2 = {!!}