Zulip Chat Archive

Stream: Is there code for X?

Topic: Subtypes of functions are equivalent to functions to subtype


Eric Wieser (May 17 2021 at 13:51):

Do we have something like this?

/-- Functions whose range lies within a set are equivalent to functions to that set. -/
def foo (α : Type*) {β : Type*} (bs : set β) :
  {f : α → β // set.range f ⊆ bs} ≃ (α → bs) :=
{ to_fun := λ f a, set.cod_restrict f bs $ λ x, f.prop (set.mem_range_self x),
  inv_fun := λ f, ⟨_, λ  _ ⟨a, ha⟩, ha ▸ (f a).prop⟩,
  left_inv := λ x, by { ext, refl },
  right_inv := λ x, by { ext, refl } }

Eric Wieser (May 17 2021 at 14:00):

Or equivalently using docs#subtype.coind:

def subtype.coind_equiv (α : Type*) {β : Type*} (p : β → Prop) :
  {f : α → β // ∀ a, p (f a)} ≃ (α → subtype p) :=
{ to_fun := λ f, subtype.coind (f : α → β) f.2,
  inv_fun := λ f, ⟨coe ∘ f, λ a, (f a).prop⟩,
  left_inv := λ x, subtype.ext $ rfl,
  right_inv := λ x, funext $ λ _, subtype.ext rfl }

Last updated: Feb 28 2026 at 14:05 UTC