| Portability | portable |
|---|---|
| Stability | experimental |
| Maintainer | divip@aszt.inf.elte.hu |
Number.Peano.Inf
Description
Lazy Peano numbers including observable infinity value.
Several lazyness properties:
-
n + undefined >= n, ifn= 0, 1, 2, ...
but undefined + n >= n raises an error.
-
compare (n + undefined) (n-1) == GT, ifn= 0, 1, 2, ...
but compare (n + undefined) n raises an error.
-
min n (n + undefined)resultsn, ifn= 0, 1, 2, ... -
min (n + undefined) (n - 1)resultsn - 1, ifn= 0, 1, 2, ...
but min (n + undefined) n raises an error.
-
min n (m + undefined) >= m, ifn,m= 0, 1, 2, ... For example,min 10 (5 + undefined) >= 5. -
min (m + undefined) n >= m, ifn,m= 0, 1, 2, ... -
max n (m + undefined) >= m, ifn,m= 0, 1, 2, ... For example,max 10 (5 + undefined) >= 5. -
max (m + undefined) n >= m, ifn,m= 0, 1, 2, ...
These properties makes the Num data type ideal for lazy list length computation. For example, (genericLength [1..] :: Nat) > 100 is True.
Note that the following equation does not hold for this number type:
-
1 + a > a, because1 + infinity == infinity.
Documentation
Natural numbers and infinity.
Observable infinity value.
The following values are True:
infinity == infinity
-
0 < infinity,1 < infinity,2 < infinity, ... -
n + infinity == infinity, ifnis not the inductive infinity. infinity + n == infinity
-
n * infinity == infinity, ifnis not the inductive infinity. infinity * n == infinity
-
n - infinity == 0, ifnis not the inductive infinity. -
infinity - n == infinity, ifnis not the inductive infinity and ifn /= infinity.
The following values rais error messages:
infinity - infinity
fromEnum infinity
toInteger infinity
inductive_infinity :: NatSource
Traditional infinity value: let n = Succ n in n.
For every function f :: Nat -> Bool, f infinity and f inductive_infinity gives the same result, provided that
the results are not bottom.
Use infinity instead. Lots of the given properties of infinity is not true for inductive_infinity. For example,
-
inductive_infinity == inductive_infinityis an endless computation instead ofTrue.
However, the following values are True:
-
0 < inductive_infinity,1 < inductive_infinity,2 < inductive_infinity, ...
Note also:
-
inductive_infinity == infinityis an endless computation instead ofTrue.
Difference of two natural numbers: the result is either positive or negative.
implementation of (-) is based on diff.
The following value is undefined:
diff infinity infinity
Variant of diff:
-
zeroDiff infinity infinity == Left 0.
Note that if the implementation of (-) would be based on zeroDiff, the following equations would not hold:
-
(a - b) - (a - c) == c - b,a >= c >= b, because(infininty - 5) - (infinity - 10) == 0 /= 10 - 5. -
a - (a - b) == b,a >= b, becauseinfininty - (infinity - 5) == 0 /= 5.
Variant of diff:
-
infDiff infinity infinity == Left infinity.
Note that if the implementation of (-) would be based on infDiff, the following equations would not hold:
-
(a - b) - (a - c) == c - b,a >= c >= b, because(infininty - 5) - (infinity - 10) == infinity /= 10 - 5. -
a - (a - b) == b,a >= b, becauseinfininty - (infinity - 5) == infinity /= 5.