[GOAL]
G : Type u
M : Type v
α : Type w
s : Set α
m : MeasurableSpace α
inst✝³ : MeasurableSpace M
inst✝² : SMul M α
inst✝¹ : MeasurableSMul M α
c : M
μ : Measure α
inst✝ : SMulInvariantMeasure M α μ
⊢ map (fun x => c • x) μ = μ
[PROOFSTEP]
ext1 s hs
[GOAL]
case h
G : Type u
M : Type v
α : Type w
s✝ : Set α
m : MeasurableSpace α
inst✝³ : MeasurableSpace M
inst✝² : SMul M α
inst✝¹ : MeasurableSMul M α
c : M
μ : Measure α
inst✝ : SMulInvariantMeasure M α μ
s : Set α
hs : MeasurableSet s
⊢ ↑↑(map (fun x => c • x) μ) s = ↑↑μ s
[PROOFSTEP]
rw [map_apply (measurable_const_smul c) hs]
[GOAL]
case h
G : Type u
M : Type v
α : Type w
s✝ : Set α
m : MeasurableSpace α
inst✝³ : MeasurableSpace M
inst✝² : SMul M α
inst✝¹ : MeasurableSMul M α
c : M
μ : Measure α
inst✝ : SMulInvariantMeasure M α μ
s : Set α
hs : MeasurableSet s
⊢ ↑↑μ ((fun x x_1 => x • x_1) c ⁻¹' s) = ↑↑μ s
[PROOFSTEP]
exact SMulInvariantMeasure.measure_preimage_smul c hs
[GOAL]
G : Type u
M : Type v
α : Type w
s : Set α
m : MeasurableSpace α
inst✝³ : Group G
inst✝² : MulAction G α
inst✝¹ : MeasurableSpace G
inst✝ : MeasurableSMul G α
c : G
μ : Measure α
⊢ List.TFAE
    [SMulInvariantMeasure G α μ, ∀ (c : G) (s : Set α), MeasurableSet s → ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s,
      ∀ (c : G) (s : Set α), MeasurableSet s → ↑↑μ (c • s) = ↑↑μ s,
      ∀ (c : G) (s : Set α), ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s, ∀ (c : G) (s : Set α), ↑↑μ (c • s) = ↑↑μ s,
      ∀ (c : G), map (fun x => c • x) μ = μ, ∀ (c : G), MeasurePreserving fun x => c • x]
[PROOFSTEP]
tfae_have 1 ↔ 2
[GOAL]
case tfae_1_iff_2
G : Type u
M : Type v
α : Type w
s : Set α
m : MeasurableSpace α
inst✝³ : Group G
inst✝² : MulAction G α
inst✝¹ : MeasurableSpace G
inst✝ : MeasurableSMul G α
c : G
μ : Measure α
⊢ SMulInvariantMeasure G α μ ↔ ∀ (c : G) (s : Set α), MeasurableSet s → ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s
[PROOFSTEP]
exact ⟨fun h => h.1, fun h => ⟨h⟩⟩
[GOAL]
G : Type u
M : Type v
α : Type w
s : Set α
m : MeasurableSpace α
inst✝³ : Group G
inst✝² : MulAction G α
inst✝¹ : MeasurableSpace G
inst✝ : MeasurableSMul G α
c : G
μ : Measure α
tfae_1_iff_2 :
  SMulInvariantMeasure G α μ ↔ ∀ (c : G) (s : Set α), MeasurableSet s → ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s
⊢ List.TFAE
    [SMulInvariantMeasure G α μ, ∀ (c : G) (s : Set α), MeasurableSet s → ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s,
      ∀ (c : G) (s : Set α), MeasurableSet s → ↑↑μ (c • s) = ↑↑μ s,
      ∀ (c : G) (s : Set α), ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s, ∀ (c : G) (s : Set α), ↑↑μ (c • s) = ↑↑μ s,
      ∀ (c : G), map (fun x => c • x) μ = μ, ∀ (c : G), MeasurePreserving fun x => c • x]
[PROOFSTEP]
tfae_have 1 → 6
[GOAL]
case tfae_1_to_6
G : Type u
M : Type v
α : Type w
s : Set α
m : MeasurableSpace α
inst✝³ : Group G
inst✝² : MulAction G α
inst✝¹ : MeasurableSpace G
inst✝ : MeasurableSMul G α
c : G
μ : Measure α
tfae_1_iff_2 :
  SMulInvariantMeasure G α μ ↔ ∀ (c : G) (s : Set α), MeasurableSet s → ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s
⊢ SMulInvariantMeasure G α μ → ∀ (c : G), map (fun x => c • x) μ = μ
[PROOFSTEP]
intro h c
[GOAL]
case tfae_1_to_6
G : Type u
M : Type v
α : Type w
s : Set α
m : MeasurableSpace α
inst✝³ : Group G
inst✝² : MulAction G α
inst✝¹ : MeasurableSpace G
inst✝ : MeasurableSMul G α
c✝ : G
μ : Measure α
tfae_1_iff_2 :
  SMulInvariantMeasure G α μ ↔ ∀ (c : G) (s : Set α), MeasurableSet s → ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s
h : SMulInvariantMeasure G α μ
c : G
⊢ map (fun x => c • x) μ = μ
[PROOFSTEP]
exact (measurePreserving_smul c μ).map_eq
[GOAL]
G : Type u
M : Type v
α : Type w
s : Set α
m : MeasurableSpace α
inst✝³ : Group G
inst✝² : MulAction G α
inst✝¹ : MeasurableSpace G
inst✝ : MeasurableSMul G α
c : G
μ : Measure α
tfae_1_iff_2 :
  SMulInvariantMeasure G α μ ↔ ∀ (c : G) (s : Set α), MeasurableSet s → ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s
tfae_1_to_6 : SMulInvariantMeasure G α μ → ∀ (c : G), map (fun x => c • x) μ = μ
⊢ List.TFAE
    [SMulInvariantMeasure G α μ, ∀ (c : G) (s : Set α), MeasurableSet s → ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s,
      ∀ (c : G) (s : Set α), MeasurableSet s → ↑↑μ (c • s) = ↑↑μ s,
      ∀ (c : G) (s : Set α), ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s, ∀ (c : G) (s : Set α), ↑↑μ (c • s) = ↑↑μ s,
      ∀ (c : G), map (fun x => c • x) μ = μ, ∀ (c : G), MeasurePreserving fun x => c • x]
[PROOFSTEP]
tfae_have 6 → 7
[GOAL]
case tfae_6_to_7
G : Type u
M : Type v
α : Type w
s : Set α
m : MeasurableSpace α
inst✝³ : Group G
inst✝² : MulAction G α
inst✝¹ : MeasurableSpace G
inst✝ : MeasurableSMul G α
c : G
μ : Measure α
tfae_1_iff_2 :
  SMulInvariantMeasure G α μ ↔ ∀ (c : G) (s : Set α), MeasurableSet s → ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s
tfae_1_to_6 : SMulInvariantMeasure G α μ → ∀ (c : G), map (fun x => c • x) μ = μ
⊢ (∀ (c : G), map (fun x => c • x) μ = μ) → ∀ (c : G), MeasurePreserving fun x => c • x
[PROOFSTEP]
exact fun H c => ⟨measurable_const_smul c, H c⟩
[GOAL]
G : Type u
M : Type v
α : Type w
s : Set α
m : MeasurableSpace α
inst✝³ : Group G
inst✝² : MulAction G α
inst✝¹ : MeasurableSpace G
inst✝ : MeasurableSMul G α
c : G
μ : Measure α
tfae_1_iff_2 :
  SMulInvariantMeasure G α μ ↔ ∀ (c : G) (s : Set α), MeasurableSet s → ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s
tfae_1_to_6 : SMulInvariantMeasure G α μ → ∀ (c : G), map (fun x => c • x) μ = μ
tfae_6_to_7 : (∀ (c : G), map (fun x => c • x) μ = μ) → ∀ (c : G), MeasurePreserving fun x => c • x
⊢ List.TFAE
    [SMulInvariantMeasure G α μ, ∀ (c : G) (s : Set α), MeasurableSet s → ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s,
      ∀ (c : G) (s : Set α), MeasurableSet s → ↑↑μ (c • s) = ↑↑μ s,
      ∀ (c : G) (s : Set α), ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s, ∀ (c : G) (s : Set α), ↑↑μ (c • s) = ↑↑μ s,
      ∀ (c : G), map (fun x => c • x) μ = μ, ∀ (c : G), MeasurePreserving fun x => c • x]
[PROOFSTEP]
tfae_have 7 → 4
[GOAL]
case tfae_7_to_4
G : Type u
M : Type v
α : Type w
s : Set α
m : MeasurableSpace α
inst✝³ : Group G
inst✝² : MulAction G α
inst✝¹ : MeasurableSpace G
inst✝ : MeasurableSMul G α
c : G
μ : Measure α
tfae_1_iff_2 :
  SMulInvariantMeasure G α μ ↔ ∀ (c : G) (s : Set α), MeasurableSet s → ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s
tfae_1_to_6 : SMulInvariantMeasure G α μ → ∀ (c : G), map (fun x => c • x) μ = μ
tfae_6_to_7 : (∀ (c : G), map (fun x => c • x) μ = μ) → ∀ (c : G), MeasurePreserving fun x => c • x
⊢ (∀ (c : G), MeasurePreserving fun x => c • x) → ∀ (c : G) (s : Set α), ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s
[PROOFSTEP]
exact fun H c => (H c).measure_preimage_emb (measurableEmbedding_const_smul c)
[GOAL]
G : Type u
M : Type v
α : Type w
s : Set α
m : MeasurableSpace α
inst✝³ : Group G
inst✝² : MulAction G α
inst✝¹ : MeasurableSpace G
inst✝ : MeasurableSMul G α
c : G
μ : Measure α
tfae_1_iff_2 :
  SMulInvariantMeasure G α μ ↔ ∀ (c : G) (s : Set α), MeasurableSet s → ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s
tfae_1_to_6 : SMulInvariantMeasure G α μ → ∀ (c : G), map (fun x => c • x) μ = μ
tfae_6_to_7 : (∀ (c : G), map (fun x => c • x) μ = μ) → ∀ (c : G), MeasurePreserving fun x => c • x
tfae_7_to_4 :
  (∀ (c : G), MeasurePreserving fun x => c • x) → ∀ (c : G) (s : Set α), ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s
⊢ List.TFAE
    [SMulInvariantMeasure G α μ, ∀ (c : G) (s : Set α), MeasurableSet s → ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s,
      ∀ (c : G) (s : Set α), MeasurableSet s → ↑↑μ (c • s) = ↑↑μ s,
      ∀ (c : G) (s : Set α), ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s, ∀ (c : G) (s : Set α), ↑↑μ (c • s) = ↑↑μ s,
      ∀ (c : G), map (fun x => c • x) μ = μ, ∀ (c : G), MeasurePreserving fun x => c • x]
[PROOFSTEP]
tfae_have 4 → 5
[GOAL]
case tfae_4_to_5
G : Type u
M : Type v
α : Type w
s : Set α
m : MeasurableSpace α
inst✝³ : Group G
inst✝² : MulAction G α
inst✝¹ : MeasurableSpace G
inst✝ : MeasurableSMul G α
c : G
μ : Measure α
tfae_1_iff_2 :
  SMulInvariantMeasure G α μ ↔ ∀ (c : G) (s : Set α), MeasurableSet s → ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s
tfae_1_to_6 : SMulInvariantMeasure G α μ → ∀ (c : G), map (fun x => c • x) μ = μ
tfae_6_to_7 : (∀ (c : G), map (fun x => c • x) μ = μ) → ∀ (c : G), MeasurePreserving fun x => c • x
tfae_7_to_4 :
  (∀ (c : G), MeasurePreserving fun x => c • x) → ∀ (c : G) (s : Set α), ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s
⊢ (∀ (c : G) (s : Set α), ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s) → ∀ (c : G) (s : Set α), ↑↑μ (c • s) = ↑↑μ s
[PROOFSTEP]
exact fun H c s => by
  rw [← preimage_smul_inv]
  apply H
[GOAL]
G : Type u
M : Type v
α : Type w
s✝ : Set α
m : MeasurableSpace α
inst✝³ : Group G
inst✝² : MulAction G α
inst✝¹ : MeasurableSpace G
inst✝ : MeasurableSMul G α
c✝ : G
μ : Measure α
tfae_1_iff_2 :
  SMulInvariantMeasure G α μ ↔ ∀ (c : G) (s : Set α), MeasurableSet s → ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s
tfae_1_to_6 : SMulInvariantMeasure G α μ → ∀ (c : G), map (fun x => c • x) μ = μ
tfae_6_to_7 : (∀ (c : G), map (fun x => c • x) μ = μ) → ∀ (c : G), MeasurePreserving fun x => c • x
tfae_7_to_4 :
  (∀ (c : G), MeasurePreserving fun x => c • x) → ∀ (c : G) (s : Set α), ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s
H : ∀ (c : G) (s : Set α), ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s
c : G
s : Set α
⊢ ↑↑μ (c • s) = ↑↑μ s
[PROOFSTEP]
rw [← preimage_smul_inv]
[GOAL]
G : Type u
M : Type v
α : Type w
s✝ : Set α
m : MeasurableSpace α
inst✝³ : Group G
inst✝² : MulAction G α
inst✝¹ : MeasurableSpace G
inst✝ : MeasurableSMul G α
c✝ : G
μ : Measure α
tfae_1_iff_2 :
  SMulInvariantMeasure G α μ ↔ ∀ (c : G) (s : Set α), MeasurableSet s → ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s
tfae_1_to_6 : SMulInvariantMeasure G α μ → ∀ (c : G), map (fun x => c • x) μ = μ
tfae_6_to_7 : (∀ (c : G), map (fun x => c • x) μ = μ) → ∀ (c : G), MeasurePreserving fun x => c • x
tfae_7_to_4 :
  (∀ (c : G), MeasurePreserving fun x => c • x) → ∀ (c : G) (s : Set α), ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s
H : ∀ (c : G) (s : Set α), ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s
c : G
s : Set α
⊢ ↑↑μ ((fun x => c⁻¹ • x) ⁻¹' s) = ↑↑μ s
[PROOFSTEP]
apply H
[GOAL]
G : Type u
M : Type v
α : Type w
s : Set α
m : MeasurableSpace α
inst✝³ : Group G
inst✝² : MulAction G α
inst✝¹ : MeasurableSpace G
inst✝ : MeasurableSMul G α
c : G
μ : Measure α
tfae_1_iff_2 :
  SMulInvariantMeasure G α μ ↔ ∀ (c : G) (s : Set α), MeasurableSet s → ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s
tfae_1_to_6 : SMulInvariantMeasure G α μ → ∀ (c : G), map (fun x => c • x) μ = μ
tfae_6_to_7 : (∀ (c : G), map (fun x => c • x) μ = μ) → ∀ (c : G), MeasurePreserving fun x => c • x
tfae_7_to_4 :
  (∀ (c : G), MeasurePreserving fun x => c • x) → ∀ (c : G) (s : Set α), ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s
tfae_4_to_5 : (∀ (c : G) (s : Set α), ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s) → ∀ (c : G) (s : Set α), ↑↑μ (c • s) = ↑↑μ s
⊢ List.TFAE
    [SMulInvariantMeasure G α μ, ∀ (c : G) (s : Set α), MeasurableSet s → ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s,
      ∀ (c : G) (s : Set α), MeasurableSet s → ↑↑μ (c • s) = ↑↑μ s,
      ∀ (c : G) (s : Set α), ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s, ∀ (c : G) (s : Set α), ↑↑μ (c • s) = ↑↑μ s,
      ∀ (c : G), map (fun x => c • x) μ = μ, ∀ (c : G), MeasurePreserving fun x => c • x]
[PROOFSTEP]
tfae_have 5 → 3
[GOAL]
case tfae_5_to_3
G : Type u
M : Type v
α : Type w
s : Set α
m : MeasurableSpace α
inst✝³ : Group G
inst✝² : MulAction G α
inst✝¹ : MeasurableSpace G
inst✝ : MeasurableSMul G α
c : G
μ : Measure α
tfae_1_iff_2 :
  SMulInvariantMeasure G α μ ↔ ∀ (c : G) (s : Set α), MeasurableSet s → ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s
tfae_1_to_6 : SMulInvariantMeasure G α μ → ∀ (c : G), map (fun x => c • x) μ = μ
tfae_6_to_7 : (∀ (c : G), map (fun x => c • x) μ = μ) → ∀ (c : G), MeasurePreserving fun x => c • x
tfae_7_to_4 :
  (∀ (c : G), MeasurePreserving fun x => c • x) → ∀ (c : G) (s : Set α), ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s
tfae_4_to_5 : (∀ (c : G) (s : Set α), ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s) → ∀ (c : G) (s : Set α), ↑↑μ (c • s) = ↑↑μ s
⊢ (∀ (c : G) (s : Set α), ↑↑μ (c • s) = ↑↑μ s) → ∀ (c : G) (s : Set α), MeasurableSet s → ↑↑μ (c • s) = ↑↑μ s
[PROOFSTEP]
exact fun H c s _ => H c s
[GOAL]
G : Type u
M : Type v
α : Type w
s : Set α
m : MeasurableSpace α
inst✝³ : Group G
inst✝² : MulAction G α
inst✝¹ : MeasurableSpace G
inst✝ : MeasurableSMul G α
c : G
μ : Measure α
tfae_1_iff_2 :
  SMulInvariantMeasure G α μ ↔ ∀ (c : G) (s : Set α), MeasurableSet s → ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s
tfae_1_to_6 : SMulInvariantMeasure G α μ → ∀ (c : G), map (fun x => c • x) μ = μ
tfae_6_to_7 : (∀ (c : G), map (fun x => c • x) μ = μ) → ∀ (c : G), MeasurePreserving fun x => c • x
tfae_7_to_4 :
  (∀ (c : G), MeasurePreserving fun x => c • x) → ∀ (c : G) (s : Set α), ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s
tfae_4_to_5 : (∀ (c : G) (s : Set α), ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s) → ∀ (c : G) (s : Set α), ↑↑μ (c • s) = ↑↑μ s
tfae_5_to_3 :
  (∀ (c : G) (s : Set α), ↑↑μ (c • s) = ↑↑μ s) → ∀ (c : G) (s : Set α), MeasurableSet s → ↑↑μ (c • s) = ↑↑μ s
⊢ List.TFAE
    [SMulInvariantMeasure G α μ, ∀ (c : G) (s : Set α), MeasurableSet s → ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s,
      ∀ (c : G) (s : Set α), MeasurableSet s → ↑↑μ (c • s) = ↑↑μ s,
      ∀ (c : G) (s : Set α), ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s, ∀ (c : G) (s : Set α), ↑↑μ (c • s) = ↑↑μ s,
      ∀ (c : G), map (fun x => c • x) μ = μ, ∀ (c : G), MeasurePreserving fun x => c • x]
[PROOFSTEP]
tfae_have 3 → 2
[GOAL]
case tfae_3_to_2
G : Type u
M : Type v
α : Type w
s : Set α
m : MeasurableSpace α
inst✝³ : Group G
inst✝² : MulAction G α
inst✝¹ : MeasurableSpace G
inst✝ : MeasurableSMul G α
c : G
μ : Measure α
tfae_1_iff_2 :
  SMulInvariantMeasure G α μ ↔ ∀ (c : G) (s : Set α), MeasurableSet s → ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s
tfae_1_to_6 : SMulInvariantMeasure G α μ → ∀ (c : G), map (fun x => c • x) μ = μ
tfae_6_to_7 : (∀ (c : G), map (fun x => c • x) μ = μ) → ∀ (c : G), MeasurePreserving fun x => c • x
tfae_7_to_4 :
  (∀ (c : G), MeasurePreserving fun x => c • x) → ∀ (c : G) (s : Set α), ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s
tfae_4_to_5 : (∀ (c : G) (s : Set α), ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s) → ∀ (c : G) (s : Set α), ↑↑μ (c • s) = ↑↑μ s
tfae_5_to_3 :
  (∀ (c : G) (s : Set α), ↑↑μ (c • s) = ↑↑μ s) → ∀ (c : G) (s : Set α), MeasurableSet s → ↑↑μ (c • s) = ↑↑μ s
⊢ (∀ (c : G) (s : Set α), MeasurableSet s → ↑↑μ (c • s) = ↑↑μ s) →
    ∀ (c : G) (s : Set α), MeasurableSet s → ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s
[PROOFSTEP]
intro H c s hs
[GOAL]
case tfae_3_to_2
G : Type u
M : Type v
α : Type w
s✝ : Set α
m : MeasurableSpace α
inst✝³ : Group G
inst✝² : MulAction G α
inst✝¹ : MeasurableSpace G
inst✝ : MeasurableSMul G α
c✝ : G
μ : Measure α
tfae_1_iff_2 :
  SMulInvariantMeasure G α μ ↔ ∀ (c : G) (s : Set α), MeasurableSet s → ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s
tfae_1_to_6 : SMulInvariantMeasure G α μ → ∀ (c : G), map (fun x => c • x) μ = μ
tfae_6_to_7 : (∀ (c : G), map (fun x => c • x) μ = μ) → ∀ (c : G), MeasurePreserving fun x => c • x
tfae_7_to_4 :
  (∀ (c : G), MeasurePreserving fun x => c • x) → ∀ (c : G) (s : Set α), ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s
tfae_4_to_5 : (∀ (c : G) (s : Set α), ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s) → ∀ (c : G) (s : Set α), ↑↑μ (c • s) = ↑↑μ s
tfae_5_to_3 :
  (∀ (c : G) (s : Set α), ↑↑μ (c • s) = ↑↑μ s) → ∀ (c : G) (s : Set α), MeasurableSet s → ↑↑μ (c • s) = ↑↑μ s
H : ∀ (c : G) (s : Set α), MeasurableSet s → ↑↑μ (c • s) = ↑↑μ s
c : G
s : Set α
hs : MeasurableSet s
⊢ ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s
[PROOFSTEP]
rw [preimage_smul]
[GOAL]
case tfae_3_to_2
G : Type u
M : Type v
α : Type w
s✝ : Set α
m : MeasurableSpace α
inst✝³ : Group G
inst✝² : MulAction G α
inst✝¹ : MeasurableSpace G
inst✝ : MeasurableSMul G α
c✝ : G
μ : Measure α
tfae_1_iff_2 :
  SMulInvariantMeasure G α μ ↔ ∀ (c : G) (s : Set α), MeasurableSet s → ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s
tfae_1_to_6 : SMulInvariantMeasure G α μ → ∀ (c : G), map (fun x => c • x) μ = μ
tfae_6_to_7 : (∀ (c : G), map (fun x => c • x) μ = μ) → ∀ (c : G), MeasurePreserving fun x => c • x
tfae_7_to_4 :
  (∀ (c : G), MeasurePreserving fun x => c • x) → ∀ (c : G) (s : Set α), ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s
tfae_4_to_5 : (∀ (c : G) (s : Set α), ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s) → ∀ (c : G) (s : Set α), ↑↑μ (c • s) = ↑↑μ s
tfae_5_to_3 :
  (∀ (c : G) (s : Set α), ↑↑μ (c • s) = ↑↑μ s) → ∀ (c : G) (s : Set α), MeasurableSet s → ↑↑μ (c • s) = ↑↑μ s
H : ∀ (c : G) (s : Set α), MeasurableSet s → ↑↑μ (c • s) = ↑↑μ s
c : G
s : Set α
hs : MeasurableSet s
⊢ ↑↑μ (c⁻¹ • s) = ↑↑μ s
[PROOFSTEP]
exact H c⁻¹ s hs
[GOAL]
G : Type u
M : Type v
α : Type w
s : Set α
m : MeasurableSpace α
inst✝³ : Group G
inst✝² : MulAction G α
inst✝¹ : MeasurableSpace G
inst✝ : MeasurableSMul G α
c : G
μ : Measure α
tfae_1_iff_2 :
  SMulInvariantMeasure G α μ ↔ ∀ (c : G) (s : Set α), MeasurableSet s → ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s
tfae_1_to_6 : SMulInvariantMeasure G α μ → ∀ (c : G), map (fun x => c • x) μ = μ
tfae_6_to_7 : (∀ (c : G), map (fun x => c • x) μ = μ) → ∀ (c : G), MeasurePreserving fun x => c • x
tfae_7_to_4 :
  (∀ (c : G), MeasurePreserving fun x => c • x) → ∀ (c : G) (s : Set α), ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s
tfae_4_to_5 : (∀ (c : G) (s : Set α), ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s) → ∀ (c : G) (s : Set α), ↑↑μ (c • s) = ↑↑μ s
tfae_5_to_3 :
  (∀ (c : G) (s : Set α), ↑↑μ (c • s) = ↑↑μ s) → ∀ (c : G) (s : Set α), MeasurableSet s → ↑↑μ (c • s) = ↑↑μ s
tfae_3_to_2 :
  (∀ (c : G) (s : Set α), MeasurableSet s → ↑↑μ (c • s) = ↑↑μ s) →
    ∀ (c : G) (s : Set α), MeasurableSet s → ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s
⊢ List.TFAE
    [SMulInvariantMeasure G α μ, ∀ (c : G) (s : Set α), MeasurableSet s → ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s,
      ∀ (c : G) (s : Set α), MeasurableSet s → ↑↑μ (c • s) = ↑↑μ s,
      ∀ (c : G) (s : Set α), ↑↑μ ((fun x => c • x) ⁻¹' s) = ↑↑μ s, ∀ (c : G) (s : Set α), ↑↑μ (c • s) = ↑↑μ s,
      ∀ (c : G), map (fun x => c • x) μ = μ, ∀ (c : G), MeasurePreserving fun x => c • x]
[PROOFSTEP]
tfae_finish
[GOAL]
G : Type u
M : Type v
α : Type w
s✝ : Set α
m : MeasurableSpace α
inst✝⁴ : Group G
inst✝³ : MulAction G α
inst✝² : MeasurableSpace G
inst✝¹ : MeasurableSMul G α
c✝ : G
μ : Measure α
inst✝ : SMulInvariantMeasure G α μ
s : Set α
hs : NullMeasurableSet s
c : G
⊢ NullMeasurableSet (c • s)
[PROOFSTEP]
simpa only [← preimage_smul_inv] using hs.preimage (measurePreserving_smul _ _).quasiMeasurePreserving
[GOAL]
G : Type u
M : Type v
α : Type w
s✝ : Set α
m : MeasurableSpace α
inst✝⁴ : Group G
inst✝³ : MulAction G α
inst✝² : MeasurableSpace G
inst✝¹ : MeasurableSMul G α
c✝ : G
μ : Measure α
inst✝ : SMulInvariantMeasure G α μ
s : Set α
h : ↑↑μ s = 0
c : G
⊢ ↑↑μ (c • s) = 0
[PROOFSTEP]
rwa [measure_smul]
[GOAL]
G : Type u
M : Type v
α : Type w
s : Set α
m : MeasurableSpace α
inst✝⁷ : Group G
inst✝⁶ : MulAction G α
inst✝⁵ : MeasurableSpace G
inst✝⁴ : MeasurableSMul G α
c : G
μ : Measure α
inst✝³ : SMulInvariantMeasure G α μ
inst✝² : TopologicalSpace α
inst✝¹ : ContinuousConstSMul G α
inst✝ : MulAction.IsMinimal G α
K U : Set α
hK : IsCompact K
hμK : ↑↑μ K ≠ 0
hU : IsOpen U
hne : Set.Nonempty U
t : Finset G
ht : K ⊆ ⋃ (g : G) (_ : g ∈ t), g • U
hμU : ↑↑μ U = 0
x✝¹ : G
x✝ : x✝¹ ∈ ↑t
⊢ ↑↑μ (x✝¹ • U) = 0
[PROOFSTEP]
rwa [measure_smul]
[GOAL]
G : Type u
M : Type v
α : Type w
s : Set α
m : MeasurableSpace α
inst✝⁷ : Group G
inst✝⁶ : MulAction G α
inst✝⁵ : MeasurableSpace G
inst✝⁴ : MeasurableSMul G α
c : G
μ : Measure α
inst✝³ : SMulInvariantMeasure G α μ
inst✝² : TopologicalSpace α
inst✝¹ : ContinuousConstSMul G α
inst✝ : MulAction.IsMinimal G α
K U : Set α
hU : IsOpen U
hne : Set.Nonempty U
hμU : ↑↑μ U ≠ ⊤
x : α
g : G
hg : g • x ∈ U
⊢ ↑↑μ ((fun x x_1 => x • x_1) g ⁻¹' U) ≠ ⊤
[PROOFSTEP]
rwa [measure_preimage_smul]
[GOAL]
G : Type u
M : Type v
α : Type w
s : Set α
m : MeasurableSpace α
inst✝⁸ : Group G
inst✝⁷ : MulAction G α
inst✝⁶ : MeasurableSpace G
inst✝⁵ : MeasurableSMul G α
c : G
μ : Measure α
inst✝⁴ : SMulInvariantMeasure G α μ
inst✝³ : TopologicalSpace α
inst✝² : ContinuousConstSMul G α
inst✝¹ : MulAction.IsMinimal G α
K U : Set α
inst✝ : Regular μ
hμ : μ ≠ 0
hU : IsOpen U
⊢ ↑↑μ U = 0 ↔ U = ∅
[PROOFSTEP]
rw [← not_iff_not, ← Ne.def, ← pos_iff_ne_zero, measure_pos_iff_nonempty_of_smulInvariant G hμ hU,
  nonempty_iff_ne_empty]
[GOAL]
G : Type u
M : Type v
α : Type w
s : Set α
m : MeasurableSpace α
inst✝⁴ : Group G
inst✝³ : MulAction G α
inst✝² : MeasurableSpace G
inst✝¹ : MeasurableSMul G α
c : G
μ : Measure α
inst✝ : SMulInvariantMeasure G α μ
x y : G
hs : x • s =ᶠ[ae μ] s
hy : y ∈ Subgroup.zpowers x
⊢ y • s =ᶠ[ae μ] s
[PROOFSTEP]
obtain ⟨k, rfl⟩ := Subgroup.mem_zpowers_iff.mp hy
[GOAL]
case intro
G : Type u
M : Type v
α : Type w
s : Set α
m : MeasurableSpace α
inst✝⁴ : Group G
inst✝³ : MulAction G α
inst✝² : MeasurableSpace G
inst✝¹ : MeasurableSMul G α
c : G
μ : Measure α
inst✝ : SMulInvariantMeasure G α μ
x : G
hs : x • s =ᶠ[ae μ] s
k : ℤ
hy : x ^ k ∈ Subgroup.zpowers x
⊢ x ^ k • s =ᶠ[ae μ] s
[PROOFSTEP]
let e : α ≃ α := MulAction.toPermHom G α x
[GOAL]
case intro
G : Type u
M : Type v
α : Type w
s : Set α
m : MeasurableSpace α
inst✝⁴ : Group G
inst✝³ : MulAction G α
inst✝² : MeasurableSpace G
inst✝¹ : MeasurableSMul G α
c : G
μ : Measure α
inst✝ : SMulInvariantMeasure G α μ
x : G
hs : x • s =ᶠ[ae μ] s
k : ℤ
hy : x ^ k ∈ Subgroup.zpowers x
e : α ≃ α := ↑(MulAction.toPermHom G α) x
⊢ x ^ k • s =ᶠ[ae μ] s
[PROOFSTEP]
have he : QuasiMeasurePreserving e μ μ := (measurePreserving_smul x μ).quasiMeasurePreserving
[GOAL]
case intro
G : Type u
M : Type v
α : Type w
s : Set α
m : MeasurableSpace α
inst✝⁴ : Group G
inst✝³ : MulAction G α
inst✝² : MeasurableSpace G
inst✝¹ : MeasurableSMul G α
c : G
μ : Measure α
inst✝ : SMulInvariantMeasure G α μ
x : G
hs : x • s =ᶠ[ae μ] s
k : ℤ
hy : x ^ k ∈ Subgroup.zpowers x
e : α ≃ α := ↑(MulAction.toPermHom G α) x
he : QuasiMeasurePreserving ↑e
⊢ x ^ k • s =ᶠ[ae μ] s
[PROOFSTEP]
have he' : QuasiMeasurePreserving e.symm μ μ := (measurePreserving_smul x⁻¹ μ).quasiMeasurePreserving
[GOAL]
case intro
G : Type u
M : Type v
α : Type w
s : Set α
m : MeasurableSpace α
inst✝⁴ : Group G
inst✝³ : MulAction G α
inst✝² : MeasurableSpace G
inst✝¹ : MeasurableSMul G α
c : G
μ : Measure α
inst✝ : SMulInvariantMeasure G α μ
x : G
hs : x • s =ᶠ[ae μ] s
k : ℤ
hy : x ^ k ∈ Subgroup.zpowers x
e : α ≃ α := ↑(MulAction.toPermHom G α) x
he : QuasiMeasurePreserving ↑e
he' : QuasiMeasurePreserving ↑e.symm
⊢ x ^ k • s =ᶠ[ae μ] s
[PROOFSTEP]
have h := he.image_zpow_ae_eq he' k hs
[GOAL]
case intro
G : Type u
M : Type v
α : Type w
s : Set α
m : MeasurableSpace α
inst✝⁴ : Group G
inst✝³ : MulAction G α
inst✝² : MeasurableSpace G
inst✝¹ : MeasurableSMul G α
c : G
μ : Measure α
inst✝ : SMulInvariantMeasure G α μ
x : G
hs : x • s =ᶠ[ae μ] s
k : ℤ
hy : x ^ k ∈ Subgroup.zpowers x
e : α ≃ α := ↑(MulAction.toPermHom G α) x
he : QuasiMeasurePreserving ↑e
he' : QuasiMeasurePreserving ↑e.symm
h : ↑(e ^ k) '' s =ᶠ[ae μ] s
⊢ x ^ k • s =ᶠ[ae μ] s
[PROOFSTEP]
simp only [← MonoidHom.map_zpow] at h
[GOAL]
case intro
G : Type u
M : Type v
α : Type w
s : Set α
m : MeasurableSpace α
inst✝⁴ : Group G
inst✝³ : MulAction G α
inst✝² : MeasurableSpace G
inst✝¹ : MeasurableSMul G α
c : G
μ : Measure α
inst✝ : SMulInvariantMeasure G α μ
x : G
hs : x • s =ᶠ[ae μ] s
k : ℤ
hy : x ^ k ∈ Subgroup.zpowers x
e : α ≃ α := ↑(MulAction.toPermHom G α) x
he : QuasiMeasurePreserving ↑e
he' : QuasiMeasurePreserving ↑e.symm
h : (fun a => ↑(↑(MulAction.toPermHom G α) (x ^ k)) a) '' s =ᶠ[ae μ] s
⊢ x ^ k • s =ᶠ[ae μ] s
[PROOFSTEP]
simpa only [MulAction.toPermHom_apply, MulAction.toPerm_apply, image_smul] using h
[GOAL]
G✝ : Type u
M : Type v
α✝ : Type w
s✝ : Set α✝
m✝ : MeasurableSpace α✝
inst✝⁹ : Group G✝
inst✝⁸ : MulAction G✝ α✝
inst✝⁷ : MeasurableSpace G✝
inst✝⁶ : MeasurableSMul G✝ α✝
c : G✝
μ✝ : Measure α✝
inst✝⁵ : SMulInvariantMeasure G✝ α✝ μ✝
G : Type u
α : Type w
s : Set α
m : MeasurableSpace α
inst✝⁴ : AddGroup G
inst✝³ : AddAction G α
inst✝² : MeasurableSpace G
inst✝¹ : MeasurableVAdd G α
μ : Measure α
inst✝ : VAddInvariantMeasure G α μ
x y : G
hs : x +ᵥ s =ᶠ[ae μ] s
hy : y ∈ AddSubgroup.zmultiples x
⊢ y +ᵥ s =ᶠ[ae μ] s
[PROOFSTEP]
letI : MeasurableSpace (Multiplicative G) := (inferInstanceAs (MeasurableSpace G))
[GOAL]
G✝ : Type u
M : Type v
α✝ : Type w
s✝ : Set α✝
m✝ : MeasurableSpace α✝
inst✝⁹ : Group G✝
inst✝⁸ : MulAction G✝ α✝
inst✝⁷ : MeasurableSpace G✝
inst✝⁶ : MeasurableSMul G✝ α✝
c : G✝
μ✝ : Measure α✝
inst✝⁵ : SMulInvariantMeasure G✝ α✝ μ✝
G : Type u
α : Type w
s : Set α
m : MeasurableSpace α
inst✝⁴ : AddGroup G
inst✝³ : AddAction G α
inst✝² : MeasurableSpace G
inst✝¹ : MeasurableVAdd G α
μ : Measure α
inst✝ : VAddInvariantMeasure G α μ
x y : G
hs : x +ᵥ s =ᶠ[ae μ] s
hy : y ∈ AddSubgroup.zmultiples x
this : MeasurableSpace (Multiplicative G) := inferInstanceAs (MeasurableSpace G)
⊢ y +ᵥ s =ᶠ[ae μ] s
[PROOFSTEP]
letI : SMulInvariantMeasure (Multiplicative G) α μ :=
  ⟨fun g => VAddInvariantMeasure.measure_preimage_vadd (Multiplicative.toAdd g)⟩
[GOAL]
G✝ : Type u
M : Type v
α✝ : Type w
s✝ : Set α✝
m✝ : MeasurableSpace α✝
inst✝⁹ : Group G✝
inst✝⁸ : MulAction G✝ α✝
inst✝⁷ : MeasurableSpace G✝
inst✝⁶ : MeasurableSMul G✝ α✝
c : G✝
μ✝ : Measure α✝
inst✝⁵ : SMulInvariantMeasure G✝ α✝ μ✝
G : Type u
α : Type w
s : Set α
m : MeasurableSpace α
inst✝⁴ : AddGroup G
inst✝³ : AddAction G α
inst✝² : MeasurableSpace G
inst✝¹ : MeasurableVAdd G α
μ : Measure α
inst✝ : VAddInvariantMeasure G α μ
x y : G
hs : x +ᵥ s =ᶠ[ae μ] s
hy : y ∈ AddSubgroup.zmultiples x
this✝ : MeasurableSpace (Multiplicative G) := inferInstanceAs (MeasurableSpace G)
this : SMulInvariantMeasure (Multiplicative G) α μ :=
  { measure_preimage_smul := fun g => VAddInvariantMeasure.measure_preimage_vadd (↑Multiplicative.toAdd g) }
⊢ y +ᵥ s =ᶠ[ae μ] s
[PROOFSTEP]
letI : MeasurableSMul (Multiplicative G) α :=
  { measurable_const_smul := fun g => measurable_const_vadd (Multiplicative.toAdd g)
    measurable_smul_const := fun a =>
      @measurable_vadd_const (Multiplicative G) α (inferInstanceAs (VAdd G α)) _ _
        (inferInstanceAs (MeasurableVAdd G α)) a }
[GOAL]
G✝ : Type u
M : Type v
α✝ : Type w
s✝ : Set α✝
m✝ : MeasurableSpace α✝
inst✝⁹ : Group G✝
inst✝⁸ : MulAction G✝ α✝
inst✝⁷ : MeasurableSpace G✝
inst✝⁶ : MeasurableSMul G✝ α✝
c : G✝
μ✝ : Measure α✝
inst✝⁵ : SMulInvariantMeasure G✝ α✝ μ✝
G : Type u
α : Type w
s : Set α
m : MeasurableSpace α
inst✝⁴ : AddGroup G
inst✝³ : AddAction G α
inst✝² : MeasurableSpace G
inst✝¹ : MeasurableVAdd G α
μ : Measure α
inst✝ : VAddInvariantMeasure G α μ
x y : G
hs : x +ᵥ s =ᶠ[ae μ] s
hy : y ∈ AddSubgroup.zmultiples x
this✝¹ : MeasurableSpace (Multiplicative G) := inferInstanceAs (MeasurableSpace G)
this✝ : SMulInvariantMeasure (Multiplicative G) α μ :=
  { measure_preimage_smul := fun g => VAddInvariantMeasure.measure_preimage_vadd (↑Multiplicative.toAdd g) }
this : MeasurableSMul (Multiplicative G) α :=
  { measurable_const_smul := fun g => measurable_const_vadd (↑Multiplicative.toAdd g),
    measurable_smul_const := fun a => measurable_vadd_const a }
⊢ y +ᵥ s =ᶠ[ae μ] s
[PROOFSTEP]
exact @smul_ae_eq_self_of_mem_zpowers (Multiplicative G) α _ _ _ _ _ _ _ _ _ _ hs hy


[GOAL]
tm : FinTM2
s : List (FinTM2.Γ tm tm.k₀)
k : tm.K
h : k = tm.k₀
⊢ List (FinTM2.Γ tm k)
[PROOFSTEP]
rw [h]
[GOAL]
tm : FinTM2
s : List (FinTM2.Γ tm tm.k₀)
k : tm.K
h : k = tm.k₀
⊢ List (FinTM2.Γ tm tm.k₀)
[PROOFSTEP]
exact s
[GOAL]
tm : FinTM2
s : List (FinTM2.Γ tm tm.k₁)
k : tm.K
h : k = tm.k₁
⊢ List (FinTM2.Γ tm k)
[PROOFSTEP]
rw [h]
[GOAL]
tm : FinTM2
s : List (FinTM2.Γ tm tm.k₁)
k : tm.K
h : k = tm.k₁
⊢ List (FinTM2.Γ tm tm.k₁)
[PROOFSTEP]
exact s
[GOAL]
σ : Type u_1
f : σ → Option σ
a b : σ
c : Option σ
h₁ : EvalsTo f a (some b)
h₂ : EvalsTo f b c
⊢ (flip bind f)^[h₂.steps + h₁.steps] (some a) = c
[PROOFSTEP]
rw [Function.iterate_add_apply, h₁.evals_in_steps, h₂.evals_in_steps]
[GOAL]
α : Type
ea : FinEncoding α
x✝ : α
⊢ { steps := 1,
        evals_in_steps :=
          (_ :
            (flip bind
                    (FinTM2.step
                      { tm := idComputer ea,
                          inputAlphabet :=
                            Equiv.cast
                              (_ :
                                FinTM2.Γ (idComputer ea) (idComputer ea).k₀ =
                                  FinTM2.Γ (idComputer ea) (idComputer ea).k₀),
                          outputAlphabet :=
                            Equiv.cast
                              (_ :
                                FinTM2.Γ (idComputer ea) (idComputer ea).k₁ =
                                  FinTM2.Γ (idComputer ea) (idComputer ea).k₁) }.tm))^[1]
                (some
                  (initList
                    { tm := idComputer ea,
                        inputAlphabet :=
                          Equiv.cast
                            (_ :
                              FinTM2.Γ (idComputer ea) (idComputer ea).k₀ =
                                FinTM2.Γ (idComputer ea) (idComputer ea).k₀),
                        outputAlphabet :=
                          Equiv.cast
                            (_ :
                              FinTM2.Γ (idComputer ea) (idComputer ea).k₁ =
                                FinTM2.Γ (idComputer ea) (idComputer ea).k₁) }.tm
                    (List.map
                      { tm := idComputer ea,
                            inputAlphabet :=
                              Equiv.cast
                                (_ :
                                  FinTM2.Γ (idComputer ea) (idComputer ea).k₀ =
                                    FinTM2.Γ (idComputer ea) (idComputer ea).k₀),
                            outputAlphabet :=
                              Equiv.cast
                                (_ :
                                  FinTM2.Γ (idComputer ea) (idComputer ea).k₁ =
                                    FinTM2.Γ (idComputer ea) (idComputer ea).k₁) }.inputAlphabet.invFun
                      (Encoding.encode ea.toEncoding x✝)))) =
              (flip bind
                    (FinTM2.step
                      { tm := idComputer ea,
                          inputAlphabet :=
                            Equiv.cast
                              (_ :
                                FinTM2.Γ (idComputer ea) (idComputer ea).k₀ =
                                  FinTM2.Γ (idComputer ea) (idComputer ea).k₀),
                          outputAlphabet :=
                            Equiv.cast
                              (_ :
                                FinTM2.Γ (idComputer ea) (idComputer ea).k₁ =
                                  FinTM2.Γ (idComputer ea) (idComputer ea).k₁) }.tm))^[1]
                (some
                  (initList
                    { tm := idComputer ea,
                        inputAlphabet :=
                          Equiv.cast
                            (_ :
                              FinTM2.Γ (idComputer ea) (idComputer ea).k₀ =
                                FinTM2.Γ (idComputer ea) (idComputer ea).k₀),
                        outputAlphabet :=
                          Equiv.cast
                            (_ :
                              FinTM2.Γ (idComputer ea) (idComputer ea).k₁ =
                                FinTM2.Γ (idComputer ea) (idComputer ea).k₁) }.tm
                    (List.map
                      { tm := idComputer ea,
                            inputAlphabet :=
                              Equiv.cast
                                (_ :
                                  FinTM2.Γ (idComputer ea) (idComputer ea).k₀ =
                                    FinTM2.Γ (idComputer ea) (idComputer ea).k₀),
                            outputAlphabet :=
                              Equiv.cast
                                (_ :
                                  FinTM2.Γ (idComputer ea) (idComputer ea).k₁ =
                                    FinTM2.Γ (idComputer ea) (idComputer ea).k₁) }.inputAlphabet.invFun
                      (Encoding.encode ea.toEncoding x✝))))) }.steps ≤
    Polynomial.eval (List.length (Encoding.encode ea.toEncoding x✝)) 1
[PROOFSTEP]
simp only [Polynomial.eval_one]


[GOAL]
J : Type v
inst✝¹ : SmallCategory J
inst✝ : UnivLE.{v, u}
F : J ⥤ Type u
j j' : J
f : j ⟶ j'
⊢ ((Functor.const J).obj (Shrink ↑(Functor.sections F))).map f ≫
      (fun j u => ↑(↑(equivShrink ↑(Functor.sections F)).symm u) j) j' =
    (fun j u => ↑(↑(equivShrink ↑(Functor.sections F)).symm u) j) j ≫ F.map f
[PROOFSTEP]
funext x
[GOAL]
case h
J : Type v
inst✝¹ : SmallCategory J
inst✝ : UnivLE.{v, u}
F : J ⥤ Type u
j j' : J
f : j ⟶ j'
x : ((Functor.const J).obj (Shrink ↑(Functor.sections F))).obj j
⊢ (((Functor.const J).obj (Shrink ↑(Functor.sections F))).map f ≫
        (fun j u => ↑(↑(equivShrink ↑(Functor.sections F)).symm u) j) j')
      x =
    ((fun j u => ↑(↑(equivShrink ↑(Functor.sections F)).symm u) j) j ≫ F.map f) x
[PROOFSTEP]
simp
[GOAL]
J : Type v
inst✝¹ : SmallCategory J
inst✝ : UnivLE.{v, u}
F : J ⥤ Type u
x y : (limitCone F).pt
w : ↑(equivShrink ↑(Functor.sections F)).symm x = ↑(equivShrink ↑(Functor.sections F)).symm y
⊢ x = y
[PROOFSTEP]
aesop
[GOAL]
J : Type v
inst✝¹ : SmallCategory J
inst✝ : UnivLE.{v, u}
F : J ⥤ Type u
x✝¹ : Cone F
x✝ : x✝¹.pt ⟶ (limitCone F).pt
w : ∀ (j : J), x✝ ≫ NatTrans.app (limitCone F).π j = NatTrans.app x✝¹.π j
⊢ x✝ =
    (fun s v =>
        ↑(equivShrink ↑(Functor.sections F))
          { val := fun j => NatTrans.app s.π j v,
            property := (_ : ∀ {j j' : J} (f : j ⟶ j'), (NatTrans.app s.π j ≫ F.map f) v = NatTrans.app s.π j' v) })
      x✝¹
[PROOFSTEP]
ext x j
[GOAL]
case h.w.a.h
J : Type v
inst✝¹ : SmallCategory J
inst✝ : UnivLE.{v, u}
F : J ⥤ Type u
x✝¹ : Cone F
x✝ : x✝¹.pt ⟶ (limitCone F).pt
w : ∀ (j : J), x✝ ≫ NatTrans.app (limitCone F).π j = NatTrans.app x✝¹.π j
x : x✝¹.pt
j : J
⊢ ↑(↑(equivShrink ↑(Functor.sections F)).symm (x✝ x)) j =
    ↑(↑(equivShrink ↑(Functor.sections F)).symm
          ((fun s v =>
              ↑(equivShrink ↑(Functor.sections F))
                { val := fun j => NatTrans.app s.π j v,
                  property :=
                    (_ : ∀ {j j' : J} (f : j ⟶ j'), (NatTrans.app s.π j ≫ F.map f) v = NatTrans.app s.π j' v) })
            x✝¹ x))
      j
[PROOFSTEP]
simpa using congr_fun (w j) x
[GOAL]
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
j j' : J
f : j ⟶ j'
⊢ ((Functor.const J).obj ↑(Functor.sections F)).map f ≫ (fun j u => ↑u j) j' = (fun j u => ↑u j) j ≫ F.map f
[PROOFSTEP]
funext x
[GOAL]
case h
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
j j' : J
f : j ⟶ j'
x : ((Functor.const J).obj ↑(Functor.sections F)).obj j
⊢ (((Functor.const J).obj ↑(Functor.sections F)).map f ≫ (fun j u => ↑u j) j') x = ((fun j u => ↑u j) j ≫ F.map f) x
[PROOFSTEP]
simp
[GOAL]
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
x✝¹ : Cone F
x✝ : x✝¹.pt ⟶ (limitCone F).pt
w : ∀ (j : J), x✝ ≫ NatTrans.app (limitCone F).π j = NatTrans.app x✝¹.π j
⊢ x✝ =
    (fun s v =>
        { val := fun j => NatTrans.app s.π j v,
          property := (_ : ∀ {j j' : J} (f : j ⟶ j'), (NatTrans.app s.π j ≫ F.map f) v = NatTrans.app s.π j' v) })
      x✝¹
[PROOFSTEP]
funext x
[GOAL]
case h
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
x✝¹ : Cone F
x✝ : x✝¹.pt ⟶ (limitCone F).pt
w : ∀ (j : J), x✝ ≫ NatTrans.app (limitCone F).π j = NatTrans.app x✝¹.π j
x : x✝¹.pt
⊢ x✝ x =
    (fun s v =>
        { val := fun j => NatTrans.app s.π j v,
          property := (_ : ∀ {j j' : J} (f : j ⟶ j'), (NatTrans.app s.π j ≫ F.map f) v = NatTrans.app s.π j' v) })
      x✝¹ x
[PROOFSTEP]
apply Subtype.ext
[GOAL]
case h.a
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
x✝¹ : Cone F
x✝ : x✝¹.pt ⟶ (limitCone F).pt
w : ∀ (j : J), x✝ ≫ NatTrans.app (limitCone F).π j = NatTrans.app x✝¹.π j
x : x✝¹.pt
⊢ ↑(x✝ x) =
    ↑((fun s v =>
          { val := fun j => NatTrans.app s.π j v,
            property := (_ : ∀ {j j' : J} (f : j ⟶ j'), (NatTrans.app s.π j ≫ F.map f) v = NatTrans.app s.π j' v) })
        x✝¹ x)
[PROOFSTEP]
funext j
[GOAL]
case h.a.h
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
x✝¹ : Cone F
x✝ : x✝¹.pt ⟶ (limitCone F).pt
w : ∀ (j : J), x✝ ≫ NatTrans.app (limitCone F).π j = NatTrans.app x✝¹.π j
x : x✝¹.pt
j : J
⊢ ↑(x✝ x) j =
    ↑((fun s v =>
            { val := fun j => NatTrans.app s.π j v,
              property := (_ : ∀ {j j' : J} (f : j ⟶ j'), (NatTrans.app s.π j ≫ F.map f) v = NatTrans.app s.π j' v) })
          x✝¹ x)
      j
[PROOFSTEP]
exact congr_fun (w j) x
[GOAL]
J : Type v
inst✝¹ : SmallCategory J
inst✝ : UnivLE.{v, u}
F : J ⥤ Type u
c : Cone F
t : IsLimit c
j : J
x : c.pt
⊢ ↑(↑(isLimitEquivSections t) x) j = NatTrans.app c.π j x
[PROOFSTEP]
simp [isLimitEquivSections, IsLimit.conePointUniqueUpToIso]
[GOAL]
J : Type v
inst✝¹ : SmallCategory J
inst✝ : UnivLE.{v, u}
F : J ⥤ Type u
c : Cone F
t : IsLimit c
x : ↑(Functor.sections F)
j : J
⊢ NatTrans.app c.π j (↑(isLimitEquivSections t).symm x) = ↑x j
[PROOFSTEP]
obtain ⟨x, rfl⟩ := (isLimitEquivSections.{v, u} t).surjective x
[GOAL]
case intro
J : Type v
inst✝¹ : SmallCategory J
inst✝ : UnivLE.{v, u}
F : J ⥤ Type u
c : Cone F
t : IsLimit c
j : J
x : c.pt
⊢ NatTrans.app c.π j (↑(isLimitEquivSections t).symm (↑(isLimitEquivSections t) x)) = ↑(↑(isLimitEquivSections t) x) j
[PROOFSTEP]
simp
[GOAL]
J : Type v
inst✝¹ : SmallCategory J
inst✝ : UnivLE.{v, u}
F : J ⥤ Type u
x : limit F
j : J
⊢ ↑(↑(limitEquivSections F) x) j = limit.π F j x
[PROOFSTEP]
simp [limitEquivSections, isLimitEquivSections, IsLimit.conePointUniqueUpToIso]
[GOAL]
J : Type v
inst✝¹ : SmallCategory J
inst✝ : UnivLE.{v, u}
F : J ⥤ Type u
x : (j : J) → F.obj j
h : ∀ (j j' : J) (f : j ⟶ j'), F.map f (x j) = x j'
j : J
⊢ limit.π F j (mk F x h) = x j
[PROOFSTEP]
dsimp [Limit.mk]
[GOAL]
J : Type v
inst✝¹ : SmallCategory J
inst✝ : UnivLE.{v, u}
F : J ⥤ Type u
x : (j : J) → F.obj j
h : ∀ (j j' : J) (f : j ⟶ j'), F.map f (x j) = x j'
j : J
⊢ limit.π F j
      (↑(limitEquivSections F).symm { val := x, property := (_ : ∀ {j j' : J} (f : j ⟶ j'), F.map f (x j) = x j') }) =
    x j
[PROOFSTEP]
simp
[GOAL]
J : Type v
inst✝¹ : SmallCategory J
inst✝ : UnivLE.{v, u}
F : J ⥤ Type u
x y : limit F
w : ∀ (j : J), limit.π F j x = limit.π F j y
⊢ x = y
[PROOFSTEP]
apply (limitEquivSections.{v, u} F).injective
[GOAL]
case a
J : Type v
inst✝¹ : SmallCategory J
inst✝ : UnivLE.{v, u}
F : J ⥤ Type u
x y : limit F
w : ∀ (j : J), limit.π F j x = limit.π F j y
⊢ ↑(limitEquivSections F) x = ↑(limitEquivSections F) y
[PROOFSTEP]
ext j
[GOAL]
case a.a.h
J : Type v
inst✝¹ : SmallCategory J
inst✝ : UnivLE.{v, u}
F : J ⥤ Type u
x y : limit F
w : ∀ (j : J), limit.π F j x = limit.π F j y
j : J
⊢ ↑(↑(limitEquivSections F) x) j = ↑(↑(limitEquivSections F) y) j
[PROOFSTEP]
simp [w j]
[GOAL]
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
s : Cocone F
x✝² x✝¹ : (j : J) × F.obj j
j : J
x : F.obj j
j' : J
x' : F.obj j'
x✝ : Quot.Rel F { fst := j, snd := x } { fst := j', snd := x' }
f : { fst := j, snd := x }.fst ⟶ { fst := j', snd := x' }.fst
hf : { fst := j', snd := x' }.snd = F.map f { fst := j, snd := x }.snd
⊢ (fun p => NatTrans.app s.ι p.fst p.snd) { fst := j, snd := x } =
    (fun p => NatTrans.app s.ι p.fst p.snd) { fst := j', snd := x' }
[PROOFSTEP]
dsimp at hf
[GOAL]
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
s : Cocone F
x✝² x✝¹ : (j : J) × F.obj j
j : J
x : F.obj j
j' : J
x' : F.obj j'
x✝ : Quot.Rel F { fst := j, snd := x } { fst := j', snd := x' }
f : { fst := j, snd := x }.fst ⟶ { fst := j', snd := x' }.fst
hf : x' = F.map f x
⊢ (fun p => NatTrans.app s.ι p.fst p.snd) { fst := j, snd := x } =
    (fun p => NatTrans.app s.ι p.fst p.snd) { fst := j', snd := x' }
[PROOFSTEP]
rw [hf]
[GOAL]
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
s : Cocone F
x✝² x✝¹ : (j : J) × F.obj j
j : J
x : F.obj j
j' : J
x' : F.obj j'
x✝ : Quot.Rel F { fst := j, snd := x } { fst := j', snd := x' }
f : { fst := j, snd := x }.fst ⟶ { fst := j', snd := x' }.fst
hf : x' = F.map f x
⊢ (fun p => NatTrans.app s.ι p.fst p.snd) { fst := j, snd := x } =
    (fun p => NatTrans.app s.ι p.fst p.snd) { fst := j', snd := F.map f x }
[PROOFSTEP]
exact (congr_fun (Cocone.w s f) x).symm
[GOAL]
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
s : Cocone F
m : (colimitCocone F).pt ⟶ s.pt
hm : ∀ (j : J), NatTrans.app (colimitCocone F).ι j ≫ m = NatTrans.app s.ι j
⊢ m =
    (fun s =>
        Quot.lift (fun p => NatTrans.app s.ι p.fst p.snd)
          (_ :
            ∀ (x x_1 : (j : J) × F.obj j),
              Quot.Rel F x x_1 →
                (fun p => NatTrans.app s.ι p.fst p.snd) x = (fun p => NatTrans.app s.ι p.fst p.snd) x_1))
      s
[PROOFSTEP]
funext x
[GOAL]
case h
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
s : Cocone F
m : (colimitCocone F).pt ⟶ s.pt
hm : ∀ (j : J), NatTrans.app (colimitCocone F).ι j ≫ m = NatTrans.app s.ι j
x : (colimitCocone F).pt
⊢ m x =
    (fun s =>
        Quot.lift (fun p => NatTrans.app s.ι p.fst p.snd)
          (_ :
            ∀ (x x_1 : (j : J) × F.obj j),
              Quot.Rel F x x_1 →
                (fun p => NatTrans.app s.ι p.fst p.snd) x = (fun p => NatTrans.app s.ι p.fst p.snd) x_1))
      s x
[PROOFSTEP]
induction' x using Quot.ind with x
[GOAL]
case h.mk
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
s : Cocone F
m : (colimitCocone F).pt ⟶ s.pt
hm : ∀ (j : J), NatTrans.app (colimitCocone F).ι j ≫ m = NatTrans.app s.ι j
x : (j : J) × F.obj j
⊢ m (Quot.mk (Quot.Rel F) x) =
    (fun s =>
        Quot.lift (fun p => NatTrans.app s.ι p.fst p.snd)
          (_ :
            ∀ (x x_1 : (j : J) × F.obj j),
              Quot.Rel F x x_1 →
                (fun p => NatTrans.app s.ι p.fst p.snd) x = (fun p => NatTrans.app s.ι p.fst p.snd) x_1))
      s (Quot.mk (Quot.Rel F) x)
[PROOFSTEP]
exact congr_fun (hm x.1) x.2
[GOAL]
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
j : J
x : F.obj j
⊢ ↑(colimitEquivQuot F) (colimit.ι F j x) = Quot.mk (Quot.Rel F) { fst := j, snd := x }
[PROOFSTEP]
apply (colimitEquivQuot F).symm.injective
[GOAL]
case a
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
j : J
x : F.obj j
⊢ ↑(colimitEquivQuot F).symm (↑(colimitEquivQuot F) (colimit.ι F j x)) =
    ↑(colimitEquivQuot F).symm (Quot.mk (Quot.Rel F) { fst := j, snd := x })
[PROOFSTEP]
simp
[GOAL]
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
j j' : J
x : F.obj j
x' : F.obj j'
f : j ⟶ j'
w : F.map f x = x'
⊢ colimit.ι F j x = colimit.ι F j' x'
[PROOFSTEP]
rw [← w, Colimit.w_apply.{v, u}]
[GOAL]
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
j j' : J
x : F.obj j
x' : F.obj j'
j'' : J
f : j ⟶ j''
f' : j' ⟶ j''
w : F.map f x = F.map f' x'
⊢ colimit.ι F j x = colimit.ι F j' x'
[PROOFSTEP]
rw [← colimit.w _ f, ← colimit.w _ f']
[GOAL]
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
j j' : J
x : F.obj j
x' : F.obj j'
j'' : J
f : j ⟶ j''
f' : j' ⟶ j''
w : F.map f x = F.map f' x'
⊢ (F.map f ≫ colimit.ι F j'') x = (F.map f' ≫ colimit.ι F j'') x'
[PROOFSTEP]
rw [types_comp_apply, types_comp_apply, w]
[GOAL]
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
j j' : J
x : F.obj j
x' : F.obj j'
w : colimit.ι F j x = colimit.ι F j' x'
⊢ EqvGen (Quot.Rel F) { fst := j, snd := x } { fst := j', snd := x' }
[PROOFSTEP]
apply Quot.eq.1
[GOAL]
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
j j' : J
x : F.obj j
x' : F.obj j'
w : colimit.ι F j x = colimit.ι F j' x'
⊢ Quot.mk (Quot.Rel F) { fst := j, snd := x } = Quot.mk (Quot.Rel F) { fst := j', snd := x' }
[PROOFSTEP]
simpa using congr_arg (colimitEquivQuot.{v, u} F) w
[GOAL]
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
t : Cocone F
h : IsColimit t
x : t.pt
⊢ ∃ j y, NatTrans.app t.ι j y = x
[PROOFSTEP]
suffices (fun x : t.pt => ULift.up (∃ j y, t.ι.app j y = x)) = fun _ => ULift.up.{max v u} True
  by
  have := congr_fun this x
  simpa using congr_arg ULift.down this
[GOAL]
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
t : Cocone F
h : IsColimit t
x : t.pt
this : (fun x => { down := ∃ j y, NatTrans.app t.ι j y = x }) = fun x => { down := True }
⊢ ∃ j y, NatTrans.app t.ι j y = x
[PROOFSTEP]
have := congr_fun this x
[GOAL]
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
t : Cocone F
h : IsColimit t
x : t.pt
this✝ : (fun x => { down := ∃ j y, NatTrans.app t.ι j y = x }) = fun x => { down := True }
this : { down := ∃ j y, NatTrans.app t.ι j y = x } = { down := True }
⊢ ∃ j y, NatTrans.app t.ι j y = x
[PROOFSTEP]
simpa using congr_arg ULift.down this
[GOAL]
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
t : Cocone F
h : IsColimit t
x : t.pt
⊢ (fun x => { down := ∃ j y, NatTrans.app t.ι j y = x }) = fun x => { down := True }
[PROOFSTEP]
refine' h.hom_ext _
[GOAL]
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
t : Cocone F
h : IsColimit t
x : t.pt
⊢ ∀ (j : J),
    (NatTrans.app t.ι j ≫ fun x => { down := ∃ j y, NatTrans.app t.ι j y = x }) =
      NatTrans.app t.ι j ≫ fun x => { down := True }
[PROOFSTEP]
intro j
[GOAL]
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
t : Cocone F
h : IsColimit t
x : t.pt
j : J
⊢ (NatTrans.app t.ι j ≫ fun x => { down := ∃ j y, NatTrans.app t.ι j y = x }) =
    NatTrans.app t.ι j ≫ fun x => { down := True }
[PROOFSTEP]
funext y
[GOAL]
case h
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
t : Cocone F
h : IsColimit t
x : t.pt
j : J
y : F.obj j
⊢ (NatTrans.app t.ι j ≫ fun x => { down := ∃ j y, NatTrans.app t.ι j y = x }) y =
    (NatTrans.app t.ι j ≫ fun x => { down := True }) y
[PROOFSTEP]
simp only [Functor.const_obj_obj, types_comp_apply, ULift.up_inj, eq_iff_iff, iff_true]
[GOAL]
case h
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
t : Cocone F
h : IsColimit t
x : t.pt
j : J
y : F.obj j
⊢ ∃ j_1 y_1, NatTrans.app t.ι j_1 y_1 = NatTrans.app t.ι j y
[PROOFSTEP]
exact ⟨j, y, rfl⟩
[GOAL]
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
x : colimit F
⊢ ∃ j y, colimit.ι F j y = x
[PROOFSTEP]
exact jointly_surjective.{v, u} F (colimit.isColimit F) x
[GOAL]
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
x y : (j : J) × F.obj j
x✝ : Quot.Rel F x y
f : x.fst ⟶ y.fst
h : y.snd = F.map f x.snd
⊢ F.map f x.snd = F.map (𝟙 y.fst) y.snd
[PROOFSTEP]
rw [← h, FunctorToTypes.map_id_apply]
[GOAL]
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
x y : (j : J) × F.obj j
x✝ : FilteredColimit.Rel F x y
k : J
f : x.fst ⟶ k
g : y.fst ⟶ k
h : F.map f x.snd = F.map g y.snd
⊢ EqvGen (Quot.Rel F) x y
[PROOFSTEP]
refine' EqvGen.trans _ ⟨k, F.map f x.2⟩ _ _ _
[GOAL]
case refine'_1
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
x y : (j : J) × F.obj j
x✝ : FilteredColimit.Rel F x y
k : J
f : x.fst ⟶ k
g : y.fst ⟶ k
h : F.map f x.snd = F.map g y.snd
⊢ EqvGen (Quot.Rel F) x { fst := k, snd := F.map f x.snd }
[PROOFSTEP]
exact (EqvGen.rel _ _ ⟨f, rfl⟩)
[GOAL]
case refine'_2
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
x y : (j : J) × F.obj j
x✝ : FilteredColimit.Rel F x y
k : J
f : x.fst ⟶ k
g : y.fst ⟶ k
h : F.map f x.snd = F.map g y.snd
⊢ EqvGen (Quot.Rel F) { fst := k, snd := F.map f x.snd } y
[PROOFSTEP]
exact (EqvGen.symm _ _ (EqvGen.rel _ _ ⟨g, h⟩))
[GOAL]
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
t : Cocone F
hsurj : ∀ (x : t.pt), ∃ i xi, x = NatTrans.app t.ι i xi
hinj :
  ∀ (i j : J) (xi : F.obj i) (xj : F.obj j),
    NatTrans.app t.ι i xi = NatTrans.app t.ι j xj → ∃ k f g, F.map f xi = F.map g xj
⊢ IsColimit t
[PROOFSTEP]
apply IsColimit.ofIsoColimit (colimit.isColimit F)
[GOAL]
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
t : Cocone F
hsurj : ∀ (x : t.pt), ∃ i xi, x = NatTrans.app t.ι i xi
hinj :
  ∀ (i j : J) (xi : F.obj i) (xj : F.obj j),
    NatTrans.app t.ι i xi = NatTrans.app t.ι j xj → ∃ k f g, F.map f xi = F.map g xj
⊢ colimit.cocone F ≅ t
[PROOFSTEP]
refine' Cocones.ext (Equiv.toIso (Equiv.ofBijective _ _)) _
[GOAL]
case refine'_1
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
t : Cocone F
hsurj : ∀ (x : t.pt), ∃ i xi, x = NatTrans.app t.ι i xi
hinj :
  ∀ (i j : J) (xi : F.obj i) (xj : F.obj j),
    NatTrans.app t.ι i xi = NatTrans.app t.ι j xj → ∃ k f g, F.map f xi = F.map g xj
⊢ (colimit.cocone F).pt → t.pt
[PROOFSTEP]
exact colimit.desc F t
[GOAL]
case refine'_2
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
t : Cocone F
hsurj : ∀ (x : t.pt), ∃ i xi, x = NatTrans.app t.ι i xi
hinj :
  ∀ (i j : J) (xi : F.obj i) (xj : F.obj j),
    NatTrans.app t.ι i xi = NatTrans.app t.ι j xj → ∃ k f g, F.map f xi = F.map g xj
⊢ Function.Bijective (colimit.desc F t)
[PROOFSTEP]
constructor
[GOAL]
case refine'_2.left
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
t : Cocone F
hsurj : ∀ (x : t.pt), ∃ i xi, x = NatTrans.app t.ι i xi
hinj :
  ∀ (i j : J) (xi : F.obj i) (xj : F.obj j),
    NatTrans.app t.ι i xi = NatTrans.app t.ι j xj → ∃ k f g, F.map f xi = F.map g xj
⊢ Function.Injective (colimit.desc F t)
[PROOFSTEP]
show Function.Injective _
[GOAL]
case refine'_2.left
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
t : Cocone F
hsurj : ∀ (x : t.pt), ∃ i xi, x = NatTrans.app t.ι i xi
hinj :
  ∀ (i j : J) (xi : F.obj i) (xj : F.obj j),
    NatTrans.app t.ι i xi = NatTrans.app t.ι j xj → ∃ k f g, F.map f xi = F.map g xj
⊢ Function.Injective (colimit.desc F t)
[PROOFSTEP]
intro a b h
[GOAL]
case refine'_2.left
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
t : Cocone F
hsurj : ∀ (x : t.pt), ∃ i xi, x = NatTrans.app t.ι i xi
hinj :
  ∀ (i j : J) (xi : F.obj i) (xj : F.obj j),
    NatTrans.app t.ι i xi = NatTrans.app t.ι j xj → ∃ k f g, F.map f xi = F.map g xj
a b : (colimit.cocone F).pt
h : colimit.desc F t a = colimit.desc F t b
⊢ a = b
[PROOFSTEP]
rcases jointly_surjective.{v, u} F (colimit.isColimit F) a with ⟨i, xi, rfl⟩
[GOAL]
case refine'_2.left.intro.intro
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
t : Cocone F
hsurj : ∀ (x : t.pt), ∃ i xi, x = NatTrans.app t.ι i xi
hinj :
  ∀ (i j : J) (xi : F.obj i) (xj : F.obj j),
    NatTrans.app t.ι i xi = NatTrans.app t.ι j xj → ∃ k f g, F.map f xi = F.map g xj
b : (colimit.cocone F).pt
i : J
xi : F.obj i
h : colimit.desc F t (NatTrans.app (colimit.cocone F).ι i xi) = colimit.desc F t b
⊢ NatTrans.app (colimit.cocone F).ι i xi = b
[PROOFSTEP]
rcases jointly_surjective.{v, u} F (colimit.isColimit F) b with ⟨j, xj, rfl⟩
[GOAL]
case refine'_2.left.intro.intro.intro.intro
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
t : Cocone F
hsurj : ∀ (x : t.pt), ∃ i xi, x = NatTrans.app t.ι i xi
hinj :
  ∀ (i j : J) (xi : F.obj i) (xj : F.obj j),
    NatTrans.app t.ι i xi = NatTrans.app t.ι j xj → ∃ k f g, F.map f xi = F.map g xj
i : J
xi : F.obj i
j : J
xj : F.obj j
h :
  colimit.desc F t (NatTrans.app (colimit.cocone F).ι i xi) = colimit.desc F t (NatTrans.app (colimit.cocone F).ι j xj)
⊢ NatTrans.app (colimit.cocone F).ι i xi = NatTrans.app (colimit.cocone F).ι j xj
[PROOFSTEP]
replace h : (colimit.ι F i ≫ colimit.desc F t) xi = (colimit.ι F j ≫ colimit.desc F t) xj := h
[GOAL]
case refine'_2.left.intro.intro.intro.intro
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
t : Cocone F
hsurj : ∀ (x : t.pt), ∃ i xi, x = NatTrans.app t.ι i xi
hinj :
  ∀ (i j : J) (xi : F.obj i) (xj : F.obj j),
    NatTrans.app t.ι i xi = NatTrans.app t.ι j xj → ∃ k f g, F.map f xi = F.map g xj
i : J
xi : F.obj i
j : J
xj : F.obj j
h : (colimit.ι F i ≫ colimit.desc F t) xi = (colimit.ι F j ≫ colimit.desc F t) xj
⊢ NatTrans.app (colimit.cocone F).ι i xi = NatTrans.app (colimit.cocone F).ι j xj
[PROOFSTEP]
rw [colimit.ι_desc, colimit.ι_desc] at h
[GOAL]
case refine'_2.left.intro.intro.intro.intro
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
t : Cocone F
hsurj : ∀ (x : t.pt), ∃ i xi, x = NatTrans.app t.ι i xi
hinj :
  ∀ (i j : J) (xi : F.obj i) (xj : F.obj j),
    NatTrans.app t.ι i xi = NatTrans.app t.ι j xj → ∃ k f g, F.map f xi = F.map g xj
i : J
xi : F.obj i
j : J
xj : F.obj j
h : NatTrans.app t.ι i xi = NatTrans.app t.ι j xj
⊢ NatTrans.app (colimit.cocone F).ι i xi = NatTrans.app (colimit.cocone F).ι j xj
[PROOFSTEP]
rcases hinj i j xi xj h with ⟨k, f, g, h'⟩
[GOAL]
case refine'_2.left.intro.intro.intro.intro.intro.intro.intro
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
t : Cocone F
hsurj : ∀ (x : t.pt), ∃ i xi, x = NatTrans.app t.ι i xi
hinj :
  ∀ (i j : J) (xi : F.obj i) (xj : F.obj j),
    NatTrans.app t.ι i xi = NatTrans.app t.ι j xj → ∃ k f g, F.map f xi = F.map g xj
i : J
xi : F.obj i
j : J
xj : F.obj j
h : NatTrans.app t.ι i xi = NatTrans.app t.ι j xj
k : J
f : i ⟶ k
g : j ⟶ k
h' : F.map f xi = F.map g xj
⊢ NatTrans.app (colimit.cocone F).ι i xi = NatTrans.app (colimit.cocone F).ι j xj
[PROOFSTEP]
change colimit.ι F i xi = colimit.ι F j xj
[GOAL]
case refine'_2.left.intro.intro.intro.intro.intro.intro.intro
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
t : Cocone F
hsurj : ∀ (x : t.pt), ∃ i xi, x = NatTrans.app t.ι i xi
hinj :
  ∀ (i j : J) (xi : F.obj i) (xj : F.obj j),
    NatTrans.app t.ι i xi = NatTrans.app t.ι j xj → ∃ k f g, F.map f xi = F.map g xj
i : J
xi : F.obj i
j : J
xj : F.obj j
h : NatTrans.app t.ι i xi = NatTrans.app t.ι j xj
k : J
f : i ⟶ k
g : j ⟶ k
h' : F.map f xi = F.map g xj
⊢ colimit.ι F i xi = colimit.ι F j xj
[PROOFSTEP]
rw [← colimit.w F f, ← colimit.w F g]
[GOAL]
case refine'_2.left.intro.intro.intro.intro.intro.intro.intro
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
t : Cocone F
hsurj : ∀ (x : t.pt), ∃ i xi, x = NatTrans.app t.ι i xi
hinj :
  ∀ (i j : J) (xi : F.obj i) (xj : F.obj j),
    NatTrans.app t.ι i xi = NatTrans.app t.ι j xj → ∃ k f g, F.map f xi = F.map g xj
i : J
xi : F.obj i
j : J
xj : F.obj j
h : NatTrans.app t.ι i xi = NatTrans.app t.ι j xj
k : J
f : i ⟶ k
g : j ⟶ k
h' : F.map f xi = F.map g xj
⊢ (F.map f ≫ colimit.ι F k) xi = (F.map g ≫ colimit.ι F k) xj
[PROOFSTEP]
change colimit.ι F k (F.map f xi) = colimit.ι F k (F.map g xj)
[GOAL]
case refine'_2.left.intro.intro.intro.intro.intro.intro.intro
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
t : Cocone F
hsurj : ∀ (x : t.pt), ∃ i xi, x = NatTrans.app t.ι i xi
hinj :
  ∀ (i j : J) (xi : F.obj i) (xj : F.obj j),
    NatTrans.app t.ι i xi = NatTrans.app t.ι j xj → ∃ k f g, F.map f xi = F.map g xj
i : J
xi : F.obj i
j : J
xj : F.obj j
h : NatTrans.app t.ι i xi = NatTrans.app t.ι j xj
k : J
f : i ⟶ k
g : j ⟶ k
h' : F.map f xi = F.map g xj
⊢ colimit.ι F k (F.map f xi) = colimit.ι F k (F.map g xj)
[PROOFSTEP]
rw [h']
[GOAL]
case refine'_2.right
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
t : Cocone F
hsurj : ∀ (x : t.pt), ∃ i xi, x = NatTrans.app t.ι i xi
hinj :
  ∀ (i j : J) (xi : F.obj i) (xj : F.obj j),
    NatTrans.app t.ι i xi = NatTrans.app t.ι j xj → ∃ k f g, F.map f xi = F.map g xj
⊢ Function.Surjective (colimit.desc F t)
[PROOFSTEP]
show Function.Surjective _
[GOAL]
case refine'_2.right
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
t : Cocone F
hsurj : ∀ (x : t.pt), ∃ i xi, x = NatTrans.app t.ι i xi
hinj :
  ∀ (i j : J) (xi : F.obj i) (xj : F.obj j),
    NatTrans.app t.ι i xi = NatTrans.app t.ι j xj → ∃ k f g, F.map f xi = F.map g xj
⊢ Function.Surjective (colimit.desc F t)
[PROOFSTEP]
intro x
[GOAL]
case refine'_2.right
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
t : Cocone F
hsurj : ∀ (x : t.pt), ∃ i xi, x = NatTrans.app t.ι i xi
hinj :
  ∀ (i j : J) (xi : F.obj i) (xj : F.obj j),
    NatTrans.app t.ι i xi = NatTrans.app t.ι j xj → ∃ k f g, F.map f xi = F.map g xj
x : t.pt
⊢ ∃ a, colimit.desc F t a = x
[PROOFSTEP]
rcases hsurj x with ⟨i, xi, rfl⟩
[GOAL]
case refine'_2.right.intro.intro
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
t : Cocone F
hsurj : ∀ (x : t.pt), ∃ i xi, x = NatTrans.app t.ι i xi
hinj :
  ∀ (i j : J) (xi : F.obj i) (xj : F.obj j),
    NatTrans.app t.ι i xi = NatTrans.app t.ι j xj → ∃ k f g, F.map f xi = F.map g xj
i : J
xi : F.obj i
⊢ ∃ a, colimit.desc F t a = NatTrans.app t.ι i xi
[PROOFSTEP]
use colimit.ι F i xi
[GOAL]
case h
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
t : Cocone F
hsurj : ∀ (x : t.pt), ∃ i xi, x = NatTrans.app t.ι i xi
hinj :
  ∀ (i j : J) (xi : F.obj i) (xj : F.obj j),
    NatTrans.app t.ι i xi = NatTrans.app t.ι j xj → ∃ k f g, F.map f xi = F.map g xj
i : J
xi : F.obj i
⊢ colimit.desc F t (colimit.ι F i xi) = NatTrans.app t.ι i xi
[PROOFSTEP]
apply Colimit.ι_desc_apply.{v, u}
[GOAL]
case refine'_3
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
t : Cocone F
hsurj : ∀ (x : t.pt), ∃ i xi, x = NatTrans.app t.ι i xi
hinj :
  ∀ (i j : J) (xi : F.obj i) (xj : F.obj j),
    NatTrans.app t.ι i xi = NatTrans.app t.ι j xj → ∃ k f g, F.map f xi = F.map g xj
⊢ ∀ (j : J),
    NatTrans.app (colimit.cocone F).ι j ≫
        (Equiv.toIso
            (Equiv.ofBijective (colimit.desc F t)
              (_ : Function.Injective (colimit.desc F t) ∧ Function.Surjective (colimit.desc F t)))).hom =
      NatTrans.app t.ι j
[PROOFSTEP]
intro j
[GOAL]
case refine'_3
J : Type v
inst✝ : SmallCategory J
F : J ⥤ TypeMax
t : Cocone F
hsurj : ∀ (x : t.pt), ∃ i xi, x = NatTrans.app t.ι i xi
hinj :
  ∀ (i j : J) (xi : F.obj i) (xj : F.obj j),
    NatTrans.app t.ι i xi = NatTrans.app t.ι j xj → ∃ k f g, F.map f xi = F.map g xj
j : J
⊢ NatTrans.app (colimit.cocone F).ι j ≫
      (Equiv.toIso
          (Equiv.ofBijective (colimit.desc F t)
            (_ : Function.Injective (colimit.desc F t) ∧ Function.Surjective (colimit.desc F t)))).hom =
    NatTrans.app t.ι j
[PROOFSTEP]
apply colimit.ι_desc
[GOAL]
J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ TypeMax
inst✝ : IsFilteredOrEmpty J
x y z : (j : J) × F.obj j
x✝¹ : FilteredColimit.Rel F x y
x✝ : FilteredColimit.Rel F y z
k : J
f : x.fst ⟶ k
g : y.fst ⟶ k
h : F.map f x.snd = F.map g y.snd
k' : J
f' : y.fst ⟶ k'
g' : z.fst ⟶ k'
h' : F.map f' y.snd = F.map g' z.snd
l : J
fl : k ⟶ l
gl : k' ⟶ l
h✝ : True
m : J
n : l ⟶ m
hn : (g ≫ fl) ≫ n = (f' ≫ gl) ≫ n
⊢ F.map (f ≫ fl ≫ n) x.snd = F.map (fl ≫ n) (F.map f x.snd)
[PROOFSTEP]
simp
[GOAL]
J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ TypeMax
inst✝ : IsFilteredOrEmpty J
x y z : (j : J) × F.obj j
x✝¹ : FilteredColimit.Rel F x y
x✝ : FilteredColimit.Rel F y z
k : J
f : x.fst ⟶ k
g : y.fst ⟶ k
h : F.map f x.snd = F.map g y.snd
k' : J
f' : y.fst ⟶ k'
g' : z.fst ⟶ k'
h' : F.map f' y.snd = F.map g' z.snd
l : J
fl : k ⟶ l
gl : k' ⟶ l
h✝ : True
m : J
n : l ⟶ m
hn : (g ≫ fl) ≫ n = (f' ≫ gl) ≫ n
⊢ F.map (fl ≫ n) (F.map f x.snd) = F.map (fl ≫ n) (F.map g y.snd)
[PROOFSTEP]
rw [h]
[GOAL]
J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ TypeMax
inst✝ : IsFilteredOrEmpty J
x y z : (j : J) × F.obj j
x✝¹ : FilteredColimit.Rel F x y
x✝ : FilteredColimit.Rel F y z
k : J
f : x.fst ⟶ k
g : y.fst ⟶ k
h : F.map f x.snd = F.map g y.snd
k' : J
f' : y.fst ⟶ k'
g' : z.fst ⟶ k'
h' : F.map f' y.snd = F.map g' z.snd
l : J
fl : k ⟶ l
gl : k' ⟶ l
h✝ : True
m : J
n : l ⟶ m
hn : (g ≫ fl) ≫ n = (f' ≫ gl) ≫ n
⊢ F.map (fl ≫ n) (F.map g y.snd) = F.map ((g ≫ fl) ≫ n) y.snd
[PROOFSTEP]
simp
[GOAL]
J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ TypeMax
inst✝ : IsFilteredOrEmpty J
x y z : (j : J) × F.obj j
x✝¹ : FilteredColimit.Rel F x y
x✝ : FilteredColimit.Rel F y z
k : J
f : x.fst ⟶ k
g : y.fst ⟶ k
h : F.map f x.snd = F.map g y.snd
k' : J
f' : y.fst ⟶ k'
g' : z.fst ⟶ k'
h' : F.map f' y.snd = F.map g' z.snd
l : J
fl : k ⟶ l
gl : k' ⟶ l
h✝ : True
m : J
n : l ⟶ m
hn : (g ≫ fl) ≫ n = (f' ≫ gl) ≫ n
⊢ F.map ((g ≫ fl) ≫ n) y.snd = F.map ((f' ≫ gl) ≫ n) y.snd
[PROOFSTEP]
rw [hn]
[GOAL]
J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ TypeMax
inst✝ : IsFilteredOrEmpty J
x y z : (j : J) × F.obj j
x✝¹ : FilteredColimit.Rel F x y
x✝ : FilteredColimit.Rel F y z
k : J
f : x.fst ⟶ k
g : y.fst ⟶ k
h : F.map f x.snd = F.map g y.snd
k' : J
f' : y.fst ⟶ k'
g' : z.fst ⟶ k'
h' : F.map f' y.snd = F.map g' z.snd
l : J
fl : k ⟶ l
gl : k' ⟶ l
h✝ : True
m : J
n : l ⟶ m
hn : (g ≫ fl) ≫ n = (f' ≫ gl) ≫ n
⊢ F.map ((f' ≫ gl) ≫ n) y.snd = F.map (gl ≫ n) (F.map f' y.snd)
[PROOFSTEP]
simp
[GOAL]
J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ TypeMax
inst✝ : IsFilteredOrEmpty J
x y z : (j : J) × F.obj j
x✝¹ : FilteredColimit.Rel F x y
x✝ : FilteredColimit.Rel F y z
k : J
f : x.fst ⟶ k
g : y.fst ⟶ k
h : F.map f x.snd = F.map g y.snd
k' : J
f' : y.fst ⟶ k'
g' : z.fst ⟶ k'
h' : F.map f' y.snd = F.map g' z.snd
l : J
fl : k ⟶ l
gl : k' ⟶ l
h✝ : True
m : J
n : l ⟶ m
hn : (g ≫ fl) ≫ n = (f' ≫ gl) ≫ n
⊢ F.map (gl ≫ n) (F.map f' y.snd) = F.map (gl ≫ n) (F.map g' z.snd)
[PROOFSTEP]
rw [h']
[GOAL]
J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ TypeMax
inst✝ : IsFilteredOrEmpty J
x y z : (j : J) × F.obj j
x✝¹ : FilteredColimit.Rel F x y
x✝ : FilteredColimit.Rel F y z
k : J
f : x.fst ⟶ k
g : y.fst ⟶ k
h : F.map f x.snd = F.map g y.snd
k' : J
f' : y.fst ⟶ k'
g' : z.fst ⟶ k'
h' : F.map f' y.snd = F.map g' z.snd
l : J
fl : k ⟶ l
gl : k' ⟶ l
h✝ : True
m : J
n : l ⟶ m
hn : (g ≫ fl) ≫ n = (f' ≫ gl) ≫ n
⊢ F.map (gl ≫ n) (F.map g' z.snd) = F.map (g' ≫ gl ≫ n) z.snd
[PROOFSTEP]
simp
[GOAL]
J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ TypeMax
inst✝ : IsFilteredOrEmpty J
⊢ FilteredColimit.Rel F = EqvGen (Quot.Rel F)
[PROOFSTEP]
ext ⟨j, x⟩ ⟨j', y⟩
[GOAL]
case h.mk.h.mk.a
J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ TypeMax
inst✝ : IsFilteredOrEmpty J
j : J
x : F.obj j
j' : J
y : F.obj j'
⊢ FilteredColimit.Rel F { fst := j, snd := x } { fst := j', snd := y } ↔
    EqvGen (Quot.Rel F) { fst := j, snd := x } { fst := j', snd := y }
[PROOFSTEP]
constructor
[GOAL]
case h.mk.h.mk.a.mp
J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ TypeMax
inst✝ : IsFilteredOrEmpty J
j : J
x : F.obj j
j' : J
y : F.obj j'
⊢ FilteredColimit.Rel F { fst := j, snd := x } { fst := j', snd := y } →
    EqvGen (Quot.Rel F) { fst := j, snd := x } { fst := j', snd := y }
[PROOFSTEP]
apply eqvGen_quot_rel_of_rel
[GOAL]
case h.mk.h.mk.a.mpr
J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ TypeMax
inst✝ : IsFilteredOrEmpty J
j : J
x : F.obj j
j' : J
y : F.obj j'
⊢ EqvGen (Quot.Rel F) { fst := j, snd := x } { fst := j', snd := y } →
    FilteredColimit.Rel F { fst := j, snd := x } { fst := j', snd := y }
[PROOFSTEP]
rw [← (FilteredColimit.rel_equiv F).eqvGen_iff]
[GOAL]
case h.mk.h.mk.a.mpr
J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ TypeMax
inst✝ : IsFilteredOrEmpty J
j : J
x : F.obj j
j' : J
y : F.obj j'
⊢ EqvGen (Quot.Rel F) { fst := j, snd := x } { fst := j', snd := y } →
    EqvGen (FilteredColimit.Rel F) { fst := j, snd := x } { fst := j', snd := y }
[PROOFSTEP]
exact EqvGen.mono (rel_of_quot_rel F)
[GOAL]
J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ TypeMax
inst✝ : IsFilteredOrEmpty J
i j : J
xi : F.obj i
xj : F.obj j
⊢ NatTrans.app (colimitCocone F).ι i xi = NatTrans.app (colimitCocone F).ι j xj ↔
    FilteredColimit.Rel F { fst := i, snd := xi } { fst := j, snd := xj }
[PROOFSTEP]
change Quot.mk _ _ = Quot.mk _ _ ↔ _
[GOAL]
J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ TypeMax
inst✝ : IsFilteredOrEmpty J
i j : J
xi : F.obj i
xj : F.obj j
⊢ Quot.mk (Quot.Rel F) { fst := i, snd := xi } = Quot.mk (Quot.Rel F) { fst := j, snd := xj } ↔
    FilteredColimit.Rel F { fst := i, snd := xi } { fst := j, snd := xj }
[PROOFSTEP]
rw [Quot.eq, FilteredColimit.rel_eq_eqvGen_quot_rel]
[GOAL]
J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ TypeMax
inst✝ : IsFilteredOrEmpty J
t : Cocone F
ht : IsColimit t
i j : J
xi : F.obj i
xj : F.obj j
⊢ NatTrans.app t.ι i xi = NatTrans.app t.ι j xj ↔ ∃ k f g, F.map f xi = F.map g xj
[PROOFSTEP]
let t' := colimitCocone.{v, u} F
[GOAL]
J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ TypeMax
inst✝ : IsFilteredOrEmpty J
t : Cocone F
ht : IsColimit t
i j : J
xi : F.obj i
xj : F.obj j
t' : Cocone F := colimitCocone F
⊢ NatTrans.app t.ι i xi = NatTrans.app t.ι j xj ↔ ∃ k f g, F.map f xi = F.map g xj
[PROOFSTEP]
let e : t' ≅ t := IsColimit.uniqueUpToIso (colimitCoconeIsColimit F) ht
[GOAL]
J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ TypeMax
inst✝ : IsFilteredOrEmpty J
t : Cocone F
ht : IsColimit t
i j : J
xi : F.obj i
xj : F.obj j
t' : Cocone F := colimitCocone F
e : t' ≅ t := IsColimit.uniqueUpToIso (colimitCoconeIsColimit F) ht
⊢ NatTrans.app t.ι i xi = NatTrans.app t.ι j xj ↔ ∃ k f g, F.map f xi = F.map g xj
[PROOFSTEP]
let e' : t'.pt ≅ t.pt := (Cocones.forget _).mapIso e
[GOAL]
J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ TypeMax
inst✝ : IsFilteredOrEmpty J
t : Cocone F
ht : IsColimit t
i j : J
xi : F.obj i
xj : F.obj j
t' : Cocone F := colimitCocone F
e : t' ≅ t := IsColimit.uniqueUpToIso (colimitCoconeIsColimit F) ht
e' : t'.pt ≅ t.pt := (Cocones.forget F).mapIso e
⊢ NatTrans.app t.ι i xi = NatTrans.app t.ι j xj ↔ ∃ k f g, F.map f xi = F.map g xj
[PROOFSTEP]
refine' Iff.trans _ (colimit_eq_iff_aux.{v, u} F)
[GOAL]
J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ TypeMax
inst✝ : IsFilteredOrEmpty J
t : Cocone F
ht : IsColimit t
i j : J
xi : F.obj i
xj : F.obj j
t' : Cocone F := colimitCocone F
e : t' ≅ t := IsColimit.uniqueUpToIso (colimitCoconeIsColimit F) ht
e' : t'.pt ≅ t.pt := (Cocones.forget F).mapIso e
⊢ NatTrans.app t.ι i xi = NatTrans.app t.ι j xj ↔
    NatTrans.app (colimitCocone F).ι i xi = NatTrans.app (colimitCocone F).ι j xj
[PROOFSTEP]
exact @Equiv.apply_eq_iff_eq _ _ e'.toEquiv ((colimitCocone.{v, u} F).ι.app i xi) ((colimitCocone.{v, u} F).ι.app j xj)
[GOAL]
J : Type v
inst✝ : SmallCategory J
α β : Type u
f : α ⟶ β
F' : MonoFactorisation f
⊢ lift F' ≫ F'.m = ι f
[PROOFSTEP]
funext x
[GOAL]
case h
J : Type v
inst✝ : SmallCategory J
α β : Type u
f : α ⟶ β
F' : MonoFactorisation f
x : Image f
⊢ (lift F' ≫ F'.m) x = ι f x
[PROOFSTEP]
change (F'.e ≫ F'.m) _ = _
[GOAL]
case h
J : Type v
inst✝ : SmallCategory J
α β : Type u
f : α ⟶ β
F' : MonoFactorisation f
x : Image f
⊢ (F'.e ≫ F'.m) ↑(Classical.indefiniteDescription (fun x_1 => f x_1 = ↑x) (_ : ↑x ∈ Set.range f)) = ι f x
[PROOFSTEP]
rw [F'.fac, (Classical.indefiniteDescription _ x.2).2]
[GOAL]
case h
J : Type v
inst✝ : SmallCategory J
α β : Type u
f : α ⟶ β
F' : MonoFactorisation f
x : Image f
⊢ ↑x = ι f x
[PROOFSTEP]
rfl
[GOAL]
J : Type v
inst✝ : SmallCategory J
α β : Type u
f : α ⟶ β
⊢ ∀ {X Y : Type u} (f : X ⟶ Y), HasImage f
[PROOFSTEP]
infer_instance
[GOAL]
J : Type v
inst✝ : SmallCategory J
α β : Type u
f✝ : α ⟶ β
f g : Arrow (Type u)
st : f ⟶ g
x : (monoFactorisation f.hom).I
⊢ Comma.hom g (CommaMorphism.left st (Classical.choose (_ : ↑x ∈ Set.range f.hom))) = CommaMorphism.right st ↑x
[PROOFSTEP]
have p := st.w
[GOAL]
J : Type v
inst✝ : SmallCategory J
α β : Type u
f✝ : α ⟶ β
f g : Arrow (Type u)
st : f ⟶ g
x : (monoFactorisation f.hom).I
p : (𝟭 (Type u)).map st.left ≫ g.hom = f.hom ≫ (𝟭 (Type u)).map st.right
⊢ Comma.hom g (CommaMorphism.left st (Classical.choose (_ : ↑x ∈ Set.range f.hom))) = CommaMorphism.right st ↑x
[PROOFSTEP]
replace p := congr_fun p (Classical.choose x.2)
[GOAL]
J : Type v
inst✝ : SmallCategory J
α β : Type u
f✝ : α ⟶ β
f g : Arrow (Type u)
st : f ⟶ g
x : (monoFactorisation f.hom).I
p :
  ((𝟭 (Type u)).map st.left ≫ g.hom) (Classical.choose (_ : ↑x ∈ Set.range f.hom)) =
    (f.hom ≫ (𝟭 (Type u)).map st.right) (Classical.choose (_ : ↑x ∈ Set.range f.hom))
⊢ Comma.hom g (CommaMorphism.left st (Classical.choose (_ : ↑x ∈ Set.range f.hom))) = CommaMorphism.right st ↑x
[PROOFSTEP]
simp only [Functor.id_obj, Functor.id_map, types_comp_apply] at p
[GOAL]
J : Type v
inst✝ : SmallCategory J
α β : Type u
f✝ : α ⟶ β
f g : Arrow (Type u)
st : f ⟶ g
x : (monoFactorisation f.hom).I
p :
  Comma.hom g (CommaMorphism.left st (Classical.choose (_ : ∃ x_1, (fun x_2 => Comma.hom f x_2 = ↑x) x_1))) =
    CommaMorphism.right st (Comma.hom f (Classical.choose (_ : ∃ x_1, (fun x_2 => Comma.hom f x_2 = ↑x) x_1)))
⊢ Comma.hom g (CommaMorphism.left st (Classical.choose (_ : ↑x ∈ Set.range f.hom))) = CommaMorphism.right st ↑x
[PROOFSTEP]
erw [p, Classical.choose_spec x.2]