@@ -10,12 +10,116 @@ being treated as a length in array machinier.
1010"""
1111struct InfiniteCardinal{N} <: Integer end
1212
13+ const ℵ₀ = InfiniteCardinal {0} ()
14+ const ℵ₁ = InfiniteCardinal {1} ()
15+
16+ string (:: InfiniteCardinal{0} ) = " ℵ₀"
17+ string (:: InfiniteCardinal{1} ) = " ℵ₁"
18+
19+ show (io:: IO , F:: InfiniteCardinal{0} ) where N = print (io, " ℵ₀" )
20+ show (io:: IO , F:: InfiniteCardinal{1} ) where N = print (io, " ℵ₁" )
21+
22+
1323isone (:: InfiniteCardinal ) = false
1424iszero (:: InfiniteCardinal ) = false
1525
26+ signbit (:: InfiniteCardinal ) = false
27+ sign (:: InfiniteCardinal ) = 1
28+ angle (:: InfiniteCardinal ) = 0
29+ abs (a:: InfiniteCardinal ) = a
30+ zero (:: InfiniteCardinal ) = 0
31+ one (:: InfiniteCardinal ) = 1
32+
33+ isinf (:: InfiniteCardinal ) = true
34+ isfinite (:: InfiniteCardinal ) = false
35+
36+ Integer (:: Infinity ) = InfiniteCardinal {0} ()
37+
38+ == (:: InfiniteCardinal{N} , :: InfiniteCardinal{N} ) where N = true
39+ == (:: InfiniteCardinal , :: InfiniteCardinal )= false
1640== (:: InfiniteCardinal , :: Int ) = false
1741== (:: Int , :: InfiniteCardinal ) = false
42+ == (x:: InfiniteCardinal , :: Infinity ) = x == ℵ₀
43+ == (:: Infinity , y:: InfiniteCardinal ) = ℵ₀ == y
44+ == (:: InfiniteCardinal{0} , y:: RealInfinity ) = ∞ == y
45+ == (x:: RealInfinity , :: InfiniteCardinal{0} ) = x == ∞
46+ == (:: InfiniteCardinal , y:: Real ) = ∞ == y
47+ == (x:: Real , :: InfiniteCardinal ) = x == ∞
48+
49+ @generated isless (:: InfiniteCardinal{N} , :: InfiniteCardinal{M} ) where {N,M} = :($ (isless (N, M)))
50+ isless (:: InfiniteCardinal{0} , :: InfiniteCardinal{0} ) = false
51+ isless (x:: Real , :: InfiniteCardinal{0} ) = isfinite (x)
52+ isless (x:: Real , :: InfiniteCardinal ) = true
53+ isless (x:: AbstractFloat , :: InfiniteCardinal{0} ) = isfinite (x)
54+ isless (x:: AbstractFloat , :: InfiniteCardinal ) = true
55+ isless (:: InfiniteCardinal , y:: Real ) = false
56+ isless (x:: InfiniteCardinal , y:: AbstractFloat ) = false
57+
58+ @generated < (:: InfiniteCardinal{N} , :: InfiniteCardinal{M} ) where {N,M} = :($ (N < M))
59+ @generated ≤ (:: InfiniteCardinal{N} , :: InfiniteCardinal{M} ) where {N,M} = :($ (N ≤ M))
60+ @generated > (:: InfiniteCardinal{N} , :: InfiniteCardinal{M} ) where {N,M} = :($ (N > M))
61+ @generated ≥ (:: InfiniteCardinal{N} , :: InfiniteCardinal{M} ) where {N,M} = :($ (N ≥ M))
62+
63+ ≤ (:: InfiniteCardinal{0} , :: InfiniteCardinal ) = true
64+ > (:: InfiniteCardinal{0} , :: InfiniteCardinal ) = false
65+ ≥ (:: InfiniteCardinal , :: InfiniteCardinal{0} ) = true
66+ < (:: InfiniteCardinal , :: InfiniteCardinal{0} ) = false
67+
68+
69+ < (x:: Real , :: InfiniteCardinal{0} ) = x < ∞
70+ < (x:: Real , :: InfiniteCardinal ) = true
71+ ≤ (x:: Real , :: InfiniteCardinal ) = true
72+ < (:: InfiniteCardinal , x:: Real ) = false
73+ ≤ (:: InfiniteCardinal{0} , x:: Real ) = ∞ ≤ x
74+ ≤ (:: InfiniteCardinal , x:: Real ) = false
75+ > (:: InfiniteCardinal{0} , y:: Real ) = ∞ > y
76+ > (:: InfiniteCardinal , :: Real ) = true
77+ ≥ (:: InfiniteCardinal , :: Real ) = true
78+ > (:: Real , :: InfiniteCardinal ) = false
79+ ≥ (x:: Real , :: InfiniteCardinal{0} ) = x ≥ ∞
80+ ≥ (x:: Real , :: InfiniteCardinal ) = false
81+
82+
83+ < (:: Infinity , :: InfiniteCardinal{0} ) = false
84+ < (:: Infinity , :: InfiniteCardinal ) = true
85+ ≤ (:: Infinity , :: InfiniteCardinal ) = true
86+ < (:: InfiniteCardinal , :: Infinity ) = false
87+ ≤ (:: InfiniteCardinal{0} , :: Infinity ) = true
88+ ≤ (:: InfiniteCardinal , :: Infinity ) = false
89+ > (:: InfiniteCardinal{0} , :: Infinity ) = false
90+ > (:: InfiniteCardinal , :: Infinity ) = true
91+ ≥ (:: InfiniteCardinal , :: Infinity ) = true
92+ > (:: Infinity , :: InfiniteCardinal ) = false
93+ ≥ (:: Infinity , :: InfiniteCardinal{0} ) = true
94+ ≥ (:: Infinity , :: InfiniteCardinal ) = false
95+
1896
97+ < (x:: RealInfinity , :: InfiniteCardinal{0} ) = x < ∞
98+ < (x:: RealInfinity , :: InfiniteCardinal ) = true
99+ ≤ (x:: RealInfinity , :: InfiniteCardinal ) = true
100+ > (:: InfiniteCardinal{0} , y:: RealInfinity ) = ∞ > y
101+ > (:: InfiniteCardinal , :: RealInfinity ) = true
102+ ≥ (:: InfiniteCardinal , :: RealInfinity ) = true
103+
104+
105+ @generated min (:: InfiniteCardinal{N} , :: InfiniteCardinal{M} ) where {N,M} = :(InfiniteCardinal {$(min(N,M))} ())
106+ @generated max (:: InfiniteCardinal{N} , :: InfiniteCardinal{M} ) where {N,M} = :(InfiniteCardinal {$(max(N,M))} ())
107+ min (x:: Real , :: InfiniteCardinal ) = x
108+ max (:: Real , ℵ:: InfiniteCardinal ) = ℵ
109+ min (:: InfiniteCardinal , x:: Real ) = x
110+ max (ℵ:: InfiniteCardinal , :: Real ) = ℵ
111+
112+ min (x:: RealInfinity , :: InfiniteCardinal ) = min (x, ∞)
113+ max (:: RealInfinity , ℵ:: InfiniteCardinal ) = ℵ
114+ min (:: InfiniteCardinal , y:: RealInfinity ) = min (∞, y)
115+ max (ℵ:: InfiniteCardinal , :: RealInfinity ) = ℵ
116+
117+ min (:: Infinity , :: InfiniteCardinal ) = ∞
118+ min (:: InfiniteCardinal , :: Infinity ) = ∞
119+ max (:: Infinity , ℵ:: InfiniteCardinal ) = ℵ
120+ max (ℵ:: InfiniteCardinal , :: Infinity ) = ℵ
121+
122+ * (x:: InfiniteCardinal ) = x
19123* (:: InfiniteCardinal{N} , :: InfiniteCardinal{N} ) where N = InfiniteCardinal {N} ()
20124* (:: InfiniteCardinal{N} , :: Infinity ) where N = InfiniteCardinal {N} ()
21125* (:: Infinity , :: InfiniteCardinal{N} ) where N = InfiniteCardinal {N} ()
@@ -24,32 +128,63 @@ function *(a::Integer, b::InfiniteCardinal)
24128 b
25129end
26130
131+ * (a:: Number , b:: InfiniteCardinal ) = a * ∞
132+
27133* (a:: InfiniteCardinal , b:: Integer ) = b* a
134+ * (a:: InfiniteCardinal , b:: Number ) = b* a
28135
136+ + (x:: InfiniteCardinal ) = x
137+ + (x:: InfiniteCardinal , y:: InfiniteCardinal ) = max (x,y)
29138
30- abs (a :: InfiniteCardinal ) = a
31- zero ( :: InfiniteCardinal ) = 0
32- one ( :: InfiniteCardinal ) = 1
139+ + ( :: Integer , y :: InfiniteCardinal ) = y
140+ + (x :: InfiniteCardinal , :: Integer ) = x
141+ - (x :: InfiniteCardinal , :: Integer ) = x
33142
34- for OP in (:< , :≤ )
35- @eval begin
36- $ OP (:: Real , :: InfiniteCardinal ) = true
37- $ OP (:: InfiniteCardinal , :: Real ) = false
38- end
143+ - (:: InfiniteCardinal{N} , :: InfiniteCardinal{N} ) where N = NotANumber ()
144+
145+ - (:: InfiniteCardinal ) = - ∞
146+ - (x:: Integer , :: InfiniteCardinal ) = x - ∞
147+
148+ for OP in (:fld ,:cld ,:div )
149+ @eval begin
150+ $ OP (x:: InfiniteCardinal , :: Real ) = x
151+ $ OP (:: InfiniteCardinal , :: InfiniteCardinal ) = NotANumber ()
152+ end
39153end
40154
41- for OP in (:> , :≥ )
42- @eval begin
43- $ OP (:: Real , :: InfiniteCardinal ) = false
44- $ OP (:: InfiniteCardinal , :: Real ) = true
45- end
155+ div (:: T , :: InfiniteCardinal ) where T<: Real = zero (T)
156+ fld (x:: T , :: InfiniteCardinal ) where T<: Real = signbit (x) ? - one (T) : zero (T)
157+ cld (x:: T , :: InfiniteCardinal ) where T<: Real = signbit (x) ? zero (T) : one (T)
158+
159+ mod (:: InfiniteCardinal , :: InfiniteCardinal ) = NotANumber ()
160+ mod (:: InfiniteCardinal , :: Real ) = NotANumber ()
161+ function mod (x:: Real , :: InfiniteCardinal )
162+ x ≥ 0 || throw (ArgumentError (" mod(x,∞) is unbounded for x < 0" ))
163+ x
46164end
47165
48- const ℵ₀ = InfiniteCardinal {0} ()
49- const ℵ₁ = InfiniteCardinal {1} ()
50166
51- string (:: InfiniteCardinal{0} ) = " ℵ₀"
52- string (:: InfiniteCardinal{1} ) = " ℵ₁"
167+ Base. to_index (:: Union{Infinity,InfiniteCardinal{0}} ) = ℵ₀
168+ Base. to_shape (:: Union{Infinity,InfiniteCardinal{0}} ) = ℵ₀
169+ Base. to_shape (dims:: Tuple{Vararg{Union{Infinity, Integer, AbstractUnitRange}}} ) = map (Base. to_shape, dims)
53170
54- show (io:: IO , F:: InfiniteCardinal{0} ) where N = print (io, " ℵ₀" )
55- show (io:: IO , F:: InfiniteCardinal{1} ) where N = print (io, " ℵ₁" )
171+
172+ # #
173+ # Checked
174+ # #
175+
176+ Base. Checked. checked_sub (:: Integer , :: InfiniteCardinal{0} ) = - ∞
177+ Base. Checked. checked_sub (:: InfiniteCardinal{0} , :: Integer ) = ℵ₀
178+ Base. Checked. checked_add (:: Integer , :: InfiniteCardinal{0} ) = ℵ₀
179+ Base. Checked. checked_add (:: InfiniteCardinal{0} , :: Integer ) = ℵ₀
180+
181+ Base. Checked. checked_mul (x:: Integer , :: InfiniteCardinal{0} ) = sign (x)* ∞
182+ Base. Checked. checked_mul (:: InfiniteCardinal{0} , x:: Integer ) = sign (x)* ∞
183+
184+
185+ # #
186+ # hash
187+ # #
188+
189+ Base. hash (:: InfiniteCardinal{0} ) = 0x775431eef01bca90 # made up
190+ Base. hash (:: InfiniteCardinal{1} ) = 0x55437c69b794f8ce # made up
0 commit comments