Module docstring
{"# Nontrivial types
Results about Nontrivial.
"}
{"# Nontrivial types
Results about Nontrivial.
"}
nontrivial_of_lt
theorem
[Preorder α] (x y : α) (h : x < y) : Nontrivial α
theorem nontrivial_of_lt [Preorder α] (x y : α) (h : x < y) : Nontrivial α :=
⟨⟨x, y, ne_of_lt h⟩⟩
exists_pair_lt
theorem
(α : Type*) [Nontrivial α] [LinearOrder α] : ∃ x y : α, x < y
theorem exists_pair_lt (α : Type*) [Nontrivial α] [LinearOrder α] : ∃ x y : α, x < y := by
rcases exists_pair_ne α with ⟨x, y, hxy⟩
cases lt_or_gt_of_ne hxy <;> exact ⟨_, _, ‹_›⟩
nontrivial_iff_lt
theorem
[LinearOrder α] : Nontrivial α ↔ ∃ x y : α, x < y
Subtype.nontrivial_iff_exists_ne
theorem
(p : α → Prop) (x : Subtype p) : Nontrivial (Subtype p) ↔ ∃ (y : α) (_ : p y), y ≠ x
theorem Subtype.nontrivial_iff_exists_ne (p : α → Prop) (x : Subtype p) :
NontrivialNontrivial (Subtype p) ↔ ∃ (y : α) (_ : p y), y ≠ x := by
simp only [_root_.nontrivial_iff_exists_ne x, Subtype.exists, Ne, Subtype.ext_iff]
nontrivialPSumUnique
definition
(α : Type*) [Inhabited α] : Nontrivial α ⊕' Unique α
/-- An inhabited type is either nontrivial, or has a unique element. -/
noncomputable def nontrivialPSumUnique (α : Type*) [Inhabited α] :
NontrivialNontrivial α ⊕' Unique α :=
if h : Nontrivial α then PSum.inl h
else
PSum.inr
{ default := default,
uniq := fun x : α ↦ by
by_contra H
exact h ⟨_, _, H⟩ }
Option.nontrivial
instance
[Nonempty α] : Nontrivial (Option α)
instance Option.nontrivial [Nonempty α] : Nontrivial (Option α) := by
inhabit α
exact ⟨none, some default, nofun⟩
Function.Injective.nontrivial
theorem
[Nontrivial α] {f : α → β} (hf : Function.Injective f) : Nontrivial β
/-- Pushforward a `Nontrivial` instance along an injective function. -/
protected theorem Function.Injective.nontrivial [Nontrivial α] {f : α → β}
(hf : Function.Injective f) : Nontrivial β :=
let ⟨x, y, h⟩ := exists_pair_ne α
⟨⟨f x, f y, hf.ne h⟩⟩
Function.Injective.exists_ne
theorem
[Nontrivial α] {f : α → β} (hf : Function.Injective f) (y : β) : ∃ x, f x ≠ y
/-- An injective function from a nontrivial type has an argument at
which it does not take a given value. -/
protected theorem Function.Injective.exists_ne [Nontrivial α] {f : α → β}
(hf : Function.Injective f) (y : β) : ∃ x, f x ≠ y := by
rcases exists_pair_ne α with ⟨x₁, x₂, hx⟩
by_cases h : f x₂ = y
· exact ⟨x₁, (hf.ne_iff' h).2 hx⟩
· exact ⟨x₂, h⟩
nontrivial_prod_right
instance
[Nonempty α] [Nontrivial β] : Nontrivial (α × β)
instance nontrivial_prod_right [Nonempty α] [Nontrivial β] : Nontrivial (α × β) :=
Prod.snd_surjective.nontrivial
nontrivial_prod_left
instance
[Nontrivial α] [Nonempty β] : Nontrivial (α × β)
instance nontrivial_prod_left [Nontrivial α] [Nonempty β] : Nontrivial (α × β) :=
Prod.fst_surjective.nontrivial
Pi.nontrivial_at
theorem
(i' : I) [inst : ∀ i, Nonempty (f i)] [Nontrivial (f i')] : Nontrivial (∀ i : I, f i)
/-- A pi type is nontrivial if it's nonempty everywhere and nontrivial somewhere. -/
theorem nontrivial_at (i' : I) [inst : ∀ i, Nonempty (f i)] [Nontrivial (f i')] :
Nontrivial (∀ i : I, f i) := by
letI := Classical.decEq (∀ i : I, f i)
exact (Function.update_injective (fun i ↦ Classical.choice (inst i)) i').nontrivial
Pi.nontrivial
instance
[Inhabited I] [∀ i, Nonempty (f i)] [Nontrivial (f default)] : Nontrivial (∀ i : I, f i)
/-- As a convenience, provide an instance automatically if `(f default)` is nontrivial.
If a different index has the non-trivial type, then use `haveI := nontrivial_at that_index`.
-/
instance nontrivial [Inhabited I] [∀ i, Nonempty (f i)] [Nontrivial (f default)] :
Nontrivial (∀ i : I, f i) :=
nontrivial_at default
Function.nontrivial
instance
[h : Nonempty α] [Nontrivial β] : Nontrivial (α → β)
instance Function.nontrivial [h : Nonempty α] [Nontrivial β] : Nontrivial (α → β) :=
h.elim fun a ↦ Pi.nontrivial_at a
Subsingleton.le
theorem
[Preorder α] [Subsingleton α] (x y : α) : x ≤ y
@[nontriviality]
protected theorem Subsingleton.le [Preorder α] [Subsingleton α] (x y : α) : x ≤ y :=
le_of_eq (Subsingleton.elim x y)