Built with
doc-gen4, running Lean4.
Bubbles (
) indicate interactive fragments: hover for details, tap to reveal contents.
Use
Ctrl+↑Ctrl+↓to navigate,
Ctrl+🖱️to focus.
On Mac, use
Cmdinstead of
Ctrl.
/-
Copyright (c) 2020 Eric Wieser. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Eric Wieser
! This file was ported from Lean 3 source module data.prod.pprod
! leanprover-community/mathlib commit c4658a649d216f57e99621708b09dcb3dcccbd23
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
import Mathlib.Logic.Basic
/-!
# Extra facts about `PProd`
-/
open Function
variable {α β γ δ : Sort _}
namespace PProd
@[simp]
theorem mk.eta: ∀ {α : Sort u_1} {β : Sort u_2} {p : PProd α β}, { fst := p.fst, snd := p.snd } = p
mk.eta {p : PProd α β} : PProd.mk: {α : Sort ?u.32} → {β : Sort ?u.31} → α → β → PProd α β
PProd.mk p.1 p.2 = p :=
PProd.casesOn: ∀ {α : Sort ?u.49} {β : Sort ?u.48} {motive : PProd α β → Sort ?u.50} (t : PProd α β),
(∀ (fst : α) (snd : β), motive { fst := fst, snd := snd }) → motive t
PProd.casesOn p fun _ _ ↦ rfl: ∀ {α : Sort ?u.86} {a : α}, a = a
rfl
#align pprod.mk.eta PProd.mk.eta: ∀ {α : Sort u_1} {β : Sort u_2} {p : PProd α β}, { fst := p.fst, snd := p.snd } = p
PProd.mk.eta
@[simp]
theorem «forall»: ∀ {α : Sort u_1} {β : Sort u_2} {p : PProd α β → Prop},
(∀ (x : PProd α β), p x) ↔ ∀ (a : α) (b : β), p { fst := a, snd := b }
«forall» {p : PProd: Sort ?u.131 → Sort ?u.130 → Sort (max(max1?u.131)?u.130)
PProd α β → Prop} : (∀ x, p x) ↔ ∀ a b, p ⟨a, b⟩ :=
⟨fun h a b ↦ h ⟨a, b⟩, fun h ⟨a, b⟩ ↦ h a b⟩
#align pprod.forall PProd.forall: ∀ {α : Sort u_1} {β : Sort u_2} {p : PProd α β → Prop},
(∀ (x : PProd α β), p x) ↔ ∀ (a : α) (b : β), p { fst := a, snd := b }
PProd.forall
@[simp]
theorem «exists»: ∀ {α : Sort u_1} {β : Sort u_2} {p : PProd α β → Prop}, (∃ x, p x) ↔ ∃ a b, p { fst := a, snd := b }
«exists» {p : PProd: Sort ?u.334 → Sort ?u.333 → Sort (max(max1?u.334)?u.333)
PProd α β → Prop} : (∃ x, p x) ↔ ∃ a b, p ⟨a, b⟩ :=
⟨fun ⟨⟨a, b⟩, h: p { fst := a, snd := b }
h⟩ ↦ ⟨a, b, h: p { fst := a, snd := b }
h⟩, fun ⟨a, b, h: p { fst := a, snd := b }
h⟩ ↦ ⟨⟨a, b⟩, h: p { fst := a, snd := b }
h⟩⟩
#align pprod.exists PProd.exists: ∀ {α : Sort u_1} {β : Sort u_2} {p : PProd α β → Prop}, (∃ x, p x) ↔ ∃ a b, p { fst := a, snd := b }
PProd.exists
theorem forall': ∀ {p : α → β → Prop}, (∀ (x : PProd α β), p x.fst x.snd) ↔ ∀ (a : α) (b : β), p a b
forall' {p : α → β → Prop} : (∀ x : PProd: Sort ?u.802 → Sort ?u.801 → Sort (max(max1?u.802)?u.801)
PProd α β, p x.1 x.2) ↔ ∀ a b, p a b :=
PProd.forall: ∀ {α : Sort ?u.827} {β : Sort ?u.828} {p : PProd α β → Prop},
(∀ (x : PProd α β), p x) ↔ ∀ (a : α) (b : β), p { fst := a, snd := b }
PProd.forall
#align pprod.forall' PProd.forall': ∀ {α : Sort u_1} {β : Sort u_2} {p : α → β → Prop}, (∀ (x : PProd α β), p x.fst x.snd) ↔ ∀ (a : α) (b : β), p a b
PProd.forall'
theorem exists': ∀ {α : Sort u_1} {β : Sort u_2} {p : α → β → Prop}, (∃ x, p x.fst x.snd) ↔ ∃ a b, p a b
exists' {p : α → β → Prop} : (∃ x : PProd: Sort ?u.874 → Sort ?u.873 → Sort (max(max1?u.874)?u.873)
PProd α β, p x.1 x.2) ↔ ∃ a b, p a b :=
PProd.exists: ∀ {α : Sort ?u.904} {β : Sort ?u.905} {p : PProd α β → Prop}, (∃ x, p x) ↔ ∃ a b, p { fst := a, snd := b }
PProd.exists
#align pprod.exists' PProd.exists': ∀ {α : Sort u_1} {β : Sort u_2} {p : α → β → Prop}, (∃ x, p x.fst x.snd) ↔ ∃ a b, p a b
PProd.exists'
end PProd
theorem Function.Injective.pprod_map: ∀ {f : α → β} {g : γ → δ}, Injective f → Injective g → Injective fun x => { fst := f x.fst, snd := g x.snd }
Function.Injective.pprod_map {f : α → β} {g : γ → δ} (hf : Injective: {α : Sort ?u.959} → {β : Sort ?u.958} → (α → β) → Prop
Injective f) (hg : Injective: {α : Sort ?u.968} → {β : Sort ?u.967} → (α → β) → Prop
Injective g) :
Injective: {α : Sort ?u.977} → {β : Sort ?u.976} → (α → β) → Prop
Injective (fun x ↦ ⟨f x.1, g x.2⟩ : PProd: Sort ?u.983 → Sort ?u.982 → Sort (max(max1?u.983)?u.982)
PProd α γ → PProd: Sort ?u.986 → Sort ?u.985 → Sort (max(max1?u.986)?u.985)
PProd β δ) := fun _ _ h ↦
have A := congr_arg: ∀ {α : Sort ?u.1035} {β : Sort ?u.1034} {a₁ a₂ : α} (f : α → β), a₁ = a₂ → f a₁ = f a₂
congr_arg PProd.fst: {α : Sort ?u.1041} → {β : Sort ?u.1040} → PProd α β → α
PProd.fst h
have B := congr_arg: ∀ {α : Sort ?u.1063} {β : Sort ?u.1062} {a₁ a₂ : α} (f : α → β), a₁ = a₂ → f a₁ = f a₂
congr_arg PProd.snd: {α : Sort ?u.1069} → {β : Sort ?u.1068} → PProd α β → β
PProd.snd h
congr_arg₂: ∀ {α : Sort ?u.1084} {β : Sort ?u.1085} {γ : Sort ?u.1086} (f : α → β → γ) {x x' : α} {y y' : β},
x = x' → y = y' → f x y = f x' y'
congr_arg₂ PProd.mk: {α : Sort ?u.1091} → {β : Sort ?u.1090} → α → β → PProd α β
PProd.mk (hf A) (hg B)
#align function.injective.pprod_map Function.Injective.pprod_map