78 lines
1.8 KiB
Text
78 lines
1.8 KiB
Text
/-
|
||
Copyright (c) 2021 Microsoft Corporation. All rights reserved.
|
||
Released under Apache 2.0 license as described in the file LICENSE.
|
||
Authors: Dany Fabian, Sebastian Ullrich
|
||
-/
|
||
|
||
prelude
|
||
import Init.Data.Int
|
||
import Init.Data.String
|
||
|
||
inductive Ordering where
|
||
| lt | eq | gt
|
||
deriving Inhabited, BEq
|
||
|
||
|
||
class Ord (α : Type u) where
|
||
compare : α → α → Ordering
|
||
|
||
export Ord (compare)
|
||
|
||
@[inline] def compareOfLessAndEq {α} (x y : α) [LT α] [Decidable (x < y)] [DecidableEq α] : Ordering :=
|
||
if x < y then Ordering.lt
|
||
else if x = y then Ordering.eq
|
||
else Ordering.gt
|
||
|
||
instance : Ord Nat where
|
||
compare x y := compareOfLessAndEq x y
|
||
|
||
instance : Ord Int where
|
||
compare x y := compareOfLessAndEq x y
|
||
|
||
instance : Ord Bool where
|
||
compare
|
||
| false, true => Ordering.lt
|
||
| true, false => Ordering.gt
|
||
| _, _ => Ordering.eq
|
||
|
||
instance : Ord String where
|
||
compare x y := compareOfLessAndEq x y
|
||
|
||
instance (n : Nat) : Ord (Fin n) where
|
||
compare x y := compare x.val y.val
|
||
|
||
instance : Ord UInt8 where
|
||
compare x y := compareOfLessAndEq x y
|
||
|
||
instance : Ord UInt16 where
|
||
compare x y := compareOfLessAndEq x y
|
||
|
||
instance : Ord UInt32 where
|
||
compare x y := compareOfLessAndEq x y
|
||
|
||
instance : Ord UInt64 where
|
||
compare x y := compareOfLessAndEq x y
|
||
|
||
instance : Ord USize where
|
||
compare x y := compareOfLessAndEq x y
|
||
|
||
instance : Ord Char where
|
||
compare x y := compareOfLessAndEq x y
|
||
|
||
|
||
def ltOfOrd [Ord α] : LT α where
|
||
lt a b := compare a b == Ordering.lt
|
||
|
||
instance [Ord α] : DecidableRel (@LT.lt α ltOfOrd) :=
|
||
inferInstanceAs (DecidableRel (fun a b => compare a b == Ordering.lt))
|
||
|
||
def Ordering.isLE : Ordering → Bool
|
||
| Ordering.lt => true
|
||
| Ordering.eq => true
|
||
| Ordering.gt => false
|
||
|
||
def leOfOrd [Ord α] : LE α where
|
||
le a b := (compare a b).isLE
|
||
|
||
instance [Ord α] : DecidableRel (@LE.le α leOfOrd) :=
|
||
inferInstanceAs (DecidableRel (fun a b => (compare a b).isLE))
|