File: Mathlib/Order/Lattice.lean

full_name: exactSubsetOfSSubset
code: /-- See if the term is `a ⊂ b` and the goal is `a ⊆ b`. -/
@[gcongr_forward] def exactSubsetOfSSubset : Mathlib.Tactic.GCongr.ForwardExt 
goal: Mathlib.Tactic.GCongr.ForwardExt

full_name: SemilatticeSup
code: /-- A `SemilatticeSup` is a join-semilattice, that is, a partial order
  with a join (a.k.a. lub / least upper bound, sup / supremum) operation
  `⊔` which is the least element larger than both factors. -/
class SemilatticeSup (α : Type u) extends Sup α, PartialOrder α where
  /-- The supremum is an upper bound on the first argument -/
  protected le_sup_left : ∀ a b : α, a ≤ a ⊔ b
  /-- The supremum is an upper bound on the second argument -/
  protected le_sup_right : ∀ a b : α, b ≤ a ⊔ b
  /-- The supremum is the *least* upper bound -/
  protected sup_le : ∀ a b c : α, a ≤ c → b ≤ c → a ⊔ b ≤ c
goal: Type u

full_name: SemilatticeSup.sup_le
code: /-- A `SemilatticeSup` is a join-semilattice, that is, a partial order
  with a join (a.k.a. lub / least upper bound, sup / supremum) operation
  `⊔` which is the least element larger than both factors. -/
class SemilatticeSup (α : Type u) extends Sup α, PartialOrder α where
  /-- The supremum is an upper bound on the first argument -/
  protected le_sup_left : ∀ a b : α, a ≤ a ⊔ b
  /-- The supremum is an upper bound on the second argument -/
  protected le_sup_right : ∀ a b : α, b ≤ a ⊔ b
  /-- The supremum is the *least* upper bound -/
  protected sup_le : ∀ a b c : α, a ≤ c → b ≤ c → a ⊔ b ≤ c
goal: a ≤ c → b ≤ c → a ⊔ b ≤ c

full_name: SemilatticeSup.le_sup_left
code: /-- A `SemilatticeSup` is a join-semilattice, that is, a partial order
  with a join (a.k.a. lub / least upper bound, sup / supremum) operation
  `⊔` which is the least element larger than both factors. -/
class SemilatticeSup (α : Type u) extends Sup α, PartialOrder α where
  /-- The supremum is an upper bound on the first argument -/
  protected le_sup_left : ∀ a b : α, a ≤ a ⊔ b
  /-- The supremum is an upper bound on the second argument -/
  protected le_sup_right : ∀ a b : α, b ≤ a ⊔ b
  /-- The supremum is the *least* upper bound -/
  protected sup_le : ∀ a b c : α, a ≤ c → b ≤ c → a ⊔ b ≤ c
goal: a ≤ a ⊔ b

full_name: SemilatticeSup.le_sup_right
code: /-- A `SemilatticeSup` is a join-semilattice, that is, a partial order
  with a join (a.k.a. lub / least upper bound, sup / supremum) operation
  `⊔` which is the least element larger than both factors. -/
class SemilatticeSup (α : Type u) extends Sup α, PartialOrder α where
  /-- The supremum is an upper bound on the first argument -/
  protected le_sup_left : ∀ a b : α, a ≤ a ⊔ b
  /-- The supremum is an upper bound on the second argument -/
  protected le_sup_right : ∀ a b : α, b ≤ a ⊔ b
  /-- The supremum is the *least* upper bound -/
  protected sup_le : ∀ a b c : α, a ≤ c → b ≤ c → a ⊔ b ≤ c
goal: b ≤ a ⊔ b

full_name: SemilatticeSup.mk'
code: /--
A type with a commutative, associative and idempotent binary `sup` operation has the structure of a
join-semilattice.

The partial order is defined so that `a ≤ b` unfolds to `a ⊔ b = b`; cf. `sup_eq_right`.
-/
def SemilatticeSup.mk' {α : Type*} [Sup α] (sup_comm : ∀ a b : α, a ⊔ b = b ⊔ a)
    (sup_assoc : ∀ a b c : α, a ⊔ b ⊔ c = a ⊔ (b ⊔ c)) (sup_idem : ∀ a : α, a ⊔ a = a) :
    SemilatticeSup α 
goal: SemilatticeSup α

full_name: OrderDual.instSup
code: instance OrderDual.instSup (α : Type*) [Inf α] : Sup αᵒᵈ 
goal: Sup αᵒᵈ

full_name: OrderDual.instInf
code: instance OrderDual.instInf (α : Type*) [Sup α] : Inf αᵒᵈ 
goal: Inf αᵒᵈ

full_name: le_sup_left
code: @[simp]
theorem le_sup_left : a ≤ a ⊔ b 
goal: a ≤ a ⊔ b

full_name: le_sup_right
code: @[simp]
theorem le_sup_right : b ≤ a ⊔ b 
goal: b ≤ a ⊔ b

full_name: le_sup_of_le_left
code: theorem le_sup_of_le_left (h : c ≤ a) : c ≤ a ⊔ b 
goal: c ≤ a ⊔ b

full_name: le_sup_of_le_right
code: theorem le_sup_of_le_right (h : c ≤ b) : c ≤ a ⊔ b 
goal: c ≤ a ⊔ b

full_name: lt_sup_of_lt_left
code: theorem lt_sup_of_lt_left (h : c < a) : c < a ⊔ b 
goal: c < a ⊔ b

full_name: lt_sup_of_lt_right
code: theorem lt_sup_of_lt_right (h : c < b) : c < a ⊔ b 
goal: c < a ⊔ b

full_name: sup_le
code: theorem sup_le : a ≤ c → b ≤ c → a ⊔ b ≤ c 
goal: a ≤ c → b ≤ c → a ⊔ b ≤ c

full_name: sup_le_iff
code: @[simp]
theorem sup_le_iff : a ⊔ b ≤ c ↔ a ≤ c ∧ b ≤ c 
goal: a ⊔ b ≤ c ↔ a ≤ c ∧ b ≤ c

full_name: sup_eq_left
code: @[simp]
theorem sup_eq_left : a ⊔ b = a ↔ b ≤ a 
goal: a ⊔ b = a ↔ b ≤ a

full_name: sup_eq_right
code: @[simp]
theorem sup_eq_right : a ⊔ b = b ↔ a ≤ b 
goal: a ⊔ b = b ↔ a ≤ b

full_name: left_eq_sup
code: @[simp]
theorem left_eq_sup : a = a ⊔ b ↔ b ≤ a 
goal: a = a ⊔ b ↔ b ≤ a

full_name: right_eq_sup
code: @[simp]
theorem right_eq_sup : b = a ⊔ b ↔ a ≤ b 
goal: b = a ⊔ b ↔ a ≤ b

full_name: left_lt_sup
code: @[simp]
theorem left_lt_sup : a < a ⊔ b ↔ ¬b ≤ a 
goal: a < a ⊔ b ↔ ¬b ≤ a

full_name: right_lt_sup
code: @[simp]
theorem right_lt_sup : b < a ⊔ b ↔ ¬a ≤ b 
goal: b < a ⊔ b ↔ ¬a ≤ b

full_name: left_or_right_lt_sup
code: theorem left_or_right_lt_sup (h : a ≠ b) : a < a ⊔ b ∨ b < a ⊔ b 
goal: a < a ⊔ b ∨ b < a ⊔ b

full_name: le_iff_exists_sup
code: theorem le_iff_exists_sup : a ≤ b ↔ ∃ c, b = a ⊔ c 
goal: a ≤ b ↔ ∃ c, b = a ⊔ c

full_name: sup_le_sup
code: @[gcongr]
theorem sup_le_sup (h₁ : a ≤ b) (h₂ : c ≤ d) : a ⊔ c ≤ b ⊔ d 
goal: a ⊔ c ≤ b ⊔ d

full_name: sup_le_sup_left
code: @[gcongr]
theorem sup_le_sup_left (h₁ : a ≤ b) (c) : c ⊔ a ≤ c ⊔ b 
goal: c ⊔ a ≤ c ⊔ b

full_name: sup_le_sup_right
code: @[gcongr]
theorem sup_le_sup_right (h₁ : a ≤ b) (c) : a ⊔ c ≤ b ⊔ c 
goal: a ⊔ c ≤ b ⊔ c

full_name: sup_idem
code: theorem sup_idem (a : α) : a ⊔ a = a 
goal: a ⊔ a = a

full_name: instIdempotentOpSup
code: instance : Std.IdempotentOp (α := α) (· ⊔ ·) 
goal: Std.IdempotentOp fun x x_1 => x ⊔ x_1

full_name: sup_comm
code: theorem sup_comm (a b : α) : a ⊔ b = b ⊔ a 
goal: a ⊔ b = b ⊔ a

full_name: instCommutativeSup
code: instance : Std.Commutative (α := α) (· ⊔ ·) 
goal: Std.Commutative fun x x_1 => x ⊔ x_1

full_name: sup_assoc
code: theorem sup_assoc (a b c : α) : a ⊔ b ⊔ c = a ⊔ (b ⊔ c) 
goal: a ⊔ b ⊔ c = a ⊔ (b ⊔ c)

full_name: instAssociativeSup
code: instance : Std.Associative (α := α)  (· ⊔ ·) 
goal: Std.Associative fun x x_1 => x ⊔ x_1

full_name: sup_left_right_swap
code: theorem sup_left_right_swap (a b c : α) : a ⊔ b ⊔ c = c ⊔ b ⊔ a 
goal: a ⊔ b ⊔ c = c ⊔ b ⊔ a

full_name: sup_left_idem
code: theorem sup_left_idem (a b : α) : a ⊔ (a ⊔ b) = a ⊔ b 
goal: a ⊔ (a ⊔ b) = a ⊔ b

full_name: sup_right_idem
code: theorem sup_right_idem (a b : α) : a ⊔ b ⊔ b = a ⊔ b 
goal: a ⊔ b ⊔ b = a ⊔ b

full_name: sup_left_comm
code: theorem sup_left_comm (a b c : α) : a ⊔ (b ⊔ c) = b ⊔ (a ⊔ c) 
goal: a ⊔ (b ⊔ c) = b ⊔ (a ⊔ c)

full_name: sup_right_comm
code: theorem sup_right_comm (a b c : α) : a ⊔ b ⊔ c = a ⊔ c ⊔ b 
goal: a ⊔ b ⊔ c = a ⊔ c ⊔ b

full_name: sup_sup_sup_comm
code: theorem sup_sup_sup_comm (a b c d : α) : a ⊔ b ⊔ (c ⊔ d) = a ⊔ c ⊔ (b ⊔ d) 
goal: a ⊔ b ⊔ (c ⊔ d) = a ⊔ c ⊔ (b ⊔ d)

full_name: sup_sup_distrib_left
code: theorem sup_sup_distrib_left (a b c : α) : a ⊔ (b ⊔ c) = a ⊔ b ⊔ (a ⊔ c) 
goal: a ⊔ (b ⊔ c) = a ⊔ b ⊔ (a ⊔ c)

full_name: sup_sup_distrib_right
code: theorem sup_sup_distrib_right (a b c : α) : a ⊔ b ⊔ c = a ⊔ c ⊔ (b ⊔ c) 
goal: a ⊔ b ⊔ c = a ⊔ c ⊔ (b ⊔ c)

full_name: sup_congr_left
code: theorem sup_congr_left (hb : b ≤ a ⊔ c) (hc : c ≤ a ⊔ b) : a ⊔ b = a ⊔ c 
goal: a ⊔ b = a ⊔ c

full_name: sup_congr_right
code: theorem sup_congr_right (ha : a ≤ b ⊔ c) (hb : b ≤ a ⊔ c) : a ⊔ c = b ⊔ c 
goal: a ⊔ c = b ⊔ c

full_name: sup_eq_sup_iff_left
code: theorem sup_eq_sup_iff_left : a ⊔ b = a ⊔ c ↔ b ≤ a ⊔ c ∧ c ≤ a ⊔ b 
goal: a ⊔ b = a ⊔ c ↔ b ≤ a ⊔ c ∧ c ≤ a ⊔ b

full_name: sup_eq_sup_iff_right
code: theorem sup_eq_sup_iff_right : a ⊔ c = b ⊔ c ↔ a ≤ b ⊔ c ∧ b ≤ a ⊔ c 
goal: a ⊔ c = b ⊔ c ↔ a ≤ b ⊔ c ∧ b ≤ a ⊔ c

full_name: Ne.lt_sup_or_lt_sup
code: theorem Ne.lt_sup_or_lt_sup (hab : a ≠ b) : a < a ⊔ b ∨ b < a ⊔ b 
goal: a < a ⊔ b ∨ b < a ⊔ b

full_name: Monotone.forall_le_of_antitone
code: /-- If `f` is monotone, `g` is antitone, and `f ≤ g`, then for all `a`, `b` we have `f a ≤ g b`. -/
theorem Monotone.forall_le_of_antitone {β : Type*} [Preorder β] {f g : α → β} (hf : Monotone f)
    (hg : Antitone g) (h : f ≤ g) (m n : α) : f m ≤ g n 
goal: f m ≤ g n

full_name: SemilatticeSup.ext_sup
code: theorem SemilatticeSup.ext_sup {α} {A B : SemilatticeSup α}
    (H : ∀ x y : α, (haveI := A; x ≤ y) ↔ x ≤ y)
    (x y : α) :
    (haveI := A; x ⊔ y) = x ⊔ y 
goal: x ⊔ y = x ⊔ y

full_name: SemilatticeSup.ext
code: theorem SemilatticeSup.ext {α} {A B : SemilatticeSup α}
    (H : ∀ x y : α, (haveI := A; x ≤ y) ↔ x ≤ y) :
    A = B 
goal: A = B

full_name: ite_le_sup
code: theorem ite_le_sup (s s' : α) (P : Prop) [Decidable P] : ite P s s' ≤ s ⊔ s' 
goal: (if P then s else s') ≤ s ⊔ s'

full_name: SemilatticeInf.le_inf
code: /-- A `SemilatticeInf` is a meet-semilattice, that is, a partial order
  with a meet (a.k.a. glb / greatest lower bound, inf / infimum) operation
  `⊓` which is the greatest element smaller than both factors. -/
class SemilatticeInf (α : Type u) extends Inf α, PartialOrder α where
  /-- The infimum is a lower bound on the first argument -/
  protected inf_le_left : ∀ a b : α, a ⊓ b ≤ a
  /-- The infimum is a lower bound on the second argument -/
  protected inf_le_right : ∀ a b : α, a ⊓ b ≤ b
  /-- The infimum is the *greatest* lower bound -/
  protected le_inf : ∀ a b c : α, a ≤ b → a ≤ c → a ≤ b ⊓ c
goal: a ≤ b → a ≤ c → a ≤ b ⊓ c

full_name: SemilatticeInf.inf_le_left
code: /-- A `SemilatticeInf` is a meet-semilattice, that is, a partial order
  with a meet (a.k.a. glb / greatest lower bound, inf / infimum) operation
  `⊓` which is the greatest element smaller than both factors. -/
class SemilatticeInf (α : Type u) extends Inf α, PartialOrder α where
  /-- The infimum is a lower bound on the first argument -/
  protected inf_le_left : ∀ a b : α, a ⊓ b ≤ a
  /-- The infimum is a lower bound on the second argument -/
  protected inf_le_right : ∀ a b : α, a ⊓ b ≤ b
  /-- The infimum is the *greatest* lower bound -/
  protected le_inf : ∀ a b c : α, a ≤ b → a ≤ c → a ≤ b ⊓ c
goal: a ⊓ b ≤ a

full_name: SemilatticeInf.inf_le_right
code: /-- A `SemilatticeInf` is a meet-semilattice, that is, a partial order
  with a meet (a.k.a. glb / greatest lower bound, inf / infimum) operation
  `⊓` which is the greatest element smaller than both factors. -/
class SemilatticeInf (α : Type u) extends Inf α, PartialOrder α where
  /-- The infimum is a lower bound on the first argument -/
  protected inf_le_left : ∀ a b : α, a ⊓ b ≤ a
  /-- The infimum is a lower bound on the second argument -/
  protected inf_le_right : ∀ a b : α, a ⊓ b ≤ b
  /-- The infimum is the *greatest* lower bound -/
  protected le_inf : ∀ a b c : α, a ≤ b → a ≤ c → a ≤ b ⊓ c
goal: a ⊓ b ≤ b

full_name: SemilatticeInf
code: /-- A `SemilatticeInf` is a meet-semilattice, that is, a partial order
  with a meet (a.k.a. glb / greatest lower bound, inf / infimum) operation
  `⊓` which is the greatest element smaller than both factors. -/
class SemilatticeInf (α : Type u) extends Inf α, PartialOrder α where
  /-- The infimum is a lower bound on the first argument -/
  protected inf_le_left : ∀ a b : α, a ⊓ b ≤ a
  /-- The infimum is a lower bound on the second argument -/
  protected inf_le_right : ∀ a b : α, a ⊓ b ≤ b
  /-- The infimum is the *greatest* lower bound -/
  protected le_inf : ∀ a b c : α, a ≤ b → a ≤ c → a ≤ b ⊓ c
goal: Type u

full_name: OrderDual.instSemilatticeSup
code: instance OrderDual.instSemilatticeSup (α) [SemilatticeInf α] : SemilatticeSup αᵒᵈ 
goal: SemilatticeSup αᵒᵈ

full_name: OrderDual.instSemilatticeInf
code: instance OrderDual.instSemilatticeInf (α) [SemilatticeSup α] : SemilatticeInf αᵒᵈ 
goal: SemilatticeInf αᵒᵈ

full_name: SemilatticeSup.dual_dual
code: theorem SemilatticeSup.dual_dual (α : Type*) [H : SemilatticeSup α] :
    OrderDual.instSemilatticeSup αᵒᵈ = H 
goal: OrderDual.instSemilatticeSup αᵒᵈ = H

full_name: inf_le_left
code: @[simp]
theorem inf_le_left : a ⊓ b ≤ a 
goal: a ⊓ b ≤ a

full_name: inf_le_right
code: @[simp]
theorem inf_le_right : a ⊓ b ≤ b 
goal: a ⊓ b ≤ b

full_name: le_inf
code: theorem le_inf : a ≤ b → a ≤ c → a ≤ b ⊓ c 
goal: a ≤ b → a ≤ c → a ≤ b ⊓ c

full_name: inf_le_of_left_le
code: theorem inf_le_of_left_le (h : a ≤ c) : a ⊓ b ≤ c 
goal: a ⊓ b ≤ c

full_name: inf_le_of_right_le
code: theorem inf_le_of_right_le (h : b ≤ c) : a ⊓ b ≤ c 
goal: a ⊓ b ≤ c

full_name: inf_lt_of_left_lt
code: theorem inf_lt_of_left_lt (h : a < c) : a ⊓ b < c 
goal: a ⊓ b < c

full_name: inf_lt_of_right_lt
code: theorem inf_lt_of_right_lt (h : b < c) : a ⊓ b < c 
goal: a ⊓ b < c

full_name: le_inf_iff
code: @[simp]
theorem le_inf_iff : a ≤ b ⊓ c ↔ a ≤ b ∧ a ≤ c 
goal: a ≤ b ⊓ c ↔ a ≤ b ∧ a ≤ c

full_name: inf_eq_left
code: @[simp]
theorem inf_eq_left : a ⊓ b = a ↔ a ≤ b 
goal: a ⊓ b = a ↔ a ≤ b

full_name: inf_eq_right
code: @[simp]
theorem inf_eq_right : a ⊓ b = b ↔ b ≤ a 
goal: a ⊓ b = b ↔ b ≤ a

full_name: left_eq_inf
code: @[simp]
theorem left_eq_inf : a = a ⊓ b ↔ a ≤ b 
goal: a = a ⊓ b ↔ a ≤ b

full_name: right_eq_inf
code: @[simp]
theorem right_eq_inf : b = a ⊓ b ↔ b ≤ a 
goal: b = a ⊓ b ↔ b ≤ a

full_name: inf_lt_left
code: @[simp]
theorem inf_lt_left : a ⊓ b < a ↔ ¬a ≤ b 
goal: a ⊓ b < a ↔ ¬a ≤ b

full_name: inf_lt_right
code: @[simp]
theorem inf_lt_right : a ⊓ b < b ↔ ¬b ≤ a 
goal: a ⊓ b < b ↔ ¬b ≤ a

full_name: inf_lt_left_or_right
code: theorem inf_lt_left_or_right (h : a ≠ b) : a ⊓ b < a ∨ a ⊓ b < b 
goal: a ⊓ b < a ∨ a ⊓ b < b

full_name: inf_le_inf
code: @[gcongr]
theorem inf_le_inf (h₁ : a ≤ b) (h₂ : c ≤ d) : a ⊓ c ≤ b ⊓ d 
goal: a ⊓ c ≤ b ⊓ d

full_name: inf_le_inf_right
code: @[gcongr]
theorem inf_le_inf_right (a : α) {b c : α} (h : b ≤ c) : b ⊓ a ≤ c ⊓ a 
goal: b ⊓ a ≤ c ⊓ a

full_name: inf_le_inf_left
code: @[gcongr]
theorem inf_le_inf_left (a : α) {b c : α} (h : b ≤ c) : a ⊓ b ≤ a ⊓ c 
goal: a ⊓ b ≤ a ⊓ c

full_name: inf_idem
code: theorem inf_idem (a : α) : a ⊓ a = a 
goal: a ⊓ a = a

full_name: instIdempotentOpInf
code: instance : Std.IdempotentOp (α := α) (· ⊓ ·) 
goal: Std.IdempotentOp fun x x_1 => x ⊓ x_1

full_name: inf_comm
code: theorem inf_comm (a b : α) : a ⊓ b = b ⊓ a 
goal: a ⊓ b = b ⊓ a

full_name: instCommutativeInf
code: instance : Std.Commutative (α := α) (· ⊓ ·) 
goal: Std.Commutative fun x x_1 => x ⊓ x_1

full_name: inf_assoc
code: theorem inf_assoc (a b c : α) : a ⊓ b ⊓ c = a ⊓ (b ⊓ c) 
goal: a ⊓ b ⊓ c = a ⊓ (b ⊓ c)

full_name: instAssociativeInf
code: instance : Std.Associative (α := α) (· ⊓ ·) 
goal: Std.Associative fun x x_1 => x ⊓ x_1

full_name: inf_left_right_swap
code: theorem inf_left_right_swap (a b c : α) : a ⊓ b ⊓ c = c ⊓ b ⊓ a 
goal: a ⊓ b ⊓ c = c ⊓ b ⊓ a

full_name: inf_left_idem
code: theorem inf_left_idem (a b : α) : a ⊓ (a ⊓ b) = a ⊓ b 
goal: a ⊓ (a ⊓ b) = a ⊓ b

full_name: inf_right_idem
code: theorem inf_right_idem (a b : α) : a ⊓ b ⊓ b = a ⊓ b 
goal: a ⊓ b ⊓ b = a ⊓ b

full_name: inf_left_comm
code: theorem inf_left_comm (a b c : α) : a ⊓ (b ⊓ c) = b ⊓ (a ⊓ c) 
goal: a ⊓ (b ⊓ c) = b ⊓ (a ⊓ c)

full_name: inf_right_comm
code: theorem inf_right_comm (a b c : α) : a ⊓ b ⊓ c = a ⊓ c ⊓ b 
goal: a ⊓ b ⊓ c = a ⊓ c ⊓ b

full_name: inf_inf_inf_comm
code: theorem inf_inf_inf_comm (a b c d : α) : a ⊓ b ⊓ (c ⊓ d) = a ⊓ c ⊓ (b ⊓ d) 
goal: a ⊓ b ⊓ (c ⊓ d) = a ⊓ c ⊓ (b ⊓ d)

full_name: inf_inf_distrib_left
code: theorem inf_inf_distrib_left (a b c : α) : a ⊓ (b ⊓ c) = a ⊓ b ⊓ (a ⊓ c) 
goal: a ⊓ (b ⊓ c) = a ⊓ b ⊓ (a ⊓ c)

full_name: inf_inf_distrib_right
code: theorem inf_inf_distrib_right (a b c : α) : a ⊓ b ⊓ c = a ⊓ c ⊓ (b ⊓ c) 
goal: a ⊓ b ⊓ c = a ⊓ c ⊓ (b ⊓ c)

full_name: inf_congr_left
code: theorem inf_congr_left (hb : a ⊓ c ≤ b) (hc : a ⊓ b ≤ c) : a ⊓ b = a ⊓ c 
goal: a ⊓ b = a ⊓ c

full_name: inf_congr_right
code: theorem inf_congr_right (h1 : b ⊓ c ≤ a) (h2 : a ⊓ c ≤ b) : a ⊓ c = b ⊓ c 
goal: a ⊓ c = b ⊓ c

full_name: inf_eq_inf_iff_left
code: theorem inf_eq_inf_iff_left : a ⊓ b = a ⊓ c ↔ a ⊓ c ≤ b ∧ a ⊓ b ≤ c 
goal: a ⊓ b = a ⊓ c ↔ a ⊓ c ≤ b ∧ a ⊓ b ≤ c

full_name: inf_eq_inf_iff_right
code: theorem inf_eq_inf_iff_right : a ⊓ c = b ⊓ c ↔ b ⊓ c ≤ a ∧ a ⊓ c ≤ b 
goal: a ⊓ c = b ⊓ c ↔ b ⊓ c ≤ a ∧ a ⊓ c ≤ b

full_name: Ne.inf_lt_or_inf_lt
code: theorem Ne.inf_lt_or_inf_lt : a ≠ b → a ⊓ b < a ∨ a ⊓ b < b 
goal: a ≠ b → a ⊓ b < a ∨ a ⊓ b < b

full_name: SemilatticeInf.ext_inf
code: theorem SemilatticeInf.ext_inf {α} {A B : SemilatticeInf α}
    (H : ∀ x y : α, (haveI := A; x ≤ y) ↔ x ≤ y)
    (x y : α) :
    (haveI := A; x ⊓ y) = x ⊓ y 
goal: x ⊓ y = x ⊓ y

full_name: SemilatticeInf.ext
code: theorem SemilatticeInf.ext {α} {A B : SemilatticeInf α}
    (H : ∀ x y : α, (haveI := A; x ≤ y) ↔ x ≤ y) :
    A = B 
goal: A = B

full_name: SemilatticeInf.dual_dual
code: theorem SemilatticeInf.dual_dual (α : Type*) [H : SemilatticeInf α] :
    OrderDual.instSemilatticeInf αᵒᵈ = H 
goal: OrderDual.instSemilatticeInf αᵒᵈ = H

full_name: inf_le_ite
code: theorem inf_le_ite (s s' : α) (P : Prop) [Decidable P] : s ⊓ s' ≤ ite P s s' 
goal: s ⊓ s' ≤ if P then s else s'

full_name: SemilatticeInf.mk'
code: /--
A type with a commutative, associative and idempotent binary `inf` operation has the structure of a
meet-semilattice.

The partial order is defined so that `a ≤ b` unfolds to `b ⊓ a = a`; cf. `inf_eq_right`.
-/
def SemilatticeInf.mk' {α : Type*} [Inf α] (inf_comm : ∀ a b : α, a ⊓ b = b ⊓ a)
    (inf_assoc : ∀ a b c : α, a ⊓ b ⊓ c = a ⊓ (b ⊓ c)) (inf_idem : ∀ a : α, a ⊓ a = a) :
    SemilatticeInf α 
goal: SemilatticeInf α

full_name: Lattice
code: /-- A lattice is a join-semilattice which is also a meet-semilattice. -/
class Lattice (α : Type u) extends SemilatticeSup α, SemilatticeInf α
goal: Type u

full_name: OrderDual.instLattice
code: instance OrderDual.instLattice (α) [Lattice α] : Lattice αᵒᵈ 
goal: Lattice αᵒᵈ

full_name: semilatticeSup_mk'_partialOrder_eq_semilatticeInf_mk'_partialOrder
code: /-- The partial orders from `SemilatticeSup_mk'` and `SemilatticeInf_mk'` agree
if `sup` and `inf` satisfy the lattice absorption laws `sup_inf_self` (`a ⊔ a ⊓ b = a`)
and `inf_sup_self` (`a ⊓ (a ⊔ b) = a`). -/
theorem semilatticeSup_mk'_partialOrder_eq_semilatticeInf_mk'_partialOrder
    {α : Type*} [Sup α] [Inf α]
    (sup_comm : ∀ a b : α, a ⊔ b = b ⊔ a) (sup_assoc : ∀ a b c : α, a ⊔ b ⊔ c = a ⊔ (b ⊔ c))
    (sup_idem : ∀ a : α, a ⊔ a = a) (inf_comm : ∀ a b : α, a ⊓ b = b ⊓ a)
    (inf_assoc : ∀ a b c : α, a ⊓ b ⊓ c = a ⊓ (b ⊓ c)) (inf_idem : ∀ a : α, a ⊓ a = a)
    (sup_inf_self : ∀ a b : α, a ⊔ a ⊓ b = a) (inf_sup_self : ∀ a b : α, a ⊓ (a ⊔ b) = a) :
    @SemilatticeSup.toPartialOrder _ (SemilatticeSup.mk' sup_comm sup_assoc sup_idem) =
      @SemilatticeInf.toPartialOrder _ (SemilatticeInf.mk' inf_comm inf_assoc inf_idem) 
goal: SemilatticeSup.toPartialOrder = SemilatticeInf.toPartialOrder

full_name: Lattice.mk'
code: /-- A type with a pair of commutative and associative binary operations which satisfy two absorption
laws relating the two operations has the structure of a lattice.

The partial order is defined so that `a ≤ b` unfolds to `a ⊔ b = b`; cf. `sup_eq_right`.
-/
def Lattice.mk' {α : Type*} [Sup α] [Inf α] (sup_comm : ∀ a b : α, a ⊔ b = b ⊔ a)
    (sup_assoc : ∀ a b c : α, a ⊔ b ⊔ c = a ⊔ (b ⊔ c)) (inf_comm : ∀ a b : α, a ⊓ b = b ⊓ a)
    (inf_assoc : ∀ a b c : α, a ⊓ b ⊓ c = a ⊓ (b ⊓ c)) (sup_inf_self : ∀ a b : α, a ⊔ a ⊓ b = a)
    (inf_sup_self : ∀ a b : α, a ⊓ (a ⊔ b) = a) : Lattice α 
goal: Lattice α

full_name: inf_le_sup
code: theorem inf_le_sup : a ⊓ b ≤ a ⊔ b 
goal: a ⊓ b ≤ a ⊔ b

full_name: sup_le_inf
code: theorem sup_le_inf : a ⊔ b ≤ a ⊓ b ↔ a = b 
goal: a ⊔ b ≤ a ⊓ b ↔ a = b

full_name: inf_eq_sup
code: @[simp] lemma inf_eq_sup : a ⊓ b = a ⊔ b ↔ a = b 
goal: a ⊓ b = a ⊔ b ↔ a = b

full_name: sup_eq_inf
code: @[simp] lemma sup_eq_inf : a ⊔ b = a ⊓ b ↔ a = b 
goal: a ⊔ b = a ⊓ b ↔ a = b

full_name: inf_lt_sup
code: @[simp] lemma inf_lt_sup : a ⊓ b < a ⊔ b ↔ a ≠ b 
goal: a ⊓ b < a ⊔ b ↔ a ≠ b

full_name: inf_eq_and_sup_eq_iff
code: lemma inf_eq_and_sup_eq_iff : a ⊓ b = c ∧ a ⊔ b = c ↔ a = c ∧ b = c 
goal: a ⊓ b = c ∧ a ⊔ b = c ↔ a = c ∧ b = c

full_name: sup_inf_le
code: theorem sup_inf_le : a ⊔ b ⊓ c ≤ (a ⊔ b) ⊓ (a ⊔ c) 
goal: a ⊔ b ⊓ c ≤ (a ⊔ b) ⊓ (a ⊔ c)

full_name: le_inf_sup
code: theorem le_inf_sup : a ⊓ b ⊔ a ⊓ c ≤ a ⊓ (b ⊔ c) 
goal: a ⊓ b ⊔ a ⊓ c ≤ a ⊓ (b ⊔ c)

full_name: inf_sup_self
code: theorem inf_sup_self : a ⊓ (a ⊔ b) = a 
goal: a ⊓ (a ⊔ b) = a

full_name: sup_inf_self
code: theorem sup_inf_self : a ⊔ a ⊓ b = a 
goal: a ⊔ a ⊓ b = a

full_name: sup_eq_iff_inf_eq
code: theorem sup_eq_iff_inf_eq : a ⊔ b = b ↔ a ⊓ b = a 
goal: a ⊔ b = b ↔ a ⊓ b = a

full_name: Lattice.ext
code: theorem Lattice.ext {α} {A B : Lattice α} (H : ∀ x y : α, (haveI := A; x ≤ y) ↔ x ≤ y) :
    A = B 
goal: A = B

full_name: DistribLattice.le_sup_inf
code: /-- A distributive lattice is a lattice that satisfies any of four
equivalent distributive properties (of `sup` over `inf` or `inf` over `sup`,
on the left or right).

The definition here chooses `le_sup_inf`: `(x ⊔ y) ⊓ (x ⊔ z) ≤ x ⊔ (y ⊓ z)`. To prove distributivity
from the dual law, use `DistribLattice.of_inf_sup_le`.

A classic example of a distributive lattice
is the lattice of subsets of a set, and in fact this example is
generic in the sense that every distributive lattice is realizable
as a sublattice of a powerset lattice. -/
class DistribLattice (α) extends Lattice α where
  /-- The infimum distributes over the supremum -/
  protected le_sup_inf : ∀ x y z : α, (x ⊔ y) ⊓ (x ⊔ z) ≤ x ⊔ y ⊓ z
goal: (x ⊔ y) ⊓ (x ⊔ z) ≤ x ⊔ y ⊓ z

full_name: DistribLattice
code: /-- A distributive lattice is a lattice that satisfies any of four
equivalent distributive properties (of `sup` over `inf` or `inf` over `sup`,
on the left or right).

The definition here chooses `le_sup_inf`: `(x ⊔ y) ⊓ (x ⊔ z) ≤ x ⊔ (y ⊓ z)`. To prove distributivity
from the dual law, use `DistribLattice.of_inf_sup_le`.

A classic example of a distributive lattice
is the lattice of subsets of a set, and in fact this example is
generic in the sense that every distributive lattice is realizable
as a sublattice of a powerset lattice. -/
class DistribLattice (α) extends Lattice α where
  /-- The infimum distributes over the supremum -/
  protected le_sup_inf : ∀ x y z : α, (x ⊔ y) ⊓ (x ⊔ z) ≤ x ⊔ y ⊓ z
goal: Type u_1

full_name: le_sup_inf
code: theorem le_sup_inf : ∀ {x y z : α}, (x ⊔ y) ⊓ (x ⊔ z) ≤ x ⊔ y ⊓ z 
goal: (x ⊔ y) ⊓ (x ⊔ z) ≤ x ⊔ y ⊓ z

full_name: sup_inf_left
code: theorem sup_inf_left (a b c : α) : a ⊔ b ⊓ c = (a ⊔ b) ⊓ (a ⊔ c) 
goal: a ⊔ b ⊓ c = (a ⊔ b) ⊓ (a ⊔ c)

full_name: sup_inf_right
code: theorem sup_inf_right (a b c : α) : a ⊓ b ⊔ c = (a ⊔ c) ⊓ (b ⊔ c) 
goal: a ⊓ b ⊔ c = (a ⊔ c) ⊓ (b ⊔ c)

full_name: inf_sup_left
code: theorem inf_sup_left (a b c : α) : a ⊓ (b ⊔ c) = a ⊓ b ⊔ a ⊓ c 
goal: a ⊓ (b ⊔ c) = a ⊓ b ⊔ a ⊓ c

full_name: OrderDual.instDistribLattice
code: instance OrderDual.instDistribLattice (α : Type*) [DistribLattice α] : DistribLattice αᵒᵈ 
goal: DistribLattice αᵒᵈ

full_name: inf_sup_right
code: theorem inf_sup_right (a b c : α) : (a ⊔ b) ⊓ c = a ⊓ c ⊔ b ⊓ c 
goal: (a ⊔ b) ⊓ c = a ⊓ c ⊔ b ⊓ c

full_name: le_of_inf_le_sup_le
code: theorem le_of_inf_le_sup_le (h₁ : x ⊓ z ≤ y ⊓ z) (h₂ : x ⊔ z ≤ y ⊔ z) : x ≤ y 
goal: x ≤ y

full_name: eq_of_inf_eq_sup_eq
code: theorem eq_of_inf_eq_sup_eq {a b c : α} (h₁ : b ⊓ a = c ⊓ a) (h₂ : b ⊔ a = c ⊔ a) : b = c 
goal: b = c

full_name: DistribLattice.ofInfSupLe
code: /-- Prove distributivity of an existing lattice from the dual distributive law. -/
abbrev DistribLattice.ofInfSupLe
    [Lattice α] (inf_sup_le : ∀ a b c : α, a ⊓ (b ⊔ c) ≤ a ⊓ b ⊔ a ⊓ c) : DistribLattice α 
goal: DistribLattice α

full_name: LinearOrder.toLattice
code: instance (priority := 100) LinearOrder.toLattice {α : Type u} [o : LinearOrder α] : Lattice α 
goal: Lattice α

full_name: sup_eq_max
code: theorem sup_eq_max : a ⊔ b = max a b 
goal: a ⊔ b = max a b

full_name: inf_eq_min
code: theorem inf_eq_min : a ⊓ b = min a b 
goal: a ⊓ b = min a b

full_name: sup_ind
code: theorem sup_ind (a b : α) {p : α → Prop} (ha : p a) (hb : p b) : p (a ⊔ b) 
goal: p (a ⊔ b)

full_name: le_sup_iff
code: @[simp]
theorem le_sup_iff : a ≤ b ⊔ c ↔ a ≤ b ∨ a ≤ c 
goal: a ≤ b ⊔ c ↔ a ≤ b ∨ a ≤ c

full_name: lt_sup_iff
code: @[simp]
theorem lt_sup_iff : a < b ⊔ c ↔ a < b ∨ a < c 
goal: a < b ⊔ c ↔ a < b ∨ a < c

full_name: sup_lt_iff
code: @[simp]
theorem sup_lt_iff : b ⊔ c < a ↔ b < a ∧ c < a 
goal: b ⊔ c < a ↔ b < a ∧ c < a

full_name: inf_ind
code: theorem inf_ind (a b : α) {p : α → Prop} : p a → p b → p (a ⊓ b) 
goal: p a → p b → p (a ⊓ b)

full_name: inf_le_iff
code: @[simp]
theorem inf_le_iff : b ⊓ c ≤ a ↔ b ≤ a ∨ c ≤ a 
goal: b ⊓ c ≤ a ↔ b ≤ a ∨ c ≤ a

full_name: inf_lt_iff
code: @[simp]
theorem inf_lt_iff : b ⊓ c < a ↔ b < a ∨ c < a 
goal: b ⊓ c < a ↔ b < a ∨ c < a

full_name: lt_inf_iff
code: @[simp]
theorem lt_inf_iff : a < b ⊓ c ↔ a < b ∧ a < c 
goal: a < b ⊓ c ↔ a < b ∧ a < c

full_name: max_max_max_comm
code: theorem max_max_max_comm : max (max a b) (max c d) = max (max a c) (max b d) 
goal: max (max a b) (max c d) = max (max a c) (max b d)

full_name: min_min_min_comm
code: theorem min_min_min_comm : min (min a b) (min c d) = min (min a c) (min b d) 
goal: min (min a b) (min c d) = min (min a c) (min b d)

full_name: sup_eq_maxDefault
code: theorem sup_eq_maxDefault [SemilatticeSup α] [DecidableRel ((· ≤ ·) : α → α → Prop)]
    [IsTotal α (· ≤ ·)] :
    (· ⊔ ·) = (maxDefault : α → α → α) 
goal: (fun x x_1 => x ⊔ x_1) = maxDefault

full_name: inf_eq_minDefault
code: theorem inf_eq_minDefault [SemilatticeInf α] [DecidableRel ((· ≤ ·) : α → α → Prop)]
    [IsTotal α (· ≤ ·)] :
    (· ⊓ ·) = (minDefault : α → α → α) 
goal: (fun x x_1 => x ⊓ x_1) = minDefault

full_name: Lattice.toLinearOrder
code: /-- A lattice with total order is a linear order.

See note [reducible non-instances]. -/
abbrev Lattice.toLinearOrder (α : Type u) [Lattice α] [DecidableEq α]
    [DecidableRel ((· ≤ ·) : α → α → Prop)]
    [DecidableRel ((· < ·) : α → α → Prop)] [IsTotal α (· ≤ ·)] : LinearOrder α 
goal: LinearOrder α

full_name: instDistribLatticeOfLinearOrder
code: instance (priority := 100) {α : Type u} [LinearOrder α] : DistribLattice α 
goal: DistribLattice α

full_name: instDistribLatticeNat
code: instance : DistribLattice ℕ 
goal: DistribLattice ℕ

full_name: instLatticeInt
code: instance : Lattice ℤ 
goal: Lattice ℤ

full_name: ofDual_inf
code: @[simp]
theorem ofDual_inf [Sup α] (a b : αᵒᵈ) : ofDual (a ⊓ b) = ofDual a ⊔ ofDual b 
goal: OrderDual.ofDual (a ⊓ b) = OrderDual.ofDual a ⊔ OrderDual.ofDual b

full_name: ofDual_sup
code: @[simp]
theorem ofDual_sup [Inf α] (a b : αᵒᵈ) : ofDual (a ⊔ b) = ofDual a ⊓ ofDual b 
goal: OrderDual.ofDual (a ⊔ b) = OrderDual.ofDual a ⊓ OrderDual.ofDual b

full_name: toDual_inf
code: @[simp]
theorem toDual_inf [Inf α] (a b : α) : toDual (a ⊓ b) = toDual a ⊔ toDual b 
goal: OrderDual.toDual (a ⊓ b) = OrderDual.toDual a ⊔ OrderDual.toDual b

full_name: toDual_sup
code: @[simp]
theorem toDual_sup [Sup α] (a b : α) : toDual (a ⊔ b) = toDual a ⊓ toDual b 
goal: OrderDual.toDual (a ⊔ b) = OrderDual.toDual a ⊓ OrderDual.toDual b

full_name: ofDual_min
code: @[simp]
theorem ofDual_min (a b : αᵒᵈ) : ofDual (min a b) = max (ofDual a) (ofDual b) 
goal: OrderDual.ofDual (min a b) = max (OrderDual.ofDual a) (OrderDual.ofDual b)

full_name: ofDual_max
code: @[simp]
theorem ofDual_max (a b : αᵒᵈ) : ofDual (max a b) = min (ofDual a) (ofDual b) 
goal: OrderDual.ofDual (max a b) = min (OrderDual.ofDual a) (OrderDual.ofDual b)

full_name: toDual_min
code: @[simp]
theorem toDual_min (a b : α) : toDual (min a b) = max (toDual a) (toDual b) 
goal: OrderDual.toDual (min a b) = max (OrderDual.toDual a) (OrderDual.toDual b)

full_name: toDual_max
code: @[simp]
theorem toDual_max (a b : α) : toDual (max a b) = min (toDual a) (toDual b) 
goal: OrderDual.toDual (max a b) = min (OrderDual.toDual a) (OrderDual.toDual b)

full_name: Pi.instSupForall
code: instance [∀ i, Sup (α' i)] : Sup (∀ i, α' i) 
goal: Sup ((i : ι) → α' i)

full_name: Pi.sup_apply
code: @[simp]
theorem sup_apply [∀ i, Sup (α' i)] (f g : ∀ i, α' i) (i : ι) : (f ⊔ g) i = f i ⊔ g i 
goal: (f ⊔ g) i = f i ⊔ g i

full_name: Pi.sup_def
code: theorem sup_def [∀ i, Sup (α' i)] (f g : ∀ i, α' i) : f ⊔ g = fun i => f i ⊔ g i 
goal: f ⊔ g = fun i => f i ⊔ g i

full_name: Pi.instInfForall
code: instance [∀ i, Inf (α' i)] : Inf (∀ i, α' i) 
goal: Inf ((i : ι) → α' i)

full_name: Pi.inf_apply
code: @[simp]
theorem inf_apply [∀ i, Inf (α' i)] (f g : ∀ i, α' i) (i : ι) : (f ⊓ g) i = f i ⊓ g i 
goal: (f ⊓ g) i = f i ⊓ g i

full_name: Pi.inf_def
code: theorem inf_def [∀ i, Inf (α' i)] (f g : ∀ i, α' i) : f ⊓ g = fun i => f i ⊓ g i 
goal: f ⊓ g = fun i => f i ⊓ g i

full_name: Pi.instSemilatticeSup
code: instance instSemilatticeSup [∀ i, SemilatticeSup (α' i)] : SemilatticeSup (∀ i, α' i) 
goal: SemilatticeSup ((i : ι) → α' i)

full_name: Pi.instSemilatticeInf
code: instance instSemilatticeInf [∀ i, SemilatticeInf (α' i)] : SemilatticeInf (∀ i, α' i) 
goal: SemilatticeInf ((i : ι) → α' i)

full_name: Pi.instLattice
code: instance instLattice [∀ i, Lattice (α' i)] : Lattice (∀ i, α' i) 
goal: Lattice ((i : ι) → α' i)

full_name: Pi.instDistribLattice
code: instance instDistribLattice [∀ i, DistribLattice (α' i)] : DistribLattice (∀ i, α' i) 
goal: DistribLattice ((i : ι) → α' i)

full_name: Function.update_sup
code: theorem update_sup [∀ i, SemilatticeSup (π i)] (f : ∀ i, π i) (i : ι) (a b : π i) :
    update f i (a ⊔ b) = update f i a ⊔ update f i b 
goal: Function.update f i (a ⊔ b) = Function.update f i a ⊔ Function.update f i b

full_name: Function.update_inf
code: theorem update_inf [∀ i, SemilatticeInf (π i)] (f : ∀ i, π i) (i : ι) (a b : π i) :
    update f i (a ⊓ b) = update f i a ⊓ update f i b 
goal: Function.update f i (a ⊓ b) = Function.update f i a ⊓ Function.update f i b

full_name: Monotone.sup
code: /-- Pointwise supremum of two monotone functions is a monotone function. -/
protected theorem sup [Preorder α] [SemilatticeSup β] {f g : α → β} (hf : Monotone f)
    (hg : Monotone g) :
    Monotone (f ⊔ g) 
goal: Monotone (f ⊔ g)

full_name: Monotone.inf
code: /-- Pointwise infimum of two monotone functions is a monotone function. -/
protected theorem inf [Preorder α] [SemilatticeInf β] {f g : α → β} (hf : Monotone f)
    (hg : Monotone g) :
    Monotone (f ⊓ g) 
goal: Monotone (f ⊓ g)

full_name: Monotone.max
code: /-- Pointwise maximum of two monotone functions is a monotone function. -/
protected theorem max [Preorder α] [LinearOrder β] {f g : α → β} (hf : Monotone f)
    (hg : Monotone g) :
    Monotone fun x => max (f x) (g x) 
goal: Monotone fun x => max (f x) (g x)

full_name: Monotone.min
code: /-- Pointwise minimum of two monotone functions is a monotone function. -/
protected theorem min [Preorder α] [LinearOrder β] {f g : α → β} (hf : Monotone f)
    (hg : Monotone g) :
    Monotone fun x => min (f x) (g x) 
goal: Monotone fun x => min (f x) (g x)

full_name: Monotone.le_map_sup
code: theorem le_map_sup [SemilatticeSup α] [SemilatticeSup β] {f : α → β} (h : Monotone f) (x y : α) :
    f x ⊔ f y ≤ f (x ⊔ y) 
goal: f x ⊔ f y ≤ f (x ⊔ y)

full_name: Monotone.map_inf_le
code: theorem map_inf_le [SemilatticeInf α] [SemilatticeInf β] {f : α → β} (h : Monotone f) (x y : α) :
    f (x ⊓ y) ≤ f x ⊓ f y 
goal: f (x ⊓ y) ≤ f x ⊓ f y

full_name: Monotone.of_map_inf
code: theorem of_map_inf [SemilatticeInf α] [SemilatticeInf β] {f : α → β}
    (h : ∀ x y, f (x ⊓ y) = f x ⊓ f y) : Monotone f 
goal: Monotone f

full_name: Monotone.of_map_sup
code: theorem of_map_sup [SemilatticeSup α] [SemilatticeSup β] {f : α → β}
    (h : ∀ x y, f (x ⊔ y) = f x ⊔ f y) : Monotone f 
goal: Monotone f

full_name: Monotone.map_sup
code: theorem map_sup [SemilatticeSup β] {f : α → β} (hf : Monotone f) (x y : α) :
    f (x ⊔ y) = f x ⊔ f y 
goal: f (x ⊔ y) = f x ⊔ f y

full_name: Monotone.map_inf
code: theorem map_inf [SemilatticeInf β] {f : α → β} (hf : Monotone f) (x y : α) :
    f (x ⊓ y) = f x ⊓ f y 
goal: f (x ⊓ y) = f x ⊓ f y

full_name: MonotoneOn.sup
code: /-- Pointwise supremum of two monotone functions is a monotone function. -/
protected theorem sup [Preorder α] [SemilatticeSup β] {f g : α → β} {s : Set α}
    (hf : MonotoneOn f s) (hg : MonotoneOn g s) : MonotoneOn (f ⊔ g) s 
goal: MonotoneOn (f ⊔ g) s

full_name: MonotoneOn.inf
code: /-- Pointwise infimum of two monotone functions is a monotone function. -/
protected theorem inf [Preorder α] [SemilatticeInf β] {f g : α → β} {s : Set α}
    (hf : MonotoneOn f s) (hg : MonotoneOn g s) : MonotoneOn (f ⊓ g) s 
goal: MonotoneOn (f ⊓ g) s

full_name: MonotoneOn.max
code: /-- Pointwise maximum of two monotone functions is a monotone function. -/
protected theorem max [Preorder α] [LinearOrder β] {f g : α → β} {s : Set α} (hf : MonotoneOn f s)
    (hg : MonotoneOn g s) : MonotoneOn (fun x => max (f x) (g x)) s 
goal: MonotoneOn (fun x => max (f x) (g x)) s

full_name: MonotoneOn.min
code: /-- Pointwise minimum of two monotone functions is a monotone function. -/
protected theorem min [Preorder α] [LinearOrder β] {f g : α → β} {s : Set α} (hf : MonotoneOn f s)
    (hg : MonotoneOn g s) : MonotoneOn (fun x => min (f x) (g x)) s 
goal: MonotoneOn (fun x => min (f x) (g x)) s

full_name: MonotoneOn.of_map_inf
code: theorem of_map_inf [SemilatticeInf α] [SemilatticeInf β]
    (h : ∀ x ∈ s, ∀ y ∈ s, f (x ⊓ y) = f x ⊓ f y) : MonotoneOn f s 
goal: MonotoneOn f s

full_name: MonotoneOn.of_map_sup
code: theorem of_map_sup [SemilatticeSup α] [SemilatticeSup β]
    (h : ∀ x ∈ s, ∀ y ∈ s, f (x ⊔ y) = f x ⊔ f y) : MonotoneOn f s 
goal: MonotoneOn f s

full_name: MonotoneOn.map_sup
code: theorem map_sup [SemilatticeSup β] (hf : MonotoneOn f s) (hx : x ∈ s) (hy : y ∈ s) :
    f (x ⊔ y) = f x ⊔ f y 
goal: f (x ⊔ y) = f x ⊔ f y

full_name: MonotoneOn.map_inf
code: theorem map_inf [SemilatticeInf β] (hf : MonotoneOn f s) (hx : x ∈ s) (hy : y ∈ s) :
    f (x ⊓ y) = f x ⊓ f y 
goal: f (x ⊓ y) = f x ⊓ f y

full_name: Antitone.sup
code: /-- Pointwise supremum of two monotone functions is a monotone function. -/
protected theorem sup [Preorder α] [SemilatticeSup β] {f g : α → β} (hf : Antitone f)
    (hg : Antitone g) :
    Antitone (f ⊔ g) 
goal: Antitone (f ⊔ g)

full_name: Antitone.inf
code: /-- Pointwise infimum of two monotone functions is a monotone function. -/
protected theorem inf [Preorder α] [SemilatticeInf β] {f g : α → β} (hf : Antitone f)
    (hg : Antitone g) :
    Antitone (f ⊓ g) 
goal: Antitone (f ⊓ g)

full_name: Antitone.max
code: /-- Pointwise maximum of two monotone functions is a monotone function. -/
protected theorem max [Preorder α] [LinearOrder β] {f g : α → β} (hf : Antitone f)
    (hg : Antitone g) :
    Antitone fun x => max (f x) (g x) 
goal: Antitone fun x => max (f x) (g x)

full_name: Antitone.min
code: /-- Pointwise minimum of two monotone functions is a monotone function. -/
protected theorem min [Preorder α] [LinearOrder β] {f g : α → β} (hf : Antitone f)
    (hg : Antitone g) :
    Antitone fun x => min (f x) (g x) 
goal: Antitone fun x => min (f x) (g x)

full_name: Antitone.map_sup_le
code: theorem map_sup_le [SemilatticeSup α] [SemilatticeInf β] {f : α → β} (h : Antitone f) (x y : α) :
    f (x ⊔ y) ≤ f x ⊓ f y 
goal: f (x ⊔ y) ≤ f x ⊓ f y

full_name: Antitone.le_map_inf
code: theorem le_map_inf [SemilatticeInf α] [SemilatticeSup β] {f : α → β} (h : Antitone f) (x y : α) :
    f x ⊔ f y ≤ f (x ⊓ y) 
goal: f x ⊔ f y ≤ f (x ⊓ y)

full_name: Antitone.map_sup
code: theorem map_sup [SemilatticeInf β] {f : α → β} (hf : Antitone f) (x y : α) :
    f (x ⊔ y) = f x ⊓ f y 
goal: f (x ⊔ y) = f x ⊓ f y

full_name: Antitone.map_inf
code: theorem map_inf [SemilatticeSup β] {f : α → β} (hf : Antitone f) (x y : α) :
    f (x ⊓ y) = f x ⊔ f y 
goal: f (x ⊓ y) = f x ⊔ f y

full_name: AntitoneOn.sup
code: /-- Pointwise supremum of two antitone functions is an antitone function. -/
protected theorem sup [Preorder α] [SemilatticeSup β] {f g : α → β} {s : Set α}
    (hf : AntitoneOn f s) (hg : AntitoneOn g s) : AntitoneOn (f ⊔ g) s 
goal: AntitoneOn (f ⊔ g) s

full_name: AntitoneOn.inf
code: /-- Pointwise infimum of two antitone functions is an antitone function. -/
protected theorem inf [Preorder α] [SemilatticeInf β] {f g : α → β} {s : Set α}
    (hf : AntitoneOn f s) (hg : AntitoneOn g s) : AntitoneOn (f ⊓ g) s 
goal: AntitoneOn (f ⊓ g) s

full_name: AntitoneOn.max
code: /-- Pointwise maximum of two antitone functions is an antitone function. -/
protected theorem max [Preorder α] [LinearOrder β] {f g : α → β} {s : Set α} (hf : AntitoneOn f s)
    (hg : AntitoneOn g s) : AntitoneOn (fun x => max (f x) (g x)) s 
goal: AntitoneOn (fun x => max (f x) (g x)) s

full_name: AntitoneOn.min
code: /-- Pointwise minimum of two antitone functions is an antitone function. -/
protected theorem min [Preorder α] [LinearOrder β] {f g : α → β} {s : Set α} (hf : AntitoneOn f s)
    (hg : AntitoneOn g s) : AntitoneOn (fun x => min (f x) (g x)) s 
goal: AntitoneOn (fun x => min (f x) (g x)) s

full_name: AntitoneOn.of_map_inf
code: theorem of_map_inf [SemilatticeInf α] [SemilatticeSup β]
    (h : ∀ x ∈ s, ∀ y ∈ s, f (x ⊓ y) = f x ⊔ f y) : AntitoneOn f s 
goal: AntitoneOn f s

full_name: AntitoneOn.of_map_sup
code: theorem of_map_sup [SemilatticeSup α] [SemilatticeInf β]
    (h : ∀ x ∈ s, ∀ y ∈ s, f (x ⊔ y) = f x ⊓ f y) : AntitoneOn f s 
goal: AntitoneOn f s

full_name: AntitoneOn.map_sup
code: theorem map_sup [SemilatticeInf β] (hf : AntitoneOn f s) (hx : x ∈ s) (hy : y ∈ s) :
    f (x ⊔ y) = f x ⊓ f y 
goal: f (x ⊔ y) = f x ⊓ f y

full_name: AntitoneOn.map_inf
code: theorem map_inf [SemilatticeSup β] (hf : AntitoneOn f s) (hx : x ∈ s) (hy : y ∈ s) :
    f (x ⊓ y) = f x ⊔ f y 
goal: f (x ⊓ y) = f x ⊔ f y

full_name: Prod.instSup
code: instance [Sup α] [Sup β] : Sup (α × β) 
goal: Sup (α × β)

full_name: Prod.instInf
code: instance [Inf α] [Inf β] : Inf (α × β) 
goal: Inf (α × β)

full_name: Prod.mk_sup_mk
code: @[simp]
theorem mk_sup_mk [Sup α] [Sup β] (a₁ a₂ : α) (b₁ b₂ : β) :
    (a₁, b₁) ⊔ (a₂, b₂) = (a₁ ⊔ a₂, b₁ ⊔ b₂) 
goal: (a₁, b₁) ⊔ (a₂, b₂) = (a₁ ⊔ a₂, b₁ ⊔ b₂)

full_name: Prod.mk_inf_mk
code: @[simp]
theorem mk_inf_mk [Inf α] [Inf β] (a₁ a₂ : α) (b₁ b₂ : β) :
    (a₁, b₁) ⊓ (a₂, b₂) = (a₁ ⊓ a₂, b₁ ⊓ b₂) 
goal: (a₁, b₁) ⊓ (a₂, b₂) = (a₁ ⊓ a₂, b₁ ⊓ b₂)

full_name: Prod.fst_sup
code: @[simp]
theorem fst_sup [Sup α] [Sup β] (p q : α × β) : (p ⊔ q).fst = p.fst ⊔ q.fst 
goal: (p ⊔ q).1 = p.1 ⊔ q.1

full_name: Prod.fst_inf
code: @[simp]
theorem fst_inf [Inf α] [Inf β] (p q : α × β) : (p ⊓ q).fst = p.fst ⊓ q.fst 
goal: (p ⊓ q).1 = p.1 ⊓ q.1

full_name: Prod.snd_sup
code: @[simp]
theorem snd_sup [Sup α] [Sup β] (p q : α × β) : (p ⊔ q).snd = p.snd ⊔ q.snd 
goal: (p ⊔ q).2 = p.2 ⊔ q.2

full_name: Prod.snd_inf
code: @[simp]
theorem snd_inf [Inf α] [Inf β] (p q : α × β) : (p ⊓ q).snd = p.snd ⊓ q.snd 
goal: (p ⊓ q).2 = p.2 ⊓ q.2

full_name: Prod.swap_sup
code: @[simp]
theorem swap_sup [Sup α] [Sup β] (p q : α × β) : (p ⊔ q).swap = p.swap ⊔ q.swap 
goal: (p ⊔ q).swap = p.swap ⊔ q.swap

full_name: Prod.swap_inf
code: @[simp]
theorem swap_inf [Inf α] [Inf β] (p q : α × β) : (p ⊓ q).swap = p.swap ⊓ q.swap 
goal: (p ⊓ q).swap = p.swap ⊓ q.swap

full_name: Prod.sup_def
code: theorem sup_def [Sup α] [Sup β] (p q : α × β) : p ⊔ q = (p.fst ⊔ q.fst, p.snd ⊔ q.snd) 
goal: p ⊔ q = (p.1 ⊔ q.1, p.2 ⊔ q.2)

full_name: Prod.inf_def
code: theorem inf_def [Inf α] [Inf β] (p q : α × β) : p ⊓ q = (p.fst ⊓ q.fst, p.snd ⊓ q.snd) 
goal: p ⊓ q = (p.1 ⊓ q.1, p.2 ⊓ q.2)

full_name: Prod.instSemilatticeSup
code: instance instSemilatticeSup [SemilatticeSup α] [SemilatticeSup β] : SemilatticeSup (α × β) 
goal: SemilatticeSup (α × β)

full_name: Prod.instSemilatticeInf
code: instance instSemilatticeInf [SemilatticeInf α] [SemilatticeInf β] : SemilatticeInf (α × β) 
goal: SemilatticeInf (α × β)

full_name: Prod.instLattice
code: instance instLattice [Lattice α] [Lattice β] : Lattice (α × β) 
goal: Lattice (α × β)

full_name: Prod.instDistribLattice
code: instance instDistribLattice [DistribLattice α] [DistribLattice β] : DistribLattice (α × β) 
goal: DistribLattice (α × β)

full_name: Subtype.semilatticeSup
code: /-- A subtype forms a `⊔`-semilattice if `⊔` preserves the property.
See note [reducible non-instances]. -/
protected abbrev semilatticeSup [SemilatticeSup α] {P : α → Prop}
    (Psup : ∀ ⦃x y⦄, P x → P y → P (x ⊔ y)) :
    SemilatticeSup { x : α // P x } 
goal: SemilatticeSup { x // P x }

full_name: Subtype.semilatticeInf
code: /-- A subtype forms a `⊓`-semilattice if `⊓` preserves the property.
See note [reducible non-instances]. -/
protected abbrev semilatticeInf [SemilatticeInf α] {P : α → Prop}
    (Pinf : ∀ ⦃x y⦄, P x → P y → P (x ⊓ y)) :
    SemilatticeInf { x : α // P x } 
goal: SemilatticeInf { x // P x }

full_name: Subtype.lattice
code: /-- A subtype forms a lattice if `⊔` and `⊓` preserve the property.
See note [reducible non-instances]. -/
protected abbrev lattice [Lattice α] {P : α → Prop} (Psup : ∀ ⦃x y⦄, P x → P y → P (x ⊔ y))
    (Pinf : ∀ ⦃x y⦄, P x → P y → P (x ⊓ y)) : Lattice { x : α // P x } 
goal: Lattice { x // P x }

full_name: Subtype.coe_sup
code: @[simp, norm_cast]
theorem coe_sup [SemilatticeSup α] {P : α → Prop}
    (Psup : ∀ ⦃x y⦄, P x → P y → P (x ⊔ y)) (x y : Subtype P) :
    (haveI := Subtype.semilatticeSup Psup; (x ⊔ y : Subtype P) : α) = (x ⊔ y : α) 
goal: ↑(x ⊔ y) = ↑x ⊔ ↑y

full_name: Subtype.coe_inf
code: @[simp, norm_cast]
theorem coe_inf [SemilatticeInf α] {P : α → Prop}
    (Pinf : ∀ ⦃x y⦄, P x → P y → P (x ⊓ y)) (x y : Subtype P) :
    (haveI := Subtype.semilatticeInf Pinf; (x ⊓ y : Subtype P) : α) = (x ⊓ y : α) 
goal: ↑(x ⊓ y) = ↑x ⊓ ↑y

full_name: Subtype.mk_sup_mk
code: @[simp]
theorem mk_sup_mk [SemilatticeSup α] {P : α → Prop}
    (Psup : ∀ ⦃x y⦄, P x → P y → P (x ⊔ y)) {x y : α} (hx : P x) (hy : P y) :
    (haveI := Subtype.semilatticeSup Psup; (⟨x, hx⟩ ⊔ ⟨y, hy⟩ : Subtype P)) =
      ⟨x ⊔ y, Psup hx hy⟩ 
goal: ⟨x, hx⟩ ⊔ ⟨y, hy⟩ = ⟨x ⊔ y, ⋯⟩

full_name: Subtype.mk_inf_mk
code: @[simp]
theorem mk_inf_mk [SemilatticeInf α] {P : α → Prop}
    (Pinf : ∀ ⦃x y⦄, P x → P y → P (x ⊓ y)) {x y : α} (hx : P x) (hy : P y) :
    (haveI := Subtype.semilatticeInf Pinf; (⟨x, hx⟩ ⊓ ⟨y, hy⟩ : Subtype P)) =
      ⟨x ⊓ y, Pinf hx hy⟩ 
goal: ⟨x, hx⟩ ⊓ ⟨y, hy⟩ = ⟨x ⊓ y, ⋯⟩

full_name: Function.Injective.semilatticeSup
code: /-- A type endowed with `⊔` is a `SemilatticeSup`, if it admits an injective map that
preserves `⊔` to a `SemilatticeSup`.
See note [reducible non-instances]. -/
protected abbrev Function.Injective.semilatticeSup [Sup α] [SemilatticeSup β] (f : α → β)
    (hf_inj : Function.Injective f) (map_sup : ∀ a b, f (a ⊔ b) = f a ⊔ f b) :
    SemilatticeSup α 
goal: SemilatticeSup α

full_name: Function.Injective.semilatticeInf
code: /-- A type endowed with `⊓` is a `SemilatticeInf`, if it admits an injective map that
preserves `⊓` to a `SemilatticeInf`.
See note [reducible non-instances]. -/
protected abbrev Function.Injective.semilatticeInf [Inf α] [SemilatticeInf β] (f : α → β)
    (hf_inj : Function.Injective f) (map_inf : ∀ a b, f (a ⊓ b) = f a ⊓ f b) :
    SemilatticeInf α 
goal: SemilatticeInf α

full_name: Function.Injective.lattice
code: /-- A type endowed with `⊔` and `⊓` is a `Lattice`, if it admits an injective map that
preserves `⊔` and `⊓` to a `Lattice`.
See note [reducible non-instances]. -/
protected abbrev Function.Injective.lattice [Sup α] [Inf α] [Lattice β] (f : α → β)
    (hf_inj : Function.Injective f)
    (map_sup : ∀ a b, f (a ⊔ b) = f a ⊔ f b) (map_inf : ∀ a b, f (a ⊓ b) = f a ⊓ f b) :
    Lattice α 
goal: Lattice α

full_name: Function.Injective.distribLattice
code: /-- A type endowed with `⊔` and `⊓` is a `DistribLattice`, if it admits an injective map that
preserves `⊔` and `⊓` to a `DistribLattice`.
See note [reducible non-instances]. -/
protected abbrev Function.Injective.distribLattice [Sup α] [Inf α] [DistribLattice β] (f : α → β)
    (hf_inj : Function.Injective f) (map_sup : ∀ a b, f (a ⊔ b) = f a ⊔ f b)
    (map_inf : ∀ a b, f (a ⊓ b) = f a ⊓ f b) :
    DistribLattice α 
goal: DistribLattice α

full_name: ULift.instSemilatticeSup
code: instance [SemilatticeSup α] : SemilatticeSup (ULift.{v} α) 
goal: SemilatticeSup (ULift.{v, u} α)

full_name: ULift.instSemilatticeInf
code: instance [SemilatticeInf α] : SemilatticeInf (ULift.{v} α) 
goal: SemilatticeInf (ULift.{v, u} α)

full_name: ULift.instLattice
code: instance [Lattice α] : Lattice (ULift.{v} α) 
goal: Lattice (ULift.{v, u} α)

full_name: ULift.instDistribLattice
code: instance [DistribLattice α] : DistribLattice (ULift.{v} α) 
goal: DistribLattice (ULift.{v, u} α)

full_name: ULift.instLinearOrder
code: instance [LinearOrder α] : LinearOrder (ULift.{v} α) 
goal: LinearOrder (ULift.{v, u} α)

full_name: Bool.instDistribLattice
code: instance Bool.instDistribLattice : DistribLattice Bool 
goal: DistribLattice Bool