data Either0 : Type -> Type -> Type Similar to `Either` but with erased fields.
Totality: total
Visibility: public export
Constructors:
Left0 : (0 _ : a) -> Either0 a b Right0 : (0 _ : b) -> Either0 a b
strictRefl : (0 _ : a = b) -> Lazy c -> c We often don't trust values of type `a === b`, as they might
have been magically crafted using `believe_me` or `assert_total`
followed by `idris_crash`. If a value of another type follows
from a (potentially) magically crafted one, we only want the
second value to reduce at compile time, if the first value
reduces to `Refl`. Otherwise, we risk blowing up the compiler
in an absurd context.
Totality: total
Visibility: exportinterface Total : (a : Type) -> (a -> a -> Type) -> Type This interface is a witness that the given primitive type
comes with a relation `lt`, with `lt` being a strict total order.
We typically define the following aliases
(or name the relation accordingly):
`m < n` := lt m n
`m > n` := lt n m
`m <= n` := Either (lt m n) (m === n)
`m >= n` := Either (lt n m) (n === m)
`m /= n` := Either (lt m n) (lt n m)
The following axioms must hold:
1. (<) is transitive: From `k < m` and `m < n` follows `k < n`.
2. Trichotomy: For all values `m` and `n` exactly one of the
following holds: `m < n`, `m === n`, or `n < m`.
It is in the nature of a primitive that we can't proof these axioms
in Idris itself. We must therefore assume that they hold on all backends,
and it is the responsibility of programmers implementing
interface `Total` to make sure that the axioms actually hold.
Parameters: a, lt
Methods:
0 transLT : lt k m -> lt m n -> lt k n Axiom I: `<` is transitive.
trichotomy : (m : a) -> (n : a) -> Trichotomy lt m n Axiom II: Trichotomy of `<`, `===`, and `>`.
Implementations:
Total Integer (<) Total Int (<) Total Char (<) Total Bits8 (<) Total Bits16 (<) Total Bits32 (<) Total Bits64 (<) Total Int8 (<) Total Int16 (<) Total Int32 (<) Total Int64 (<) Total String (<) Total a lt => Total (Maybe a) (LT lt) Total a lt => Total (Maybe a) (LT lt)
0 transLT : Total a lt => lt k m -> lt m n -> lt k n Axiom I: `<` is transitive.
Totality: total
Visibility: public exporttrichotomy : Total a lt => (m : a) -> (n : a) -> Trichotomy lt m n Axiom II: Trichotomy of `<`, `===`, and `>`.
Totality: total
Visibility: public exporttestLT : Total a lt => (x : a) -> (y : a) -> Either0 (lt x y) (Either (lt y x) (y = x)) Tests if the first value is strictly less than the second or not
Totality: total
Visibility: exporttestGT : Total a lt => (x : a) -> (y : a) -> Either0 (lt y x) (Either (lt x y) (x = y)) Tests if the first value is strictly greater than the second or not
Totality: total
Visibility: exporttestEQ : Total a lt => (x : a) -> (y : a) -> Either0 (x = y) (Either (lt x y) (lt y x)) Tests if the two values are provably equal or not
Totality: total
Visibility: export0 irrefl : Total a lt => Not (lt m m) `<` is irreflexive.
Totality: total
Visibility: export0 trans : Total a lt => lt k m -> lt m n -> lt k n This is an alias for `transLT`
Totality: total
Visibility: export0 trans_EQ_NEQ : Total a lt => k = m -> Either (lt m n) (lt n m) -> Either (lt k n) (lt n k) `k === m` and `m /= n` implies `k /= n`.
Totality: total
Visibility: export0 trans_NEQ_EQ : Total a lt => Either (lt k m) (lt m k) -> m = n -> Either (lt k n) (lt n k) `k === m` and `m /= n` implies `k /= n`.
Totality: total
Visibility: export0 trans_LT_EQ : Total a lt => lt k m -> m = n -> lt k n `k < m` and `m === n` implies `k < n`
Totality: total
Visibility: export0 trans_EQ_LT : Total a lt => k = m -> lt m n -> lt k n `k === m` and `m < n` implies `k < n`
Totality: total
Visibility: export0 trans_LTE_LT : Total a lt => Either (lt k m) (k = m) -> lt m n -> lt k n `k <= m` and `m < n` implies `k < n`
Totality: total
Visibility: export0 trans_LT_LTE : Total a lt => lt k m -> Either (lt m n) (m = n) -> lt k n `k < m` and `m <= n` implies `k < n`
Totality: total
Visibility: export0 trans_GT_EQ : Total a lt => lt m k -> m = n -> lt n k `k > m` and `m === n` implies `k > n`
Totality: total
Visibility: export0 trans_EQ_GT : Total a lt => k = m -> lt n m -> lt n k `k === m` and `m > n` implies `k > n`
Totality: total
Visibility: export0 trans_GTE_GT : Total a lt => Either (lt m k) (m = k) -> lt n m -> lt n k `k >= m` and `m > n` implies `k > n`
Totality: total
Visibility: export0 trans_GT_GTE : Total a lt => lt m k -> Either (lt n m) (n = m) -> lt n k `k > m` and `m >= n` implies `k > n`
Totality: total
Visibility: export0 refl : Total a lt => Either (lt m m) (m = m) `<=` is reflexive.
Totality: total
Visibility: export0 trans : Total a lt => Either (lt k m) (k = m) -> Either (lt m n) (m = n) -> Either (lt k n) (k = n) `<=` is transitive.
Totality: total
Visibility: export0 antisym : Total a lt => Either (lt m n) (m = n) -> Either (lt n m) (m = n) -> m = n `<=` is antisymmetric.
Totality: total
Visibility: export0 trans_LTE_EQ : Total a lt => Either (lt k m) (k = m) -> m = n -> Either (lt k n) (k = n) `k <= m` and `m === n` implies `k <= n`
Totality: total
Visibility: export0 trans_EQ_LTE : Total a lt => k = m -> Either (lt m n) (m = n) -> Either (lt k n) (k = n) `k === m` and `m <= n` implies `(k <= n)`
Totality: total
Visibility: export0 trans : Total a lt => Either (lt m k) (m = k) -> Either (lt n m) (n = m) -> Either (lt n k) (n = k) `>=` is transitive.
Totality: total
Visibility: export0 antisym : Total a lt => Either (lt n m) (m = n) -> Either (lt m n) (m = n) -> m = n `>=` is antisymmetric.
Totality: total
Visibility: export0 trans_GTE_EQ : Total a lt => Either (lt m k) (m = k) -> m = n -> Either (lt n k) (n = k) `k >= m` and `m === n` implies `k >= n`
Totality: total
Visibility: export0 trans_EQ_GTE : Total a lt => k = m -> Either (lt n m) (n = m) -> Either (lt n k) (n = k) `k === m` and `m <= n` implies `(k <= n)`
Totality: total
Visibility: export0 LT_not_GT : Total a lt => lt m n -> Not (lt n m) `m < n` implies `Not (m > n)`.
Totality: total
Visibility: export0 LT_not_EQ : Total a lt => lt m n -> Not (m = n) `m < n` implies `Not (m === n)`.
Totality: total
Visibility: export0 LT_not_GTE : Total a lt => lt m n -> Not (Either (lt n m) (n = m)) `m < n` implies `Not (m >= n)`.
Totality: total
Visibility: export0 Not_LT_to_GTE : Total a lt => Not (lt m n) -> Either (lt n m) (n = m) `Not (m < n)` implies `m >= n`.
Totality: total
Visibility: export0 EQ_not_LT : Total a lt => m = n -> Not (lt m n) `m === n` implies `Not (m < n)`.
Totality: total
Visibility: export0 EQ_not_GT : Total a lt => m = n -> Not (lt n m) `m === n` implies `Not (m > n)`.
Totality: total
Visibility: export0 EQ_not_NEQ : Total a lt => m = n -> Not (Either (lt m n) (lt n m)) `m === n` implies `Not (m /= n)`.
Totality: total
Visibility: export0 Not_EQ_to_NEQ : Total a lt => Not (m = n) -> Either (lt m n) (lt n m) `Not (m < n)` implies `m /= n`.
Totality: total
Visibility: export0 GT_not_LT : Total a lt => lt n m -> Not (lt m n) `m > n` implies `Not (m < n)`.
Totality: total
Visibility: export0 GT_not_EQ : Total a lt => lt n m -> Not (m = n) `m > n` implies `Not (m === n)`.
Totality: total
Visibility: export0 GT_not_LTE : Total a lt => lt n m -> Not (Either (lt m n) (m = n)) `m > n` implies `Not (m <= n)`.
Totality: total
Visibility: export0 Not_GT_to_LTE : Total a lt => Not (lt n m) -> Either (lt m n) (m = n) `Not (m > n)` implies `m <= n`.
Totality: total
Visibility: export0 LTE_not_GT : Total a lt => Either (lt m n) (m = n) -> Not (lt n m) `m <= n` implies `Not (m > n)`.
Totality: total
Visibility: export0 Not_LTE_to_GT : Total a lt => Not (Either (lt m n) (m = n)) -> lt n m `Not (m <= n)` implies `m > n`.
Totality: total
Visibility: export0 LTE_and_GTE_to_EQ : Total a lt => Either (lt m n) (m = n) -> Either (lt n m) (n = m) -> m = n `m <= n` and `m >= n` implies `m === n`.
Totality: total
Visibility: export0 LTE_and_NEQ_to_LT : Total a lt => Either (lt m n) (m = n) -> Either (lt m n) (lt n m) -> lt m n `m <= n` and `m /= n` implies `m < n`.
Totality: total
Visibility: export0 NEQ_not_EQ : Total a lt => Either (lt m n) (lt n m) -> Not (m = n) `m /= n` implies `Not (m === n)`.
Totality: total
Visibility: export0 Not_NEQ_to_EQ : Total a lt => Not (Either (lt m n) (lt n m)) -> m = n `Not (m /= n)` implies `m === n`.
Totality: total
Visibility: export0 NEQ_and_LTE_to_LT : Total a lt => Either (lt m n) (lt n m) -> Either (lt m n) (m = n) -> lt m n `m /= n` and `m <= n` implies `m < n`.
Totality: total
Visibility: export0 NEQ_and_GTE_to_GT : Total a lt => Either (lt m n) (lt n m) -> Either (lt n m) (n = m) -> lt n m `m /= n` and `m <= n` implies `m < n`.
Totality: total
Visibility: export0 GTE_not_LT : Total a lt => Either (lt n m) (n = m) -> Not (lt m n) `m >= n` implies `Not (m < n)`.
Totality: total
Visibility: export0 Not_GTE_to_LT : Total a lt => Not (Either (lt n m) (n = m)) -> lt m n `Not (m >= n)` implies `m < n`.
Totality: total
Visibility: export0 GTE_and_LTE_to_EQ : Total a lt => Either (lt n m) (n = m) -> Either (lt m n) (m = n) -> m = n `m >= n` and `m <= n` implies `m === n`.
Totality: total
Visibility: export0 GTE_and_NEQ_to_GT : Total a lt => Either (lt n m) (n = m) -> Either (lt m n) (lt n m) -> lt n m `m >= n` and `m /= n` implies `m > n`.
Totality: total
Visibility: export