lean4-htt/library/init/ordering.lean
2016-06-07 10:14:07 -07:00

73 lines
1.9 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/-
Copyright (c) 2016 Microsoft Corporation. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Leonardo de Moura
-/
prelude
import init.to_string init.prod
inductive ordering :=
| lt | eq | gt
open ordering
definition ordering.has_to_string [instance] : has_to_string ordering :=
has_to_string.mk (λ s, match s with | lt := "lt" | eq := "eq" | gt := "gt" end)
structure has_ordering [class] (A : Type) :=
(cmp : A → A → ordering)
definition nat.cmp (a b : nat) : ordering :=
if a < b then lt
else if a = b then eq
else gt
definition nat_has_ordering [instance] : has_ordering nat :=
has_ordering.mk nat.cmp
section
open prod
variables {A B : Type} [has_ordering A] [has_ordering B]
definition prod.cmp : A × B → A × B → ordering
| (a₁, b₁) (a₂, b₂) :=
match has_ordering.cmp a₁ a₂ with
| lt := lt
| eq := has_ordering.cmp b₁ b₂
| gt := gt
end
definition prod_has_ordering [instance] {A B : Type} [has_ordering A] [has_ordering B] : has_ordering (A × B) :=
has_ordering.mk prod.cmp
end
section
open sum
variables {A B : Type} [has_ordering A] [has_ordering B]
definition sum.cmp : sum A B → sum A B → ordering
| (inl a₁) (inl a₂) := has_ordering.cmp a₁ a₂
| (inr b₁) (inr b₂) := has_ordering.cmp b₁ b₂
| (inl a₁) (inr b₂) := lt
| (inr b₁) (inl a₂) := gt
definition sum_has_ordering [instance] {A B : Type} [has_ordering A] [has_ordering B] : has_ordering (sum A B) :=
has_ordering.mk sum.cmp
end
section
open option
variables {A : Type} [has_ordering A]
definition option.cmp : option A → option A → ordering
| (some a₁) (some a₂) := has_ordering.cmp a₁ a₂
| (some a₁) none := gt
| none (some a₂) := lt
| none none := eq
definition option_has_ordering [instance] {A : Type} [has_ordering A] : has_ordering (option A) :=
has_ordering.mk option.cmp
end