Skip to content

Commit 79841fc

Browse files
committed
feat: expand lemmas about Function.prod (#41148)
1 parent 2fed563 commit 79841fc

1 file changed

Lines changed: 50 additions & 6 deletions

File tree

Mathlib/Logic/Function/Defs.lean

Lines changed: 50 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,57 @@ end DComp
4949
protected def prod {ι} {α β : ι → Type*} (f : ∀ i, α i) (g : ∀ i, β i) (i : ι) :
5050
α i × β i := (f i, g i)
5151

52-
@[simp] lemma prod_apply {ι} {α β : ι → Type*} (f : ∀ i, α i) (g : ∀ i, β i) (i : ι) :
53-
Function.prod f g i = (f i , g i) := rfl
52+
section DProd
5453

55-
lemma prod_fst_snd {α β} : Function.prod (Prod.fst : α × β → α) (Prod.snd : α × β → β) = id :=
56-
rfl
57-
lemma prod_snd_fst {α β} : Function.prod (Prod.snd : α × β → β) (Prod.fst : α × β → α) = .swap :=
58-
rfl
54+
variable {ι} {α β : ι → Type*} (f f' : ∀ i, α i) (g g' : ∀ i, β i)
55+
56+
theorem prod_def : Function.prod f g = fun i : ι => (f i, g i) := rfl
57+
58+
@[simp, grind =] lemma prod_apply (i : ι) : Function.prod f g i = (f i, g i) := rfl
59+
60+
variable {f f' g g'} in
61+
@[simp] theorem prod_inj : Function.prod f g = Function.prod f' g' ↔ f = f' ∧ g = g' := by
62+
simp [funext_iff, Prod.ext_iff, forall_and]
63+
64+
end DProd
65+
66+
section Prod
67+
68+
variable {α β : Type*} {ι : Sort*} (f : ι → α) (g : ι → β)
69+
70+
theorem prod_ext_iff {h h' : ι → α × β} :
71+
h = h' ↔ Prod.fst ∘ h = Prod.fst ∘ h' ∧ Prod.snd ∘ h = Prod.snd ∘ h' :=
72+
prod_inj
73+
74+
@[simp] lemma prod_fst_snd : Function.prod (Prod.fst : _ → α) (Prod.snd : _ → β) = id := rfl
75+
@[simp] lemma prod_snd_fst : Function.prod (Prod.snd : _ → β) (Prod.fst : _ → α) = .swap := rfl
76+
77+
@[simp] theorem fst_comp_prod : Prod.fst ∘ Function.prod f g = f := rfl
78+
@[simp] theorem snd_comp_prod : Prod.snd ∘ Function.prod f g = g := rfl
79+
80+
@[simp] theorem prod_fst_comp_snd_comp (h : ι → α × β) :
81+
Function.prod (Prod.fst ∘ h) (Prod.snd ∘ h) = h := rfl
82+
83+
theorem const_prod (p : α × β) : const ι p = Function.prod (const ι p.1) (const ι p.2) := rfl
84+
85+
@[simp] theorem prod_const_const (a : α) (b : β) :
86+
Function.prod (const ι a) (const ι b) = const ι (a, b) := rfl
87+
88+
theorem prod_comp {κ} (h : κ → ι) : Function.prod f g ∘ h = Function.prod (f ∘ h) (g ∘ h) := rfl
89+
90+
@[simp] theorem prod_comp_fst_comp_snd {α₁ α₂ β₁ β₂} (f : α₁ → α₂) (g : β₁ → β₂) :
91+
Function.prod (f ∘ Prod.fst) (g ∘ Prod.snd) = Prod.map f g := rfl
92+
93+
@[simp] theorem map_comp_prod {γ δ} (h : α → γ) (k : β → δ) :
94+
Prod.map h k ∘ Function.prod f g = Function.prod (h ∘ f) (k ∘ g) := rfl
95+
96+
theorem prod_comp_prod {γ δ} (h : α × β → γ) (k : α × β → δ) :
97+
Function.prod h k ∘ Function.prod f g =
98+
Function.prod (h ∘ Function.prod f g) (k ∘ Function.prod f g) := rfl
99+
100+
@[simp] theorem swap_comp_prod : Prod.swap ∘ Function.prod f g = Function.prod g f := rfl
101+
102+
end Prod
59103

60104
/-- Given functions `f : β → β → φ` and `g : α → β`, produce a function `α → α → φ` that evaluates
61105
`g` on each argument, then applies `f` to the results. Can be used, e.g., to transfer a relation

0 commit comments

Comments
 (0)