@@ -49,13 +49,57 @@ end DComp
4949protected 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