[GOAL]
R : Type u
A : Type v
B : Type w
inst✝⁵ : CommSemiring R
inst✝⁴ : Semiring A
inst✝³ : Semiring B
inst✝² : Algebra R A
inst✝¹ : Algebra R B
s✝ t : Set A
inst✝ : DecidableEq A
α : Type u_1
s : Finset α
f : { x // x ∈ s } → Finset A
⊢ adjoin R ↑(Finset.biUnion (Finset.attach s) f) = ⨆ (x : { x // x ∈ s }), adjoin R ↑(f x)
[PROOFSTEP]
simp [adjoin_iUnion]
[GOAL]
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s t : Set A
p : A → A → Prop
a b : A
ha : a ∈ adjoin R s
hb : b ∈ adjoin R s
Hs : ∀ (x : A), x ∈ s → ∀ (y : A), y ∈ s → p x y
Halg : ∀ (r₁ r₂ : R), p (↑(algebraMap R A) r₁) (↑(algebraMap R A) r₂)
Halg_left : ∀ (r : R) (x : A), x ∈ s → p (↑(algebraMap R A) r) x
Halg_right : ∀ (r : R) (x : A), x ∈ s → p x (↑(algebraMap R A) r)
Hadd_left : ∀ (x₁ x₂ y : A), p x₁ y → p x₂ y → p (x₁ + x₂) y
Hadd_right : ∀ (x y₁ y₂ : A), p x y₁ → p x y₂ → p x (y₁ + y₂)
Hmul_left : ∀ (x₁ x₂ y : A), p x₁ y → p x₂ y → p (x₁ * x₂) y
Hmul_right : ∀ (x y₁ y₂ : A), p x y₁ → p x y₂ → p x (y₁ * y₂)
⊢ p a b
[PROOFSTEP]
refine' adjoin_induction hb _ (fun r => _) (Hadd_right a) (Hmul_right a)
[GOAL]
case refine'_1
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s t : Set A
p : A → A → Prop
a b : A
ha : a ∈ adjoin R s
hb : b ∈ adjoin R s
Hs : ∀ (x : A), x ∈ s → ∀ (y : A), y ∈ s → p x y
Halg : ∀ (r₁ r₂ : R), p (↑(algebraMap R A) r₁) (↑(algebraMap R A) r₂)
Halg_left : ∀ (r : R) (x : A), x ∈ s → p (↑(algebraMap R A) r) x
Halg_right : ∀ (r : R) (x : A), x ∈ s → p x (↑(algebraMap R A) r)
Hadd_left : ∀ (x₁ x₂ y : A), p x₁ y → p x₂ y → p (x₁ + x₂) y
Hadd_right : ∀ (x y₁ y₂ : A), p x y₁ → p x y₂ → p x (y₁ + y₂)
Hmul_left : ∀ (x₁ x₂ y : A), p x₁ y → p x₂ y → p (x₁ * x₂) y
Hmul_right : ∀ (x y₁ y₂ : A), p x y₁ → p x y₂ → p x (y₁ * y₂)
⊢ ∀ (x : A), x ∈ s → p a x
[PROOFSTEP]
exact
  adjoin_induction ha Hs Halg_left (fun x y Hx Hy z hz => Hadd_left x y z (Hx z hz) (Hy z hz)) fun x y Hx Hy z hz =>
    Hmul_left x y z (Hx z hz) (Hy z hz)
[GOAL]
case refine'_2
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s t : Set A
p : A → A → Prop
a b : A
ha : a ∈ adjoin R s
hb : b ∈ adjoin R s
Hs : ∀ (x : A), x ∈ s → ∀ (y : A), y ∈ s → p x y
Halg : ∀ (r₁ r₂ : R), p (↑(algebraMap R A) r₁) (↑(algebraMap R A) r₂)
Halg_left : ∀ (r : R) (x : A), x ∈ s → p (↑(algebraMap R A) r) x
Halg_right : ∀ (r : R) (x : A), x ∈ s → p x (↑(algebraMap R A) r)
Hadd_left : ∀ (x₁ x₂ y : A), p x₁ y → p x₂ y → p (x₁ + x₂) y
Hadd_right : ∀ (x y₁ y₂ : A), p x y₁ → p x y₂ → p x (y₁ + y₂)
Hmul_left : ∀ (x₁ x₂ y : A), p x₁ y → p x₂ y → p (x₁ * x₂) y
Hmul_right : ∀ (x y₁ y₂ : A), p x y₁ → p x y₂ → p x (y₁ * y₂)
r : R
⊢ p a (↑(algebraMap R A) r)
[PROOFSTEP]
exact
  adjoin_induction ha (Halg_right r) (fun r' => Halg r' r) (fun x y => Hadd_left x y ((algebraMap R A) r)) fun x y =>
    Hmul_left x y ((algebraMap R A) r)
[GOAL]
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s t : Set A
p : { x // x ∈ adjoin R s } → Prop
Hs : ∀ (x : A) (h : x ∈ s), p { val := x, property := (_ : x ∈ ↑(adjoin R s)) }
Halg : ∀ (r : R), p (↑(algebraMap R { x // x ∈ adjoin R s }) r)
Hadd : ∀ (x y : { x // x ∈ adjoin R s }), p x → p y → p (x + y)
Hmul : ∀ (x y : { x // x ∈ adjoin R s }), p x → p y → p (x * y)
x✝ : { x // x ∈ adjoin R s }
x : A
hx : x ∈ adjoin R s
⊢ p { val := x, property := hx }
[PROOFSTEP]
refine' Exists.elim _ fun (hx : x ∈ adjoin R s) (hc : p ⟨x, hx⟩) => hc
[GOAL]
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s t : Set A
p : { x // x ∈ adjoin R s } → Prop
Hs : ∀ (x : A) (h : x ∈ s), p { val := x, property := (_ : x ∈ ↑(adjoin R s)) }
Halg : ∀ (r : R), p (↑(algebraMap R { x // x ∈ adjoin R s }) r)
Hadd : ∀ (x y : { x // x ∈ adjoin R s }), p x → p y → p (x + y)
Hmul : ∀ (x y : { x // x ∈ adjoin R s }), p x → p y → p (x * y)
x✝ : { x // x ∈ adjoin R s }
x : A
hx : x ∈ adjoin R s
⊢ ∃ x_1, p { val := x, property := x_1 }
[PROOFSTEP]
exact
  adjoin_induction hx (fun x hx => ⟨subset_adjoin hx, Hs x hx⟩) (fun r => ⟨Subalgebra.algebraMap_mem _ r, Halg r⟩)
    (fun x y hx hy =>
      Exists.elim hx fun hx' hx => Exists.elim hy fun hy' hy => ⟨Subalgebra.add_mem _ hx' hy', Hadd _ _ hx hy⟩)
    fun x y hx hy =>
    Exists.elim hx fun hx' hx => Exists.elim hy fun hy' hy => ⟨Subalgebra.mul_mem _ hx' hy', Hmul _ _ hx hy⟩
[GOAL]
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s✝ t s : Set A
⊢ adjoin R (Subtype.val ⁻¹' s) = ⊤
[PROOFSTEP]
refine'
  eq_top_iff.2
    fun x =>
      -- porting note: Lean could no longer infer the motive
    adjoin_induction' (p := fun y => y ∈ adjoin R (((↑) : adjoin R s → A) ⁻¹' s)) (fun a ha => _) (fun r => _)
      (fun _ _ => _) (fun _ _ => _) x
[GOAL]
case refine'_1
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s✝ t s : Set A
x : { x // x ∈ ↑(adjoin R s) }
a : A
ha : a ∈ s
⊢ (fun y => y ∈ adjoin R (Subtype.val ⁻¹' s)) { val := a, property := (_ : a ∈ ↑(adjoin R s)) }
[PROOFSTEP]
exact subset_adjoin ha
[GOAL]
case refine'_2
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s✝ t s : Set A
x : { x // x ∈ ↑(adjoin R s) }
r : R
⊢ (fun y => y ∈ adjoin R (Subtype.val ⁻¹' s)) (↑(algebraMap R { x // x ∈ adjoin R s }) r)
[PROOFSTEP]
exact Subalgebra.algebraMap_mem _ r
[GOAL]
case refine'_3
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s✝ t s : Set A
x : { x // x ∈ ↑(adjoin R s) }
x✝¹ x✝ : { x // x ∈ adjoin R s }
⊢ (fun y => y ∈ adjoin R (Subtype.val ⁻¹' s)) x✝¹ →
    (fun y => y ∈ adjoin R (Subtype.val ⁻¹' s)) x✝ → (fun y => y ∈ adjoin R (Subtype.val ⁻¹' s)) (x✝¹ + x✝)
[PROOFSTEP]
exact Subalgebra.add_mem _
[GOAL]
case refine'_4
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s✝ t s : Set A
x : { x // x ∈ ↑(adjoin R s) }
x✝¹ x✝ : { x // x ∈ adjoin R s }
⊢ (fun y => y ∈ adjoin R (Subtype.val ⁻¹' s)) x✝¹ →
    (fun y => y ∈ adjoin R (Subtype.val ⁻¹' s)) x✝ → (fun y => y ∈ adjoin R (Subtype.val ⁻¹' s)) (x✝¹ * x✝)
[PROOFSTEP]
exact Subalgebra.mul_mem _
[GOAL]
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s t : Set A
⊢ adjoin R ⊥ = ⊥
[PROOFSTEP]
apply GaloisConnection.l_bot
[GOAL]
case gc
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s t : Set A
⊢ GaloisConnection (adjoin R) ?u
case u
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s t : Set A
⊢ Subalgebra R A → Set A
[PROOFSTEP]
exact Algebra.gc
[GOAL]
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s t : Set A
⊢ ↑Subalgebra.toSubmodule (adjoin R s) = span R ↑(Submonoid.closure s)
[PROOFSTEP]
apply le_antisymm
[GOAL]
case a
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s t : Set A
⊢ ↑Subalgebra.toSubmodule (adjoin R s) ≤ span R ↑(Submonoid.closure s)
[PROOFSTEP]
intro r hr
[GOAL]
case a
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s t : Set A
r : A
hr : r ∈ ↑Subalgebra.toSubmodule (adjoin R s)
⊢ r ∈ span R ↑(Submonoid.closure s)
[PROOFSTEP]
rcases Subsemiring.mem_closure_iff_exists_list.1 hr with ⟨L, HL, rfl⟩
[GOAL]
case a.intro.intro
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s t : Set A
L : List (List A)
HL : ∀ (t : List A), t ∈ L → ∀ (y : A), y ∈ t → y ∈ Set.range ↑(algebraMap R A) ∪ s
hr : List.sum (List.map List.prod L) ∈ ↑Subalgebra.toSubmodule (adjoin R s)
⊢ List.sum (List.map List.prod L) ∈ span R ↑(Submonoid.closure s)
[PROOFSTEP]
clear hr
[GOAL]
case a.intro.intro
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s t : Set A
L : List (List A)
HL : ∀ (t : List A), t ∈ L → ∀ (y : A), y ∈ t → y ∈ Set.range ↑(algebraMap R A) ∪ s
⊢ List.sum (List.map List.prod L) ∈ span R ↑(Submonoid.closure s)
[PROOFSTEP]
induction' L with hd tl ih
[GOAL]
case a.intro.intro.nil
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s t : Set A
L : List (List A)
HL✝ : ∀ (t : List A), t ∈ L → ∀ (y : A), y ∈ t → y ∈ Set.range ↑(algebraMap R A) ∪ s
HL : ∀ (t : List A), t ∈ [] → ∀ (y : A), y ∈ t → y ∈ Set.range ↑(algebraMap R A) ∪ s
⊢ List.sum (List.map List.prod []) ∈ span R ↑(Submonoid.closure s)
[PROOFSTEP]
exact zero_mem _
[GOAL]
case a.intro.intro.cons
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s t : Set A
L : List (List A)
HL✝ : ∀ (t : List A), t ∈ L → ∀ (y : A), y ∈ t → y ∈ Set.range ↑(algebraMap R A) ∪ s
hd : List A
tl : List (List A)
ih :
  (∀ (t : List A), t ∈ tl → ∀ (y : A), y ∈ t → y ∈ Set.range ↑(algebraMap R A) ∪ s) →
    List.sum (List.map List.prod tl) ∈ span R ↑(Submonoid.closure s)
HL : ∀ (t : List A), t ∈ hd :: tl → ∀ (y : A), y ∈ t → y ∈ Set.range ↑(algebraMap R A) ∪ s
⊢ List.sum (List.map List.prod (hd :: tl)) ∈ span R ↑(Submonoid.closure s)
[PROOFSTEP]
rw [List.forall_mem_cons] at HL
[GOAL]
case a.intro.intro.cons
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s t : Set A
L : List (List A)
HL✝ : ∀ (t : List A), t ∈ L → ∀ (y : A), y ∈ t → y ∈ Set.range ↑(algebraMap R A) ∪ s
hd : List A
tl : List (List A)
ih :
  (∀ (t : List A), t ∈ tl → ∀ (y : A), y ∈ t → y ∈ Set.range ↑(algebraMap R A) ∪ s) →
    List.sum (List.map List.prod tl) ∈ span R ↑(Submonoid.closure s)
HL :
  (∀ (y : A), y ∈ hd → y ∈ Set.range ↑(algebraMap R A) ∪ s) ∧
    ∀ (x : List A), x ∈ tl → ∀ (y : A), y ∈ x → y ∈ Set.range ↑(algebraMap R A) ∪ s
⊢ List.sum (List.map List.prod (hd :: tl)) ∈ span R ↑(Submonoid.closure s)
[PROOFSTEP]
rw [List.map_cons, List.sum_cons]
[GOAL]
case a.intro.intro.cons
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s t : Set A
L : List (List A)
HL✝ : ∀ (t : List A), t ∈ L → ∀ (y : A), y ∈ t → y ∈ Set.range ↑(algebraMap R A) ∪ s
hd : List A
tl : List (List A)
ih :
  (∀ (t : List A), t ∈ tl → ∀ (y : A), y ∈ t → y ∈ Set.range ↑(algebraMap R A) ∪ s) →
    List.sum (List.map List.prod tl) ∈ span R ↑(Submonoid.closure s)
HL :
  (∀ (y : A), y ∈ hd → y ∈ Set.range ↑(algebraMap R A) ∪ s) ∧
    ∀ (x : List A), x ∈ tl → ∀ (y : A), y ∈ x → y ∈ Set.range ↑(algebraMap R A) ∪ s
⊢ List.prod hd + List.sum (List.map List.prod tl) ∈ span R ↑(Submonoid.closure s)
[PROOFSTEP]
refine' Submodule.add_mem _ _ (ih HL.2)
[GOAL]
case a.intro.intro.cons
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s t : Set A
L : List (List A)
HL✝ : ∀ (t : List A), t ∈ L → ∀ (y : A), y ∈ t → y ∈ Set.range ↑(algebraMap R A) ∪ s
hd : List A
tl : List (List A)
ih :
  (∀ (t : List A), t ∈ tl → ∀ (y : A), y ∈ t → y ∈ Set.range ↑(algebraMap R A) ∪ s) →
    List.sum (List.map List.prod tl) ∈ span R ↑(Submonoid.closure s)
HL :
  (∀ (y : A), y ∈ hd → y ∈ Set.range ↑(algebraMap R A) ∪ s) ∧
    ∀ (x : List A), x ∈ tl → ∀ (y : A), y ∈ x → y ∈ Set.range ↑(algebraMap R A) ∪ s
⊢ List.prod hd ∈ span R ↑(Submonoid.closure s)
[PROOFSTEP]
replace HL := HL.1
[GOAL]
case a.intro.intro.cons
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s t : Set A
L : List (List A)
HL✝ : ∀ (t : List A), t ∈ L → ∀ (y : A), y ∈ t → y ∈ Set.range ↑(algebraMap R A) ∪ s
hd : List A
tl : List (List A)
ih :
  (∀ (t : List A), t ∈ tl → ∀ (y : A), y ∈ t → y ∈ Set.range ↑(algebraMap R A) ∪ s) →
    List.sum (List.map List.prod tl) ∈ span R ↑(Submonoid.closure s)
HL : ∀ (y : A), y ∈ hd → y ∈ Set.range ↑(algebraMap R A) ∪ s
⊢ List.prod hd ∈ span R ↑(Submonoid.closure s)
[PROOFSTEP]
clear ih tl
[GOAL]
case a.intro.intro.cons
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s t : Set A
L : List (List A)
HL✝ : ∀ (t : List A), t ∈ L → ∀ (y : A), y ∈ t → y ∈ Set.range ↑(algebraMap R A) ∪ s
hd : List A
HL : ∀ (y : A), y ∈ hd → y ∈ Set.range ↑(algebraMap R A) ∪ s
⊢ List.prod hd ∈ span R ↑(Submonoid.closure s)
[PROOFSTEP]
suffices ∃ (z r : _) (_hr : r ∈ Submonoid.closure s), z • r = List.prod hd
  by
  rcases this with ⟨z, r, hr, hzr⟩
  rw [← hzr]
  exact smul_mem _ _ (subset_span hr)
[GOAL]
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s t : Set A
L : List (List A)
HL✝ : ∀ (t : List A), t ∈ L → ∀ (y : A), y ∈ t → y ∈ Set.range ↑(algebraMap R A) ∪ s
hd : List A
HL : ∀ (y : A), y ∈ hd → y ∈ Set.range ↑(algebraMap R A) ∪ s
this : ∃ z r _hr, z • r = List.prod hd
⊢ List.prod hd ∈ span R ↑(Submonoid.closure s)
[PROOFSTEP]
rcases this with ⟨z, r, hr, hzr⟩
[GOAL]
case intro.intro.intro
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s t : Set A
L : List (List A)
HL✝ : ∀ (t : List A), t ∈ L → ∀ (y : A), y ∈ t → y ∈ Set.range ↑(algebraMap R A) ∪ s
hd : List A
HL : ∀ (y : A), y ∈ hd → y ∈ Set.range ↑(algebraMap R A) ∪ s
z : ?m.213266
r : A
hr : r ∈ Submonoid.closure s
hzr : z • r = List.prod hd
⊢ List.prod hd ∈ span R ↑(Submonoid.closure s)
[PROOFSTEP]
rw [← hzr]
[GOAL]
case intro.intro.intro
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s t : Set A
L : List (List A)
HL✝ : ∀ (t : List A), t ∈ L → ∀ (y : A), y ∈ t → y ∈ Set.range ↑(algebraMap R A) ∪ s
hd : List A
HL : ∀ (y : A), y ∈ hd → y ∈ Set.range ↑(algebraMap R A) ∪ s
z : ?m.213266
r : A
hr : r ∈ Submonoid.closure s
hzr : z • r = List.prod hd
⊢ z • r ∈ span R ↑(Submonoid.closure s)
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s t : Set A
L : List (List A)
HL✝ : ∀ (t : List A), t ∈ L → ∀ (y : A), y ∈ t → y ∈ Set.range ↑(algebraMap R A) ∪ s
hd : List A
HL : ∀ (y : A), y ∈ hd → y ∈ Set.range ↑(algebraMap R A) ∪ s
⊢ Type ?u.213363
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s t : Set A
L : List (List A)
HL✝ : ∀ (t : List A), t ∈ L → ∀ (y : A), y ∈ t → y ∈ Set.range ↑(algebraMap R A) ∪ s
hd : List A
HL : ∀ (y : A), y ∈ hd → y ∈ Set.range ↑(algebraMap R A) ∪ s
⊢ ?m.213266 → (r : A) → r ∈ Submonoid.closure s → HSMul ?m.213266 A A
[PROOFSTEP]
exact smul_mem _ _ (subset_span hr)
[GOAL]
case a.intro.intro.cons
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s t : Set A
L : List (List A)
HL✝ : ∀ (t : List A), t ∈ L → ∀ (y : A), y ∈ t → y ∈ Set.range ↑(algebraMap R A) ∪ s
hd : List A
HL : ∀ (y : A), y ∈ hd → y ∈ Set.range ↑(algebraMap R A) ∪ s
⊢ ∃ z r _hr, z • r = List.prod hd
[PROOFSTEP]
induction' hd with hd tl ih
[GOAL]
case a.intro.intro.cons.nil
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s t : Set A
L : List (List A)
HL✝¹ : ∀ (t : List A), t ∈ L → ∀ (y : A), y ∈ t → y ∈ Set.range ↑(algebraMap R A) ∪ s
hd : List A
HL✝ : ∀ (y : A), y ∈ hd → y ∈ Set.range ↑(algebraMap R A) ∪ s
HL : ∀ (y : A), y ∈ [] → y ∈ Set.range ↑(algebraMap R A) ∪ s
⊢ ∃ z r _hr, z • r = List.prod []
[PROOFSTEP]
exact ⟨1, 1, (Submonoid.closure s).one_mem', one_smul _ _⟩
[GOAL]
case a.intro.intro.cons.cons
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s t : Set A
L : List (List A)
HL✝¹ : ∀ (t : List A), t ∈ L → ∀ (y : A), y ∈ t → y ∈ Set.range ↑(algebraMap R A) ∪ s
hd✝ : List A
HL✝ : ∀ (y : A), y ∈ hd✝ → y ∈ Set.range ↑(algebraMap R A) ∪ s
hd : A
tl : List A
ih : (∀ (y : A), y ∈ tl → y ∈ Set.range ↑(algebraMap R A) ∪ s) → ∃ z r _hr, z • r = List.prod tl
HL : ∀ (y : A), y ∈ hd :: tl → y ∈ Set.range ↑(algebraMap R A) ∪ s
⊢ ∃ z r _hr, z • r = List.prod (hd :: tl)
[PROOFSTEP]
rw [List.forall_mem_cons] at HL
[GOAL]
case a.intro.intro.cons.cons
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s t : Set A
L : List (List A)
HL✝¹ : ∀ (t : List A), t ∈ L → ∀ (y : A), y ∈ t → y ∈ Set.range ↑(algebraMap R A) ∪ s
hd✝ : List A
HL✝ : ∀ (y : A), y ∈ hd✝ → y ∈ Set.range ↑(algebraMap R A) ∪ s
hd : A
tl : List A
ih : (∀ (y : A), y ∈ tl → y ∈ Set.range ↑(algebraMap R A) ∪ s) → ∃ z r _hr, z • r = List.prod tl
HL : hd ∈ Set.range ↑(algebraMap R A) ∪ s ∧ ∀ (x : A), x ∈ tl → x ∈ Set.range ↑(algebraMap R A) ∪ s
⊢ ∃ z r _hr, z • r = List.prod (hd :: tl)
[PROOFSTEP]
rcases ih HL.2 with ⟨z, r, hr, hzr⟩
[GOAL]
case a.intro.intro.cons.cons.intro.intro.intro
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s t : Set A
L : List (List A)
HL✝¹ : ∀ (t : List A), t ∈ L → ∀ (y : A), y ∈ t → y ∈ Set.range ↑(algebraMap R A) ∪ s
hd✝ : List A
HL✝ : ∀ (y : A), y ∈ hd✝ → y ∈ Set.range ↑(algebraMap R A) ∪ s
hd : A
tl : List A
ih : (∀ (y : A), y ∈ tl → y ∈ Set.range ↑(algebraMap R A) ∪ s) → ∃ z r _hr, z • r = List.prod tl
HL : hd ∈ Set.range ↑(algebraMap R A) ∪ s ∧ ∀ (x : A), x ∈ tl → x ∈ Set.range ↑(algebraMap R A) ∪ s
z : R
r : A
hr : r ∈ Submonoid.closure s
hzr : z • r = List.prod tl
⊢ ∃ z r _hr, z • r = List.prod (hd :: tl)
[PROOFSTEP]
rw [List.prod_cons, ← hzr]
[GOAL]
case a.intro.intro.cons.cons.intro.intro.intro
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s t : Set A
L : List (List A)
HL✝¹ : ∀ (t : List A), t ∈ L → ∀ (y : A), y ∈ t → y ∈ Set.range ↑(algebraMap R A) ∪ s
hd✝ : List A
HL✝ : ∀ (y : A), y ∈ hd✝ → y ∈ Set.range ↑(algebraMap R A) ∪ s
hd : A
tl : List A
ih : (∀ (y : A), y ∈ tl → y ∈ Set.range ↑(algebraMap R A) ∪ s) → ∃ z r _hr, z • r = List.prod tl
HL : hd ∈ Set.range ↑(algebraMap R A) ∪ s ∧ ∀ (x : A), x ∈ tl → x ∈ Set.range ↑(algebraMap R A) ∪ s
z : R
r : A
hr : r ∈ Submonoid.closure s
hzr : z • r = List.prod tl
⊢ ∃ z_1 r_1 _hr, z_1 • r_1 = hd * z • r
[PROOFSTEP]
rcases HL.1 with (⟨hd, rfl⟩ | hs)
[GOAL]
case a.intro.intro.cons.cons.intro.intro.intro.inl.intro
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s t : Set A
L : List (List A)
HL✝¹ : ∀ (t : List A), t ∈ L → ∀ (y : A), y ∈ t → y ∈ Set.range ↑(algebraMap R A) ∪ s
hd✝ : List A
HL✝ : ∀ (y : A), y ∈ hd✝ → y ∈ Set.range ↑(algebraMap R A) ∪ s
tl : List A
ih : (∀ (y : A), y ∈ tl → y ∈ Set.range ↑(algebraMap R A) ∪ s) → ∃ z r _hr, z • r = List.prod tl
z : R
r : A
hr : r ∈ Submonoid.closure s
hzr : z • r = List.prod tl
hd : R
HL : ↑(algebraMap R A) hd ∈ Set.range ↑(algebraMap R A) ∪ s ∧ ∀ (x : A), x ∈ tl → x ∈ Set.range ↑(algebraMap R A) ∪ s
⊢ ∃ z_1 r_1 _hr, z_1 • r_1 = ↑(algebraMap R A) hd * z • r
[PROOFSTEP]
refine' ⟨hd * z, r, hr, _⟩
[GOAL]
case a.intro.intro.cons.cons.intro.intro.intro.inl.intro
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s t : Set A
L : List (List A)
HL✝¹ : ∀ (t : List A), t ∈ L → ∀ (y : A), y ∈ t → y ∈ Set.range ↑(algebraMap R A) ∪ s
hd✝ : List A
HL✝ : ∀ (y : A), y ∈ hd✝ → y ∈ Set.range ↑(algebraMap R A) ∪ s
tl : List A
ih : (∀ (y : A), y ∈ tl → y ∈ Set.range ↑(algebraMap R A) ∪ s) → ∃ z r _hr, z • r = List.prod tl
z : R
r : A
hr : r ∈ Submonoid.closure s
hzr : z • r = List.prod tl
hd : R
HL : ↑(algebraMap R A) hd ∈ Set.range ↑(algebraMap R A) ∪ s ∧ ∀ (x : A), x ∈ tl → x ∈ Set.range ↑(algebraMap R A) ∪ s
⊢ (hd * z) • r = ↑(algebraMap R A) hd * z • r
[PROOFSTEP]
rw [Algebra.smul_def, Algebra.smul_def, (algebraMap _ _).map_mul, _root_.mul_assoc]
[GOAL]
case a.intro.intro.cons.cons.intro.intro.intro.inr
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s t : Set A
L : List (List A)
HL✝¹ : ∀ (t : List A), t ∈ L → ∀ (y : A), y ∈ t → y ∈ Set.range ↑(algebraMap R A) ∪ s
hd✝ : List A
HL✝ : ∀ (y : A), y ∈ hd✝ → y ∈ Set.range ↑(algebraMap R A) ∪ s
hd : A
tl : List A
ih : (∀ (y : A), y ∈ tl → y ∈ Set.range ↑(algebraMap R A) ∪ s) → ∃ z r _hr, z • r = List.prod tl
HL : hd ∈ Set.range ↑(algebraMap R A) ∪ s ∧ ∀ (x : A), x ∈ tl → x ∈ Set.range ↑(algebraMap R A) ∪ s
z : R
r : A
hr : r ∈ Submonoid.closure s
hzr : z • r = List.prod tl
hs : hd ∈ s
⊢ ∃ z_1 r_1 _hr, z_1 • r_1 = hd * z • r
[PROOFSTEP]
exact ⟨z, hd * r, Submonoid.mul_mem _ (Submonoid.subset_closure hs) hr, (mul_smul_comm _ _ _).symm⟩
[GOAL]
case a
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s t : Set A
⊢ span R ↑(Submonoid.closure s) ≤ ↑Subalgebra.toSubmodule (adjoin R s)
[PROOFSTEP]
refine' span_le.2 _
[GOAL]
case a
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s t : Set A
⊢ ↑(Submonoid.closure s) ⊆ ↑(↑Subalgebra.toSubmodule (adjoin R s))
[PROOFSTEP]
change Submonoid.closure s ≤ (adjoin R s).toSubsemiring.toSubmonoid
[GOAL]
case a
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s t : Set A
⊢ Submonoid.closure s ≤ (adjoin R s).toSubsemiring.toSubmonoid
[PROOFSTEP]
exact Submonoid.closure_le.2 subset_adjoin
[GOAL]
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s✝ t✝ s : Set A
t : Submodule R A
⊢ ↑Subalgebra.toSubmodule (adjoin R s) ≤ t ↔ ↑(Submonoid.closure s) ⊆ ↑t
[PROOFSTEP]
rw [adjoin_eq_span, span_le]
[GOAL]
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s✝ t : Set A
f : A →ₐ[R] B
s : Set A
⊢ (fun x => x) '' s ⊆ (Subalgebra.comap f (adjoin R (↑f '' s))).toSubsemiring.toSubmonoid.toSubsemigroup.carrier
[PROOFSTEP]
simp only [Set.image_id', coe_carrier_toSubmonoid, Subalgebra.coe_toSubsemiring, Subalgebra.coe_comap]
[GOAL]
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s✝ t : Set A
f : A →ₐ[R] B
s : Set A
⊢ s ⊆ ↑f ⁻¹' ↑(adjoin R ((fun a => ↑f a) '' s))
[PROOFSTEP]
exact fun x hx => subset_adjoin ⟨x, hx, rfl⟩
[GOAL]
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s✝ t s : Set A
x : A
f : A →ₗ[R] B
hf : ∀ (a₁ a₂ : A), ↑f (a₁ * a₂) = ↑f a₁ * ↑f a₂
h : x ∈ adjoin R s
⊢ ↑f x ∈ adjoin R (↑f '' (s ∪ {1}))
[PROOFSTEP]
refine'
  @adjoin_induction R A _ _ _ _ (fun a => f a ∈ adjoin R (f '' (s ∪ {1}))) x h
    (fun a ha => subset_adjoin ⟨a, ⟨Set.subset_union_left _ _ ha, rfl⟩⟩) (fun r => _)
    (fun y z hy hz => by simpa [hy, hz] using Subalgebra.add_mem _ hy hz) fun y z hy hz => by
    simpa [hy, hz, hf y z] using Subalgebra.mul_mem _ hy hz
[GOAL]
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s✝ t s : Set A
x : A
f : A →ₗ[R] B
hf : ∀ (a₁ a₂ : A), ↑f (a₁ * a₂) = ↑f a₁ * ↑f a₂
h : x ∈ adjoin R s
y z : A
hy : (fun a => ↑f a ∈ adjoin R (↑f '' (s ∪ {1}))) y
hz : (fun a => ↑f a ∈ adjoin R (↑f '' (s ∪ {1}))) z
⊢ (fun a => ↑f a ∈ adjoin R (↑f '' (s ∪ {1}))) (y + z)
[PROOFSTEP]
simpa [hy, hz] using Subalgebra.add_mem _ hy hz
[GOAL]
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s✝ t s : Set A
x : A
f : A →ₗ[R] B
hf : ∀ (a₁ a₂ : A), ↑f (a₁ * a₂) = ↑f a₁ * ↑f a₂
h : x ∈ adjoin R s
y z : A
hy : (fun a => ↑f a ∈ adjoin R (↑f '' (s ∪ {1}))) y
hz : (fun a => ↑f a ∈ adjoin R (↑f '' (s ∪ {1}))) z
⊢ (fun a => ↑f a ∈ adjoin R (↑f '' (s ∪ {1}))) (y * z)
[PROOFSTEP]
simpa [hy, hz, hf y z] using Subalgebra.mul_mem _ hy hz
[GOAL]
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s✝ t s : Set A
x : A
f : A →ₗ[R] B
hf : ∀ (a₁ a₂ : A), ↑f (a₁ * a₂) = ↑f a₁ * ↑f a₂
h : x ∈ adjoin R s
r : R
⊢ (fun a => ↑f a ∈ adjoin R (↑f '' (s ∪ {1}))) (↑(algebraMap R A) r)
[PROOFSTEP]
have : f 1 ∈ adjoin R (f '' (s ∪ {1})) := subset_adjoin ⟨1, ⟨Set.subset_union_right _ _ <| Set.mem_singleton 1, rfl⟩⟩
[GOAL]
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s✝ t s : Set A
x : A
f : A →ₗ[R] B
hf : ∀ (a₁ a₂ : A), ↑f (a₁ * a₂) = ↑f a₁ * ↑f a₂
h : x ∈ adjoin R s
r : R
this : ↑f 1 ∈ adjoin R (↑f '' (s ∪ {1}))
⊢ (fun a => ↑f a ∈ adjoin R (↑f '' (s ∪ {1}))) (↑(algebraMap R A) r)
[PROOFSTEP]
convert Subalgebra.smul_mem (adjoin R (f '' (s ∪ {1}))) this r
[GOAL]
case h.e'_4
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s✝ t s : Set A
x : A
f : A →ₗ[R] B
hf : ∀ (a₁ a₂ : A), ↑f (a₁ * a₂) = ↑f a₁ * ↑f a₂
h : x ∈ adjoin R s
r : R
this : ↑f 1 ∈ adjoin R (↑f '' (s ∪ {1}))
⊢ ↑f (↑(algebraMap R A) r) = r • ↑f 1
[PROOFSTEP]
rw [algebraMap_eq_smul_one]
[GOAL]
case h.e'_4
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s✝ t s : Set A
x : A
f : A →ₗ[R] B
hf : ∀ (a₁ a₂ : A), ↑f (a₁ * a₂) = ↑f a₁ * ↑f a₂
h : x ∈ adjoin R s
r : R
this : ↑f 1 ∈ adjoin R (↑f '' (s ∪ {1}))
⊢ ↑f (r • 1) = r • ↑f 1
[PROOFSTEP]
exact f.map_smul _ _
[GOAL]
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s✝ t✝ s : Set A
t : Set B
⊢ adjoin R (↑(LinearMap.inl R A B) '' (s ∪ {1}) ∪ ↑(LinearMap.inr R A B) '' (t ∪ {1})) =
    Subalgebra.prod (adjoin R s) (adjoin R t)
[PROOFSTEP]
apply le_antisymm
[GOAL]
case a
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s✝ t✝ s : Set A
t : Set B
⊢ adjoin R (↑(LinearMap.inl R A B) '' (s ∪ {1}) ∪ ↑(LinearMap.inr R A B) '' (t ∪ {1})) ≤
    Subalgebra.prod (adjoin R s) (adjoin R t)
[PROOFSTEP]
simp only [adjoin_le_iff, Set.insert_subset_iff, Subalgebra.zero_mem, Subalgebra.one_mem, subset_adjoin,
  -- the rest comes from `squeeze_simp`Set.union_subset_iff, LinearMap.coe_inl, Set.mk_preimage_prod_right,
  Set.image_subset_iff, SetLike.mem_coe, Set.mk_preimage_prod_left, LinearMap.coe_inr, and_self_iff,
  Set.union_singleton, Subalgebra.coe_prod]
[GOAL]
case a
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s✝ t✝ s : Set A
t : Set B
⊢ Subalgebra.prod (adjoin R s) (adjoin R t) ≤
    adjoin R (↑(LinearMap.inl R A B) '' (s ∪ {1}) ∪ ↑(LinearMap.inr R A B) '' (t ∪ {1}))
[PROOFSTEP]
rintro ⟨a, b⟩ ⟨ha, hb⟩
[GOAL]
case a.mk.intro
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s✝ t✝ s : Set A
t : Set B
a : A
b : B
ha : (a, b).fst ∈ ↑(adjoin R s)
hb : (a, b).snd ∈ ↑(adjoin R t)
⊢ (a, b) ∈ adjoin R (↑(LinearMap.inl R A B) '' (s ∪ {1}) ∪ ↑(LinearMap.inr R A B) '' (t ∪ {1}))
[PROOFSTEP]
let P := adjoin R (LinearMap.inl R A B '' (s ∪ {1}) ∪ LinearMap.inr R A B '' (t ∪ {1}))
[GOAL]
case a.mk.intro
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s✝ t✝ s : Set A
t : Set B
a : A
b : B
ha : (a, b).fst ∈ ↑(adjoin R s)
hb : (a, b).snd ∈ ↑(adjoin R t)
P : Subalgebra R (A × B) := adjoin R (↑(LinearMap.inl R A B) '' (s ∪ {1}) ∪ ↑(LinearMap.inr R A B) '' (t ∪ {1}))
⊢ (a, b) ∈ adjoin R (↑(LinearMap.inl R A B) '' (s ∪ {1}) ∪ ↑(LinearMap.inr R A B) '' (t ∪ {1}))
[PROOFSTEP]
have Ha : (a, (0 : B)) ∈ adjoin R (LinearMap.inl R A B '' (s ∪ {1})) := mem_adjoin_of_map_mul R LinearMap.inl_map_mul ha
[GOAL]
case a.mk.intro
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s✝ t✝ s : Set A
t : Set B
a : A
b : B
ha : (a, b).fst ∈ ↑(adjoin R s)
hb : (a, b).snd ∈ ↑(adjoin R t)
P : Subalgebra R (A × B) := adjoin R (↑(LinearMap.inl R A B) '' (s ∪ {1}) ∪ ↑(LinearMap.inr R A B) '' (t ∪ {1}))
Ha : (a, 0) ∈ adjoin R (↑(LinearMap.inl R A B) '' (s ∪ {1}))
⊢ (a, b) ∈ adjoin R (↑(LinearMap.inl R A B) '' (s ∪ {1}) ∪ ↑(LinearMap.inr R A B) '' (t ∪ {1}))
[PROOFSTEP]
have Hb : ((0 : A), b) ∈ adjoin R (LinearMap.inr R A B '' (t ∪ {1})) := mem_adjoin_of_map_mul R LinearMap.inr_map_mul hb
[GOAL]
case a.mk.intro
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s✝ t✝ s : Set A
t : Set B
a : A
b : B
ha : (a, b).fst ∈ ↑(adjoin R s)
hb : (a, b).snd ∈ ↑(adjoin R t)
P : Subalgebra R (A × B) := adjoin R (↑(LinearMap.inl R A B) '' (s ∪ {1}) ∪ ↑(LinearMap.inr R A B) '' (t ∪ {1}))
Ha : (a, 0) ∈ adjoin R (↑(LinearMap.inl R A B) '' (s ∪ {1}))
Hb : (0, b) ∈ adjoin R (↑(LinearMap.inr R A B) '' (t ∪ {1}))
⊢ (a, b) ∈ adjoin R (↑(LinearMap.inl R A B) '' (s ∪ {1}) ∪ ↑(LinearMap.inr R A B) '' (t ∪ {1}))
[PROOFSTEP]
replace Ha : (a, (0 : B)) ∈ P := adjoin_mono (Set.subset_union_left _ _) Ha
[GOAL]
case a.mk.intro
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s✝ t✝ s : Set A
t : Set B
a : A
b : B
ha : (a, b).fst ∈ ↑(adjoin R s)
hb : (a, b).snd ∈ ↑(adjoin R t)
P : Subalgebra R (A × B) := adjoin R (↑(LinearMap.inl R A B) '' (s ∪ {1}) ∪ ↑(LinearMap.inr R A B) '' (t ∪ {1}))
Hb : (0, b) ∈ adjoin R (↑(LinearMap.inr R A B) '' (t ∪ {1}))
Ha : (a, 0) ∈ P
⊢ (a, b) ∈ adjoin R (↑(LinearMap.inl R A B) '' (s ∪ {1}) ∪ ↑(LinearMap.inr R A B) '' (t ∪ {1}))
[PROOFSTEP]
replace Hb : ((0 : A), b) ∈ P := adjoin_mono (Set.subset_union_right _ _) Hb
[GOAL]
case a.mk.intro
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s✝ t✝ s : Set A
t : Set B
a : A
b : B
ha : (a, b).fst ∈ ↑(adjoin R s)
hb : (a, b).snd ∈ ↑(adjoin R t)
P : Subalgebra R (A × B) := adjoin R (↑(LinearMap.inl R A B) '' (s ∪ {1}) ∪ ↑(LinearMap.inr R A B) '' (t ∪ {1}))
Ha : (a, 0) ∈ P
Hb : (0, b) ∈ P
⊢ (a, b) ∈ adjoin R (↑(LinearMap.inl R A B) '' (s ∪ {1}) ∪ ↑(LinearMap.inr R A B) '' (t ∪ {1}))
[PROOFSTEP]
simpa using Subalgebra.add_mem _ Ha Hb
[GOAL]
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s✝ t s : Set A
hcomm : ∀ (a : A), a ∈ s → ∀ (b : A), b ∈ s → a * b = b * a
src✝ : Semiring { x // x ∈ adjoin R s } := Subalgebra.toSemiring (adjoin R s)
x y : { x // x ∈ adjoin R s }
⊢ x * y = y * x
[PROOFSTEP]
ext
[GOAL]
case a
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s✝ t s : Set A
hcomm : ∀ (a : A), a ∈ s → ∀ (b : A), b ∈ s → a * b = b * a
src✝ : Semiring { x // x ∈ adjoin R s } := Subalgebra.toSemiring (adjoin R s)
x y : { x // x ∈ adjoin R s }
⊢ ↑(x * y) = ↑(y * x)
[PROOFSTEP]
simp only [Subalgebra.coe_mul]
[GOAL]
case a
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s✝ t s : Set A
hcomm : ∀ (a : A), a ∈ s → ∀ (b : A), b ∈ s → a * b = b * a
src✝ : Semiring { x // x ∈ adjoin R s } := Subalgebra.toSemiring (adjoin R s)
x y : { x // x ∈ adjoin R s }
⊢ ↑x * ↑y = ↑y * ↑x
[PROOFSTEP]
exact
  adjoin_induction₂ x.prop y.prop hcomm (fun _ _ => by rw [commutes]) (fun r x _hx => commutes r x)
    (fun r x _hx => (commutes r x).symm) (fun _ _ _ h₁ h₂ => by simp only [add_mul, mul_add, h₁, h₂])
    (fun _ _ _ h₁ h₂ => by simp only [add_mul, mul_add, h₁, h₂])
    (fun x₁ x₂ y₁ h₁ h₂ => by rw [mul_assoc, h₂, ← mul_assoc y₁, ← h₁, mul_assoc x₁]) fun x₁ x₂ y₁ h₁ h₂ => by
    rw [mul_assoc x₂, ← h₂, ← mul_assoc x₂, ← h₁, ← mul_assoc]
[GOAL]
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s✝ t s : Set A
hcomm : ∀ (a : A), a ∈ s → ∀ (b : A), b ∈ s → a * b = b * a
src✝ : Semiring { x // x ∈ adjoin R s } := Subalgebra.toSemiring (adjoin R s)
x y : { x // x ∈ adjoin R s }
x✝¹ x✝ : R
⊢ ↑(algebraMap R A) x✝¹ * ↑(algebraMap R A) x✝ = ↑(algebraMap R A) x✝ * ↑(algebraMap R A) x✝¹
[PROOFSTEP]
rw [commutes]
[GOAL]
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s✝ t s : Set A
hcomm : ∀ (a : A), a ∈ s → ∀ (b : A), b ∈ s → a * b = b * a
src✝ : Semiring { x // x ∈ adjoin R s } := Subalgebra.toSemiring (adjoin R s)
x y : { x // x ∈ adjoin R s }
x✝² x✝¹ x✝ : A
h₁ : x✝² * x✝ = x✝ * x✝²
h₂ : x✝¹ * x✝ = x✝ * x✝¹
⊢ (x✝² + x✝¹) * x✝ = x✝ * (x✝² + x✝¹)
[PROOFSTEP]
simp only [add_mul, mul_add, h₁, h₂]
[GOAL]
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s✝ t s : Set A
hcomm : ∀ (a : A), a ∈ s → ∀ (b : A), b ∈ s → a * b = b * a
src✝ : Semiring { x // x ∈ adjoin R s } := Subalgebra.toSemiring (adjoin R s)
x y : { x // x ∈ adjoin R s }
x✝² x✝¹ x✝ : A
h₁ : x✝² * x✝¹ = x✝¹ * x✝²
h₂ : x✝² * x✝ = x✝ * x✝²
⊢ x✝² * (x✝¹ + x✝) = (x✝¹ + x✝) * x✝²
[PROOFSTEP]
simp only [add_mul, mul_add, h₁, h₂]
[GOAL]
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s✝ t s : Set A
hcomm : ∀ (a : A), a ∈ s → ∀ (b : A), b ∈ s → a * b = b * a
src✝ : Semiring { x // x ∈ adjoin R s } := Subalgebra.toSemiring (adjoin R s)
x y : { x // x ∈ adjoin R s }
x₁ x₂ y₁ : A
h₁ : x₁ * y₁ = y₁ * x₁
h₂ : x₂ * y₁ = y₁ * x₂
⊢ x₁ * x₂ * y₁ = y₁ * (x₁ * x₂)
[PROOFSTEP]
rw [mul_assoc, h₂, ← mul_assoc y₁, ← h₁, mul_assoc x₁]
[GOAL]
R : Type u
A : Type v
B : Type w
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Semiring B
inst✝¹ : Algebra R A
inst✝ : Algebra R B
s✝ t s : Set A
hcomm : ∀ (a : A), a ∈ s → ∀ (b : A), b ∈ s → a * b = b * a
src✝ : Semiring { x // x ∈ adjoin R s } := Subalgebra.toSemiring (adjoin R s)
x y : { x // x ∈ adjoin R s }
x₁ x₂ y₁ : A
h₁ : x₁ * x₂ = x₂ * x₁
h₂ : x₁ * y₁ = y₁ * x₁
⊢ x₁ * (x₂ * y₁) = x₂ * y₁ * x₁
[PROOFSTEP]
rw [mul_assoc x₂, ← h₂, ← mul_assoc x₂, ← h₁, ← mul_assoc]
[GOAL]
R : Type u
A : Type v
B : Type w
inst✝² : CommSemiring R
inst✝¹ : CommSemiring A
inst✝ : Algebra R A
s t : Set A
⊢ ↑Subalgebra.toSubmodule (adjoin R (s ∪ t)) =
    ↑Subalgebra.toSubmodule (adjoin R s) * ↑Subalgebra.toSubmodule (adjoin R t)
[PROOFSTEP]
rw [adjoin_eq_span, adjoin_eq_span, adjoin_eq_span, span_mul_span]
[GOAL]
R : Type u
A : Type v
B : Type w
inst✝² : CommSemiring R
inst✝¹ : CommSemiring A
inst✝ : Algebra R A
s t : Set A
⊢ span R ↑(Submonoid.closure (s ∪ t)) = span R (↑(Submonoid.closure s) * ↑(Submonoid.closure t))
[PROOFSTEP]
congr 1 with z
[GOAL]
case e_s.h
R : Type u
A : Type v
B : Type w
inst✝² : CommSemiring R
inst✝¹ : CommSemiring A
inst✝ : Algebra R A
s t : Set A
z : A
⊢ z ∈ ↑(Submonoid.closure (s ∪ t)) ↔ z ∈ ↑(Submonoid.closure s) * ↑(Submonoid.closure t)
[PROOFSTEP]
simp [Submonoid.closure_union, Submonoid.mem_sup, Set.mem_mul]
[GOAL]
R : Type u
A : Type v
B : Type w
inst✝⁶ : CommSemiring R
inst✝⁵ : CommSemiring A
inst✝⁴ : Algebra R A
s✝ t : Set A
inst✝³ : Semiring B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
s : Set B
⊢ adjoin A ↑(adjoin R s) = adjoin A s
[PROOFSTEP]
apply le_antisymm (adjoin_le _)
[GOAL]
R : Type u
A : Type v
B : Type w
inst✝⁶ : CommSemiring R
inst✝⁵ : CommSemiring A
inst✝⁴ : Algebra R A
s✝ t : Set A
inst✝³ : Semiring B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
s : Set B
⊢ adjoin A s ≤ adjoin A ↑(adjoin R s)
[PROOFSTEP]
exact adjoin_mono subset_adjoin
[GOAL]
R : Type u
A : Type v
B : Type w
inst✝⁶ : CommSemiring R
inst✝⁵ : CommSemiring A
inst✝⁴ : Algebra R A
s✝ t : Set A
inst✝³ : Semiring B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
s : Set B
⊢ ↑(adjoin R s) ⊆ ↑(adjoin A s)
[PROOFSTEP]
change adjoin R s ≤ (adjoin A s).restrictScalars R
[GOAL]
R : Type u
A : Type v
B : Type w
inst✝⁶ : CommSemiring R
inst✝⁵ : CommSemiring A
inst✝⁴ : Algebra R A
s✝ t : Set A
inst✝³ : Semiring B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
s : Set B
⊢ adjoin R s ≤ Subalgebra.restrictScalars R (adjoin A s)
[PROOFSTEP]
refine'
  adjoin_le
    _
      -- porting note: unclear why this was broken
[GOAL]
R : Type u
A : Type v
B : Type w
inst✝⁶ : CommSemiring R
inst✝⁵ : CommSemiring A
inst✝⁴ : Algebra R A
s✝ t : Set A
inst✝³ : Semiring B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
s : Set B
⊢ s ⊆ ↑(Subalgebra.restrictScalars R (adjoin A s))
[PROOFSTEP]
have : (Subalgebra.restrictScalars R (adjoin A s) : Set B) = adjoin A s := rfl
[GOAL]
R : Type u
A : Type v
B : Type w
inst✝⁶ : CommSemiring R
inst✝⁵ : CommSemiring A
inst✝⁴ : Algebra R A
s✝ t : Set A
inst✝³ : Semiring B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
s : Set B
this : ↑(Subalgebra.restrictScalars R (adjoin A s)) = ↑(adjoin A s)
⊢ s ⊆ ↑(Subalgebra.restrictScalars R (adjoin A s))
[PROOFSTEP]
rw [this]
[GOAL]
R : Type u
A : Type v
B : Type w
inst✝⁶ : CommSemiring R
inst✝⁵ : CommSemiring A
inst✝⁴ : Algebra R A
s✝ t : Set A
inst✝³ : Semiring B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
s : Set B
this : ↑(Subalgebra.restrictScalars R (adjoin A s)) = ↑(adjoin A s)
⊢ s ⊆ ↑(adjoin A s)
[PROOFSTEP]
exact subset_adjoin
[GOAL]
R : Type u
A : Type v
B : Type w
inst✝⁶ : CommSemiring R
inst✝⁵ : CommSemiring A
inst✝⁴ : Algebra R A
s✝ t : Set A
inst✝³ : CommSemiring B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
r : A
s : Set B
B' : Subalgebra R B
hs : r • s ⊆ ↑B'
x : B
hx : x ∈ adjoin R s
hr : ↑(algebraMap A B) r ∈ B'
⊢ ∃ n₀, ∀ (n : ℕ), n ≥ n₀ → r ^ n • x ∈ B'
[PROOFSTEP]
replace hx : x ∈ Subalgebra.toSubmodule (adjoin R s) := hx
[GOAL]
R : Type u
A : Type v
B : Type w
inst✝⁶ : CommSemiring R
inst✝⁵ : CommSemiring A
inst✝⁴ : Algebra R A
s✝ t : Set A
inst✝³ : CommSemiring B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
r : A
s : Set B
B' : Subalgebra R B
hs : r • s ⊆ ↑B'
x : B
hr : ↑(algebraMap A B) r ∈ B'
hx : x ∈ ↑Subalgebra.toSubmodule (adjoin R s)
⊢ ∃ n₀, ∀ (n : ℕ), n ≥ n₀ → r ^ n • x ∈ B'
[PROOFSTEP]
rw [adjoin_eq_span, Finsupp.mem_span_iff_total] at hx
[GOAL]
R : Type u
A : Type v
B : Type w
inst✝⁶ : CommSemiring R
inst✝⁵ : CommSemiring A
inst✝⁴ : Algebra R A
s✝ t : Set A
inst✝³ : CommSemiring B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
r : A
s : Set B
B' : Subalgebra R B
hs : r • s ⊆ ↑B'
x : B
hr : ↑(algebraMap A B) r ∈ B'
hx : ∃ l, ↑(Finsupp.total (↑↑(Submonoid.closure s)) B R Subtype.val) l = x
⊢ ∃ n₀, ∀ (n : ℕ), n ≥ n₀ → r ^ n • x ∈ B'
[PROOFSTEP]
rcases hx with ⟨l, rfl : (l.sum fun (i : Submonoid.closure s) (c : R) => c • (i : B)) = x⟩
[GOAL]
case intro
R : Type u
A : Type v
B : Type w
inst✝⁶ : CommSemiring R
inst✝⁵ : CommSemiring A
inst✝⁴ : Algebra R A
s✝ t : Set A
inst✝³ : CommSemiring B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
r : A
s : Set B
B' : Subalgebra R B
hs : r • s ⊆ ↑B'
hr : ↑(algebraMap A B) r ∈ B'
l : ↑↑(Submonoid.closure s) →₀ R
⊢ ∃ n₀, ∀ (n : ℕ), n ≥ n₀ → (r ^ n • Finsupp.sum l fun i c => c • ↑i) ∈ B'
[PROOFSTEP]
choose n₁ n₂ using fun x : Submonoid.closure s => Submonoid.pow_smul_mem_closure_smul r s x.prop
[GOAL]
case intro
R : Type u
A : Type v
B : Type w
inst✝⁶ : CommSemiring R
inst✝⁵ : CommSemiring A
inst✝⁴ : Algebra R A
s✝ t : Set A
inst✝³ : CommSemiring B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
r : A
s : Set B
B' : Subalgebra R B
hs : r • s ⊆ ↑B'
hr : ↑(algebraMap A B) r ∈ B'
l : ↑↑(Submonoid.closure s) →₀ R
n₁ : { x // x ∈ Submonoid.closure s } → ℕ
n₂ : ∀ (x : { x // x ∈ Submonoid.closure s }), r ^ n₁ x • ↑x ∈ Submonoid.closure (r • s)
⊢ ∃ n₀, ∀ (n : ℕ), n ≥ n₀ → (r ^ n • Finsupp.sum l fun i c => c • ↑i) ∈ B'
[PROOFSTEP]
use l.support.sup n₁
[GOAL]
case h
R : Type u
A : Type v
B : Type w
inst✝⁶ : CommSemiring R
inst✝⁵ : CommSemiring A
inst✝⁴ : Algebra R A
s✝ t : Set A
inst✝³ : CommSemiring B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
r : A
s : Set B
B' : Subalgebra R B
hs : r • s ⊆ ↑B'
hr : ↑(algebraMap A B) r ∈ B'
l : ↑↑(Submonoid.closure s) →₀ R
n₁ : { x // x ∈ Submonoid.closure s } → ℕ
n₂ : ∀ (x : { x // x ∈ Submonoid.closure s }), r ^ n₁ x • ↑x ∈ Submonoid.closure (r • s)
⊢ ∀ (n : ℕ), n ≥ Finset.sup l.support n₁ → (r ^ n • Finsupp.sum l fun i c => c • ↑i) ∈ B'
[PROOFSTEP]
intro n hn
[GOAL]
case h
R : Type u
A : Type v
B : Type w
inst✝⁶ : CommSemiring R
inst✝⁵ : CommSemiring A
inst✝⁴ : Algebra R A
s✝ t : Set A
inst✝³ : CommSemiring B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
r : A
s : Set B
B' : Subalgebra R B
hs : r • s ⊆ ↑B'
hr : ↑(algebraMap A B) r ∈ B'
l : ↑↑(Submonoid.closure s) →₀ R
n₁ : { x // x ∈ Submonoid.closure s } → ℕ
n₂ : ∀ (x : { x // x ∈ Submonoid.closure s }), r ^ n₁ x • ↑x ∈ Submonoid.closure (r • s)
n : ℕ
hn : n ≥ Finset.sup l.support n₁
⊢ (r ^ n • Finsupp.sum l fun i c => c • ↑i) ∈ B'
[PROOFSTEP]
rw [Finsupp.smul_sum]
[GOAL]
case h
R : Type u
A : Type v
B : Type w
inst✝⁶ : CommSemiring R
inst✝⁵ : CommSemiring A
inst✝⁴ : Algebra R A
s✝ t : Set A
inst✝³ : CommSemiring B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
r : A
s : Set B
B' : Subalgebra R B
hs : r • s ⊆ ↑B'
hr : ↑(algebraMap A B) r ∈ B'
l : ↑↑(Submonoid.closure s) →₀ R
n₁ : { x // x ∈ Submonoid.closure s } → ℕ
n₂ : ∀ (x : { x // x ∈ Submonoid.closure s }), r ^ n₁ x • ↑x ∈ Submonoid.closure (r • s)
n : ℕ
hn : n ≥ Finset.sup l.support n₁
⊢ (Finsupp.sum l fun a b => r ^ n • b • ↑a) ∈ B'
[PROOFSTEP]
refine' B'.toSubmodule.sum_mem _
[GOAL]
case h
R : Type u
A : Type v
B : Type w
inst✝⁶ : CommSemiring R
inst✝⁵ : CommSemiring A
inst✝⁴ : Algebra R A
s✝ t : Set A
inst✝³ : CommSemiring B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
r : A
s : Set B
B' : Subalgebra R B
hs : r • s ⊆ ↑B'
hr : ↑(algebraMap A B) r ∈ B'
l : ↑↑(Submonoid.closure s) →₀ R
n₁ : { x // x ∈ Submonoid.closure s } → ℕ
n₂ : ∀ (x : { x // x ∈ Submonoid.closure s }), r ^ n₁ x • ↑x ∈ Submonoid.closure (r • s)
n : ℕ
hn : n ≥ Finset.sup l.support n₁
⊢ ∀ (c : ↑↑(Submonoid.closure s)), c ∈ l.support → (fun a b => r ^ n • b • ↑a) c (↑l c) ∈ ↑Subalgebra.toSubmodule B'
[PROOFSTEP]
intro a ha
[GOAL]
case h
R : Type u
A : Type v
B : Type w
inst✝⁶ : CommSemiring R
inst✝⁵ : CommSemiring A
inst✝⁴ : Algebra R A
s✝ t : Set A
inst✝³ : CommSemiring B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
r : A
s : Set B
B' : Subalgebra R B
hs : r • s ⊆ ↑B'
hr : ↑(algebraMap A B) r ∈ B'
l : ↑↑(Submonoid.closure s) →₀ R
n₁ : { x // x ∈ Submonoid.closure s } → ℕ
n₂ : ∀ (x : { x // x ∈ Submonoid.closure s }), r ^ n₁ x • ↑x ∈ Submonoid.closure (r • s)
n : ℕ
hn : n ≥ Finset.sup l.support n₁
a : ↑↑(Submonoid.closure s)
ha : a ∈ l.support
⊢ (fun a b => r ^ n • b • ↑a) a (↑l a) ∈ ↑Subalgebra.toSubmodule B'
[PROOFSTEP]
have : n ≥ n₁ a := le_trans (Finset.le_sup ha) hn
[GOAL]
case h
R : Type u
A : Type v
B : Type w
inst✝⁶ : CommSemiring R
inst✝⁵ : CommSemiring A
inst✝⁴ : Algebra R A
s✝ t : Set A
inst✝³ : CommSemiring B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
r : A
s : Set B
B' : Subalgebra R B
hs : r • s ⊆ ↑B'
hr : ↑(algebraMap A B) r ∈ B'
l : ↑↑(Submonoid.closure s) →₀ R
n₁ : { x // x ∈ Submonoid.closure s } → ℕ
n₂ : ∀ (x : { x // x ∈ Submonoid.closure s }), r ^ n₁ x • ↑x ∈ Submonoid.closure (r • s)
n : ℕ
hn : n ≥ Finset.sup l.support n₁
a : ↑↑(Submonoid.closure s)
ha : a ∈ l.support
this : n ≥ n₁ a
⊢ (fun a b => r ^ n • b • ↑a) a (↑l a) ∈ ↑Subalgebra.toSubmodule B'
[PROOFSTEP]
dsimp only
[GOAL]
case h
R : Type u
A : Type v
B : Type w
inst✝⁶ : CommSemiring R
inst✝⁵ : CommSemiring A
inst✝⁴ : Algebra R A
s✝ t : Set A
inst✝³ : CommSemiring B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
r : A
s : Set B
B' : Subalgebra R B
hs : r • s ⊆ ↑B'
hr : ↑(algebraMap A B) r ∈ B'
l : ↑↑(Submonoid.closure s) →₀ R
n₁ : { x // x ∈ Submonoid.closure s } → ℕ
n₂ : ∀ (x : { x // x ∈ Submonoid.closure s }), r ^ n₁ x • ↑x ∈ Submonoid.closure (r • s)
n : ℕ
hn : n ≥ Finset.sup l.support n₁
a : ↑↑(Submonoid.closure s)
ha : a ∈ l.support
this : n ≥ n₁ a
⊢ r ^ n • ↑l a • ↑a ∈ ↑Subalgebra.toSubmodule B'
[PROOFSTEP]
rw [← tsub_add_cancel_of_le this, pow_add, ← smul_smul, ← IsScalarTower.algebraMap_smul A (l a) (a : B),
  smul_smul (r ^ n₁ a), mul_comm, ← smul_smul, smul_def, map_pow, IsScalarTower.algebraMap_smul]
[GOAL]
case h
R : Type u
A : Type v
B : Type w
inst✝⁶ : CommSemiring R
inst✝⁵ : CommSemiring A
inst✝⁴ : Algebra R A
s✝ t : Set A
inst✝³ : CommSemiring B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
r : A
s : Set B
B' : Subalgebra R B
hs : r • s ⊆ ↑B'
hr : ↑(algebraMap A B) r ∈ B'
l : ↑↑(Submonoid.closure s) →₀ R
n₁ : { x // x ∈ Submonoid.closure s } → ℕ
n₂ : ∀ (x : { x // x ∈ Submonoid.closure s }), r ^ n₁ x • ↑x ∈ Submonoid.closure (r • s)
n : ℕ
hn : n ≥ Finset.sup l.support n₁
a : ↑↑(Submonoid.closure s)
ha : a ∈ l.support
this : n ≥ n₁ a
⊢ ↑(algebraMap A B) r ^ (n - n₁ a) * ↑l a • r ^ n₁ a • ↑a ∈ ↑Subalgebra.toSubmodule B'
[PROOFSTEP]
apply Subalgebra.mul_mem _ (Subalgebra.pow_mem _ hr _) _
[GOAL]
R : Type u
A : Type v
B : Type w
inst✝⁶ : CommSemiring R
inst✝⁵ : CommSemiring A
inst✝⁴ : Algebra R A
s✝ t : Set A
inst✝³ : CommSemiring B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
r : A
s : Set B
B' : Subalgebra R B
hs : r • s ⊆ ↑B'
hr : ↑(algebraMap A B) r ∈ B'
l : ↑↑(Submonoid.closure s) →₀ R
n₁ : { x // x ∈ Submonoid.closure s } → ℕ
n₂ : ∀ (x : { x // x ∈ Submonoid.closure s }), r ^ n₁ x • ↑x ∈ Submonoid.closure (r • s)
n : ℕ
hn : n ≥ Finset.sup l.support n₁
a : ↑↑(Submonoid.closure s)
ha : a ∈ l.support
this : n ≥ n₁ a
⊢ ↑l a • r ^ n₁ a • ↑a ∈ B'
[PROOFSTEP]
refine' Subalgebra.smul_mem _ _ _
[GOAL]
R : Type u
A : Type v
B : Type w
inst✝⁶ : CommSemiring R
inst✝⁵ : CommSemiring A
inst✝⁴ : Algebra R A
s✝ t : Set A
inst✝³ : CommSemiring B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
r : A
s : Set B
B' : Subalgebra R B
hs : r • s ⊆ ↑B'
hr : ↑(algebraMap A B) r ∈ B'
l : ↑↑(Submonoid.closure s) →₀ R
n₁ : { x // x ∈ Submonoid.closure s } → ℕ
n₂ : ∀ (x : { x // x ∈ Submonoid.closure s }), r ^ n₁ x • ↑x ∈ Submonoid.closure (r • s)
n : ℕ
hn : n ≥ Finset.sup l.support n₁
a : ↑↑(Submonoid.closure s)
ha : a ∈ l.support
this : n ≥ n₁ a
⊢ r ^ n₁ a • ↑a ∈ B'
[PROOFSTEP]
change _ ∈ B'.toSubmonoid
[GOAL]
R : Type u
A : Type v
B : Type w
inst✝⁶ : CommSemiring R
inst✝⁵ : CommSemiring A
inst✝⁴ : Algebra R A
s✝ t : Set A
inst✝³ : CommSemiring B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
r : A
s : Set B
B' : Subalgebra R B
hs : r • s ⊆ ↑B'
hr : ↑(algebraMap A B) r ∈ B'
l : ↑↑(Submonoid.closure s) →₀ R
n₁ : { x // x ∈ Submonoid.closure s } → ℕ
n₂ : ∀ (x : { x // x ∈ Submonoid.closure s }), r ^ n₁ x • ↑x ∈ Submonoid.closure (r • s)
n : ℕ
hn : n ≥ Finset.sup l.support n₁
a : ↑↑(Submonoid.closure s)
ha : a ∈ l.support
this : n ≥ n₁ a
⊢ r ^ n₁ a • ↑a ∈ B'.toSubmonoid
[PROOFSTEP]
rw [← Submonoid.closure_eq B'.toSubmonoid]
[GOAL]
R : Type u
A : Type v
B : Type w
inst✝⁶ : CommSemiring R
inst✝⁵ : CommSemiring A
inst✝⁴ : Algebra R A
s✝ t : Set A
inst✝³ : CommSemiring B
inst✝² : Algebra R B
inst✝¹ : Algebra A B
inst✝ : IsScalarTower R A B
r : A
s : Set B
B' : Subalgebra R B
hs : r • s ⊆ ↑B'
hr : ↑(algebraMap A B) r ∈ B'
l : ↑↑(Submonoid.closure s) →₀ R
n₁ : { x // x ∈ Submonoid.closure s } → ℕ
n₂ : ∀ (x : { x // x ∈ Submonoid.closure s }), r ^ n₁ x • ↑x ∈ Submonoid.closure (r • s)
n : ℕ
hn : n ≥ Finset.sup l.support n₁
a : ↑↑(Submonoid.closure s)
ha : a ∈ l.support
this : n ≥ n₁ a
⊢ r ^ n₁ a • ↑a ∈ Submonoid.closure ↑B'.toSubmonoid
[PROOFSTEP]
apply Submonoid.closure_mono hs (n₂ a)


[GOAL]
α : Type u_1
inst✝¹ : Lattice α
inst✝ : IsWeakUpperModularLattice α
a b : α
⊢ a ⊓ b ⋖ a → a ⊓ b ⋖ b → b ⋖ a ⊔ b
[PROOFSTEP]
rw [inf_comm, sup_comm]
[GOAL]
α : Type u_1
inst✝¹ : Lattice α
inst✝ : IsWeakUpperModularLattice α
a b : α
⊢ b ⊓ a ⋖ a → b ⊓ a ⋖ b → b ⋖ b ⊔ a
[PROOFSTEP]
exact fun ha hb => covby_sup_of_inf_covby_of_inf_covby_left hb ha
[GOAL]
α : Type u_1
inst✝¹ : Lattice α
inst✝ : IsWeakLowerModularLattice α
a b : α
⊢ a ⋖ a ⊔ b → b ⋖ a ⊔ b → a ⊓ b ⋖ b
[PROOFSTEP]
rw [sup_comm, inf_comm]
[GOAL]
α : Type u_1
inst✝¹ : Lattice α
inst✝ : IsWeakLowerModularLattice α
a b : α
⊢ a ⋖ b ⊔ a → b ⋖ b ⊔ a → b ⊓ a ⋖ b
[PROOFSTEP]
exact fun ha hb => inf_covby_of_covby_sup_of_covby_sup_left hb ha
[GOAL]
α : Type u_1
inst✝¹ : Lattice α
inst✝ : IsUpperModularLattice α
a b : α
⊢ a ⊓ b ⋖ b → a ⋖ a ⊔ b
[PROOFSTEP]
rw [sup_comm, inf_comm]
[GOAL]
α : Type u_1
inst✝¹ : Lattice α
inst✝ : IsUpperModularLattice α
a b : α
⊢ b ⊓ a ⋖ b → a ⋖ b ⊔ a
[PROOFSTEP]
exact covby_sup_of_inf_covby_left
[GOAL]
α : Type u_1
inst✝¹ : Lattice α
inst✝ : IsLowerModularLattice α
a b : α
⊢ b ⋖ a ⊔ b → a ⊓ b ⋖ a
[PROOFSTEP]
rw [inf_comm, sup_comm]
[GOAL]
α : Type u_1
inst✝¹ : Lattice α
inst✝ : IsLowerModularLattice α
a b : α
⊢ b ⋖ b ⊔ a → b ⊓ a ⋖ a
[PROOFSTEP]
exact inf_covby_of_covby_sup_left
[GOAL]
α : Type u_1
inst✝¹ : Lattice α
inst✝ : IsModularLattice α
x y z : α
h : z ≤ x
⊢ x ⊓ y ⊔ z = x ⊓ (y ⊔ z)
[PROOFSTEP]
rw [inf_comm, sup_comm, ← sup_inf_assoc_of_le y h, inf_comm, sup_comm]
[GOAL]
α : Type u_1
inst✝¹ : Lattice α
inst✝ : IsModularLattice α
x✝ y z : αᵒᵈ
xz : x✝ ≤ z
⊢ (x✝ ⊔ y) ⊓ z = x✝ ⊔ y ⊓ z
[PROOFSTEP]
rw [inf_comm, sup_comm, eq_comm, inf_comm, sup_comm]
[GOAL]
α : Type u_1
inst✝¹ : Lattice α
inst✝ : IsModularLattice α
x✝ y z : αᵒᵈ
xz : x✝ ≤ z
⊢ z ⊓ y ⊔ x✝ = z ⊓ (y ⊔ x✝)
[PROOFSTEP]
exact @sup_inf_assoc_of_le α _ _ _ y _ xz
[GOAL]
α : Type u_1
inst✝¹ : Lattice α
inst✝ : IsModularLattice α
x y z : α
hxy : x ≤ y
hinf : y ⊓ z ≤ x ⊓ z
hsup : y ⊔ z ≤ x ⊔ z
h : y ≤ x ⊔ z
⊢ z ⊓ y ≤ z ⊓ x
[PROOFSTEP]
rw [inf_comm, @inf_comm _ _ z]
[GOAL]
α : Type u_1
inst✝¹ : Lattice α
inst✝ : IsModularLattice α
x y z : α
hxy : x ≤ y
hinf : y ⊓ z ≤ x ⊓ z
hsup : y ⊔ z ≤ x ⊔ z
h : y ≤ x ⊔ z
⊢ y ⊓ z ≤ x ⊓ z
[PROOFSTEP]
exact hinf
[GOAL]
α : Type u_1
inst✝³ : Lattice α
inst✝² : IsModularLattice α
x y z : α
β : Type u_2
γ : Type u_3
inst✝¹ : PartialOrder β
inst✝ : Preorder γ
h₁ : WellFounded fun x x_1 => x < x_1
h₂ : WellFounded fun x x_1 => x < x_1
K : α
f₁ : β → α
f₂ : α → β
g₁ : γ → α
g₂ : α → γ
gci : GaloisCoinsertion f₁ f₂
gi : GaloisInsertion g₂ g₁
hf : ∀ (a : α), f₁ (f₂ a) = a ⊓ K
hg : ∀ (a : α), g₁ (g₂ a) = a ⊔ K
A B : α
hAB : A < B
⊢ Prod.Lex (fun x x_1 => x < x_1) (fun x x_1 => x < x_1) (f₂ A, g₂ A) (f₂ B, g₂ B)
[PROOFSTEP]
simp only [Prod.lex_def, lt_iff_le_not_le, ← gci.l_le_l_iff, ← gi.u_le_u_iff, hf, hg, le_antisymm_iff]
[GOAL]
α : Type u_1
inst✝³ : Lattice α
inst✝² : IsModularLattice α
x y z : α
β : Type u_2
γ : Type u_3
inst✝¹ : PartialOrder β
inst✝ : Preorder γ
h₁ : WellFounded fun x x_1 => x < x_1
h₂ : WellFounded fun x x_1 => x < x_1
K : α
f₁ : β → α
f₂ : α → β
g₁ : γ → α
g₂ : α → γ
gci : GaloisCoinsertion f₁ f₂
gi : GaloisInsertion g₂ g₁
hf : ∀ (a : α), f₁ (f₂ a) = a ⊓ K
hg : ∀ (a : α), g₁ (g₂ a) = a ⊔ K
A B : α
hAB : A < B
⊢ A ⊓ K ≤ B ⊓ K ∧ ¬B ⊓ K ≤ A ⊓ K ∨ (A ⊓ K ≤ B ⊓ K ∧ B ⊓ K ≤ A ⊓ K) ∧ A ⊔ K ≤ B ⊔ K ∧ ¬B ⊔ K ≤ A ⊔ K
[PROOFSTEP]
simp only [gci.l_le_l_iff, gi.u_le_u_iff, ← lt_iff_le_not_le, ← le_antisymm_iff]
[GOAL]
α : Type u_1
inst✝³ : Lattice α
inst✝² : IsModularLattice α
x y z : α
β : Type u_2
γ : Type u_3
inst✝¹ : PartialOrder β
inst✝ : Preorder γ
h₁ : WellFounded fun x x_1 => x < x_1
h₂ : WellFounded fun x x_1 => x < x_1
K : α
f₁ : β → α
f₂ : α → β
g₁ : γ → α
g₂ : α → γ
gci : GaloisCoinsertion f₁ f₂
gi : GaloisInsertion g₂ g₁
hf : ∀ (a : α), f₁ (f₂ a) = a ⊓ K
hg : ∀ (a : α), g₁ (g₂ a) = a ⊔ K
A B : α
hAB : A < B
⊢ A ⊓ K < B ⊓ K ∨ A ⊓ K = B ⊓ K ∧ A ⊔ K < B ⊔ K
[PROOFSTEP]
cases' lt_or_eq_of_le (inf_le_inf_right K (le_of_lt hAB)) with h h
[GOAL]
case inl
α : Type u_1
inst✝³ : Lattice α
inst✝² : IsModularLattice α
x y z : α
β : Type u_2
γ : Type u_3
inst✝¹ : PartialOrder β
inst✝ : Preorder γ
h₁ : WellFounded fun x x_1 => x < x_1
h₂ : WellFounded fun x x_1 => x < x_1
K : α
f₁ : β → α
f₂ : α → β
g₁ : γ → α
g₂ : α → γ
gci : GaloisCoinsertion f₁ f₂
gi : GaloisInsertion g₂ g₁
hf : ∀ (a : α), f₁ (f₂ a) = a ⊓ K
hg : ∀ (a : α), g₁ (g₂ a) = a ⊔ K
A B : α
hAB : A < B
h : A ⊓ K < B ⊓ K
⊢ A ⊓ K < B ⊓ K ∨ A ⊓ K = B ⊓ K ∧ A ⊔ K < B ⊔ K
[PROOFSTEP]
exact Or.inl h
[GOAL]
case inr
α : Type u_1
inst✝³ : Lattice α
inst✝² : IsModularLattice α
x y z : α
β : Type u_2
γ : Type u_3
inst✝¹ : PartialOrder β
inst✝ : Preorder γ
h₁ : WellFounded fun x x_1 => x < x_1
h₂ : WellFounded fun x x_1 => x < x_1
K : α
f₁ : β → α
f₂ : α → β
g₁ : γ → α
g₂ : α → γ
gci : GaloisCoinsertion f₁ f₂
gi : GaloisInsertion g₂ g₁
hf : ∀ (a : α), f₁ (f₂ a) = a ⊓ K
hg : ∀ (a : α), g₁ (g₂ a) = a ⊔ K
A B : α
hAB : A < B
h : A ⊓ K = B ⊓ K
⊢ A ⊓ K < B ⊓ K ∨ A ⊓ K = B ⊓ K ∧ A ⊔ K < B ⊔ K
[PROOFSTEP]
exact Or.inr ⟨h, sup_lt_sup_of_lt_of_inf_le_inf hAB (le_of_eq h.symm)⟩
[GOAL]
α : Type u_1
inst✝¹ : Lattice α
inst✝ : IsModularLattice α
x✝ y z a b : α
x : ↑(Icc (a ⊓ b) a)
⊢ ↑((fun x => { val := a ⊓ ↑x, property := (_ : a ⊓ b ≤ a ⊓ ↑x ∧ a ⊓ ↑x ≤ a) })
        ((fun x => { val := ↑x ⊔ b, property := (_ : b ≤ ↑x ⊔ b ∧ ↑x ⊔ b ≤ a ⊔ b) }) x)) =
    ↑x
[PROOFSTEP]
change a ⊓ (↑x ⊔ b) = ↑x
[GOAL]
α : Type u_1
inst✝¹ : Lattice α
inst✝ : IsModularLattice α
x✝ y z a b : α
x : ↑(Icc (a ⊓ b) a)
⊢ a ⊓ (↑x ⊔ b) = ↑x
[PROOFSTEP]
rw [sup_comm, ← inf_sup_assoc_of_le _ x.prop.2, sup_eq_right.2 x.prop.1]
[GOAL]
α : Type u_1
inst✝¹ : Lattice α
inst✝ : IsModularLattice α
x✝ y z a b : α
x : ↑(Icc b (a ⊔ b))
⊢ ↑((fun x => { val := ↑x ⊔ b, property := (_ : b ≤ ↑x ⊔ b ∧ ↑x ⊔ b ≤ a ⊔ b) })
        ((fun x => { val := a ⊓ ↑x, property := (_ : a ⊓ b ≤ a ⊓ ↑x ∧ a ⊓ ↑x ≤ a) }) x)) =
    ↑x
[PROOFSTEP]
change a ⊓ ↑x ⊔ b = ↑x
[GOAL]
α : Type u_1
inst✝¹ : Lattice α
inst✝ : IsModularLattice α
x✝ y z a b : α
x : ↑(Icc b (a ⊔ b))
⊢ a ⊓ ↑x ⊔ b = ↑x
[PROOFSTEP]
rw [inf_comm, inf_sup_assoc_of_le _ x.prop.1, inf_eq_left.2 x.prop.2]
[GOAL]
α : Type u_1
inst✝¹ : Lattice α
inst✝ : IsModularLattice α
x✝ y✝ z a b : α
x y : ↑(Icc (a ⊓ b) a)
⊢ ↑{ toFun := fun x => { val := ↑x ⊔ b, property := (_ : b ≤ ↑x ⊔ b ∧ ↑x ⊔ b ≤ a ⊔ b) },
            invFun := fun x => { val := a ⊓ ↑x, property := (_ : a ⊓ b ≤ a ⊓ ↑x ∧ a ⊓ ↑x ≤ a) },
            left_inv :=
              (_ :
                ∀ (x : ↑(Icc (a ⊓ b) a)),
                  (fun x => { val := a ⊓ ↑x, property := (_ : a ⊓ b ≤ a ⊓ ↑x ∧ a ⊓ ↑x ≤ a) })
                      ((fun x => { val := ↑x ⊔ b, property := (_ : b ≤ ↑x ⊔ b ∧ ↑x ⊔ b ≤ a ⊔ b) }) x) =
                    x),
            right_inv :=
              (_ :
                ∀ (x : ↑(Icc b (a ⊔ b))),
                  (fun x => { val := ↑x ⊔ b, property := (_ : b ≤ ↑x ⊔ b ∧ ↑x ⊔ b ≤ a ⊔ b) })
                      ((fun x => { val := a ⊓ ↑x, property := (_ : a ⊓ b ≤ a ⊓ ↑x ∧ a ⊓ ↑x ≤ a) }) x) =
                    x) }
        x ≤
      ↑{ toFun := fun x => { val := ↑x ⊔ b, property := (_ : b ≤ ↑x ⊔ b ∧ ↑x ⊔ b ≤ a ⊔ b) },
            invFun := fun x => { val := a ⊓ ↑x, property := (_ : a ⊓ b ≤ a ⊓ ↑x ∧ a ⊓ ↑x ≤ a) },
            left_inv :=
              (_ :
                ∀ (x : ↑(Icc (a ⊓ b) a)),
                  (fun x => { val := a ⊓ ↑x, property := (_ : a ⊓ b ≤ a ⊓ ↑x ∧ a ⊓ ↑x ≤ a) })
                      ((fun x => { val := ↑x ⊔ b, property := (_ : b ≤ ↑x ⊔ b ∧ ↑x ⊔ b ≤ a ⊔ b) }) x) =
                    x),
            right_inv :=
              (_ :
                ∀ (x : ↑(Icc b (a ⊔ b))),
                  (fun x => { val := ↑x ⊔ b, property := (_ : b ≤ ↑x ⊔ b ∧ ↑x ⊔ b ≤ a ⊔ b) })
                      ((fun x => { val := a ⊓ ↑x, property := (_ : a ⊓ b ≤ a ⊓ ↑x ∧ a ⊓ ↑x ≤ a) }) x) =
                    x) }
        y ↔
    x ≤ y
[PROOFSTEP]
simp only [Subtype.mk_le_mk, Equiv.coe_fn_mk, and_true_iff, le_sup_right]
[GOAL]
α : Type u_1
inst✝¹ : Lattice α
inst✝ : IsModularLattice α
x✝ y✝ z a b : α
x y : ↑(Icc (a ⊓ b) a)
⊢ ↑x ⊔ b ≤ ↑y ⊔ b ↔ x ≤ y
[PROOFSTEP]
rw [← Subtype.coe_le_coe]
[GOAL]
α : Type u_1
inst✝¹ : Lattice α
inst✝ : IsModularLattice α
x✝ y✝ z a b : α
x y : ↑(Icc (a ⊓ b) a)
⊢ ↑x ⊔ b ≤ ↑y ⊔ b ↔ ↑x ≤ ↑y
[PROOFSTEP]
refine' ⟨fun h => _, fun h => sup_le_sup_right h _⟩
[GOAL]
α : Type u_1
inst✝¹ : Lattice α
inst✝ : IsModularLattice α
x✝ y✝ z a b : α
x y : ↑(Icc (a ⊓ b) a)
h : ↑x ⊔ b ≤ ↑y ⊔ b
⊢ ↑x ≤ ↑y
[PROOFSTEP]
rw [← sup_eq_right.2 x.prop.1, inf_sup_assoc_of_le _ x.prop.2, sup_comm, ← sup_eq_right.2 y.prop.1,
  inf_sup_assoc_of_le _ y.prop.2, @sup_comm _ _ b]
[GOAL]
α : Type u_1
inst✝¹ : Lattice α
inst✝ : IsModularLattice α
x✝ y✝ z a b : α
x y : ↑(Icc (a ⊓ b) a)
h : ↑x ⊔ b ≤ ↑y ⊔ b
⊢ a ⊓ (↑x ⊔ b) ≤ a ⊓ (↑y ⊔ b)
[PROOFSTEP]
exact inf_le_inf_left _ h
[GOAL]
α : Type u_1
inst✝¹ : Lattice α
inst✝ : IsModularLattice α
x y z a b : α
c : ↑(Ioo (a ⊓ b) a)
⊢ ↑((fun c => { val := a ⊓ ↑c, property := (_ : a ⊓ b < a ⊓ ↑c ∧ a ⊓ ↑c < a) })
        ((fun c => { val := ↑c ⊔ b, property := (_ : b < ↑c ⊔ b ∧ ↑c ⊔ b < a ⊔ b) }) c)) =
    ↑c
[PROOFSTEP]
dsimp
[GOAL]
α : Type u_1
inst✝¹ : Lattice α
inst✝ : IsModularLattice α
x y z a b : α
c : ↑(Ioo (a ⊓ b) a)
⊢ a ⊓ (↑c ⊔ b) = ↑c
[PROOFSTEP]
rw [sup_comm, ← inf_sup_assoc_of_le _ c.prop.2.le, sup_eq_right.2 c.prop.1.le]
[GOAL]
α : Type u_1
inst✝¹ : Lattice α
inst✝ : IsModularLattice α
x y z a b : α
c : ↑(Ioo b (a ⊔ b))
⊢ ↑((fun c => { val := ↑c ⊔ b, property := (_ : b < ↑c ⊔ b ∧ ↑c ⊔ b < a ⊔ b) })
        ((fun c => { val := a ⊓ ↑c, property := (_ : a ⊓ b < a ⊓ ↑c ∧ a ⊓ ↑c < a) }) c)) =
    ↑c
[PROOFSTEP]
dsimp
[GOAL]
α : Type u_1
inst✝¹ : Lattice α
inst✝ : IsModularLattice α
x y z a b : α
c : ↑(Ioo b (a ⊔ b))
⊢ a ⊓ ↑c ⊔ b = ↑c
[PROOFSTEP]
rw [inf_comm, inf_sup_assoc_of_le _ c.prop.1.le, inf_eq_left.2 c.prop.2.le]
[GOAL]
α : Type u_1
inst✝¹ : Lattice α
inst✝ : IsModularLattice α
x y z a b : α
⊢ a ⋖ a ⊔ b → a ⊓ b ⋖ b
[PROOFSTEP]
simp_rw [covby_iff_Ioo_eq, @sup_comm _ _ a, @inf_comm _ _ a, ← isEmpty_coe_sort, right_lt_sup, inf_lt_left,
  (infIooOrderIsoIooSup b a).symm.toEquiv.isEmpty_congr]
[GOAL]
α : Type u_1
inst✝¹ : Lattice α
inst✝ : IsModularLattice α
x y z a b : α
⊢ ¬b ≤ a ∧ IsEmpty ↑(Ioo (b ⊓ a) b) → ¬b ≤ a ∧ IsEmpty ↑(Ioo (b ⊓ a) b)
[PROOFSTEP]
exact id
[GOAL]
α : Type u_1
inst✝¹ : Lattice α
inst✝ : IsModularLattice α
x y z a b : α
⊢ a ⊓ b ⋖ a → b ⋖ a ⊔ b
[PROOFSTEP]
simp_rw [covby_iff_Ioo_eq, ← isEmpty_coe_sort, right_lt_sup, inf_lt_left,
  (infIooOrderIsoIooSup a b).toEquiv.isEmpty_congr]
[GOAL]
α : Type u_1
inst✝¹ : Lattice α
inst✝ : IsModularLattice α
x y z a b : α
⊢ ¬a ≤ b ∧ IsEmpty ↑(Ioo b (a ⊔ b)) → ¬a ≤ b ∧ IsEmpty ↑(Ioo b (a ⊔ b))
[PROOFSTEP]
exact id
[GOAL]
α : Type u_1
inst✝ : Lattice α
h : ∀ (x y z : α), x ⊓ z ⊔ y ⊓ z = (x ⊓ z ⊔ y) ⊓ z
x✝ y z : α
xz : x✝ ≤ z
⊢ (x✝ ⊔ y) ⊓ z ≤ x✝ ⊔ y ⊓ z
[PROOFSTEP]
rw [← inf_eq_left.2 xz, h]
[GOAL]
α : Type u_1
inst✝ : DistribLattice α
x✝ y z : α
xz : x✝ ≤ z
⊢ (x✝ ⊔ y) ⊓ z ≤ x✝ ⊔ y ⊓ z
[PROOFSTEP]
rw [inf_sup_right, inf_eq_left.2 xz]
[GOAL]
α : Type u_1
inst✝² : Lattice α
inst✝¹ : OrderBot α
inst✝ : IsModularLattice α
a b c : α
h : Disjoint a b
hsup : Disjoint (a ⊔ b) c
⊢ Disjoint a (b ⊔ c)
[PROOFSTEP]
rw [disjoint_iff_inf_le, ← h.eq_bot, sup_comm]
[GOAL]
α : Type u_1
inst✝² : Lattice α
inst✝¹ : OrderBot α
inst✝ : IsModularLattice α
a b c : α
h : Disjoint a b
hsup : Disjoint (a ⊔ b) c
⊢ a ⊓ (c ⊔ b) ≤ a ⊓ b
[PROOFSTEP]
apply le_inf inf_le_left
[GOAL]
α : Type u_1
inst✝² : Lattice α
inst✝¹ : OrderBot α
inst✝ : IsModularLattice α
a b c : α
h : Disjoint a b
hsup : Disjoint (a ⊔ b) c
⊢ a ⊓ (c ⊔ b) ≤ b
[PROOFSTEP]
apply (inf_le_inf_right (c ⊔ b) le_sup_right).trans
[GOAL]
α : Type u_1
inst✝² : Lattice α
inst✝¹ : OrderBot α
inst✝ : IsModularLattice α
a b c : α
h : Disjoint a b
hsup : Disjoint (a ⊔ b) c
⊢ (?m.28074 ⊔ a) ⊓ (c ⊔ b) ≤ b
α : Type u_1
inst✝² : Lattice α
inst✝¹ : OrderBot α
inst✝ : IsModularLattice α
a b c : α
h : Disjoint a b
hsup : Disjoint (a ⊔ b) c
⊢ α
[PROOFSTEP]
rw [sup_comm, IsModularLattice.sup_inf_sup_assoc, hsup.eq_bot, bot_sup_eq]
[GOAL]
α : Type u_1
inst✝² : Lattice α
inst✝¹ : OrderBot α
inst✝ : IsModularLattice α
a b c : α
h : Disjoint b c
hsup : Disjoint a (b ⊔ c)
⊢ Disjoint (a ⊔ b) c
[PROOFSTEP]
rw [disjoint_comm, sup_comm]
[GOAL]
α : Type u_1
inst✝² : Lattice α
inst✝¹ : OrderBot α
inst✝ : IsModularLattice α
a b c : α
h : Disjoint b c
hsup : Disjoint a (b ⊔ c)
⊢ Disjoint c (b ⊔ a)
[PROOFSTEP]
apply Disjoint.disjoint_sup_right_of_disjoint_sup_left h.symm
[GOAL]
α : Type u_1
inst✝² : Lattice α
inst✝¹ : OrderBot α
inst✝ : IsModularLattice α
a b c : α
h : Disjoint b c
hsup : Disjoint a (b ⊔ c)
⊢ Disjoint (c ⊔ b) a
[PROOFSTEP]
rwa [sup_comm, disjoint_comm] at hsup
[GOAL]
α : Type u_1
inst✝³ : Lattice α
inst✝² : IsModularLattice α
a : α
inst✝¹ : BoundedOrder α
inst✝ : ComplementedLattice α
x✝ : ↑(Iic a)
x : α
hx : x ∈ Iic a
y : α
hy : IsCompl x y
⊢ IsCompl { val := x, property := hx } { val := y ⊓ a, property := (_ : y ⊓ a ∈ Iic a) }
[PROOFSTEP]
constructor
[GOAL]
case disjoint
α : Type u_1
inst✝³ : Lattice α
inst✝² : IsModularLattice α
a : α
inst✝¹ : BoundedOrder α
inst✝ : ComplementedLattice α
x✝ : ↑(Iic a)
x : α
hx : x ∈ Iic a
y : α
hy : IsCompl x y
⊢ Disjoint { val := x, property := hx } { val := y ⊓ a, property := (_ : y ⊓ a ∈ Iic a) }
[PROOFSTEP]
rw [disjoint_iff_inf_le]
[GOAL]
case disjoint
α : Type u_1
inst✝³ : Lattice α
inst✝² : IsModularLattice α
a : α
inst✝¹ : BoundedOrder α
inst✝ : ComplementedLattice α
x✝ : ↑(Iic a)
x : α
hx : x ∈ Iic a
y : α
hy : IsCompl x y
⊢ { val := x, property := hx } ⊓ { val := y ⊓ a, property := (_ : y ⊓ a ∈ Iic a) } ≤ ⊥
[PROOFSTEP]
change
  x ⊓ (y ⊓ a) ≤
    ⊥
      -- improve lattice subtype API
[GOAL]
case disjoint
α : Type u_1
inst✝³ : Lattice α
inst✝² : IsModularLattice α
a : α
inst✝¹ : BoundedOrder α
inst✝ : ComplementedLattice α
x✝ : ↑(Iic a)
x : α
hx : x ∈ Iic a
y : α
hy : IsCompl x y
⊢ x ⊓ (y ⊓ a) ≤ ⊥
[PROOFSTEP]
rw [← inf_assoc]
[GOAL]
case disjoint
α : Type u_1
inst✝³ : Lattice α
inst✝² : IsModularLattice α
a : α
inst✝¹ : BoundedOrder α
inst✝ : ComplementedLattice α
x✝ : ↑(Iic a)
x : α
hx : x ∈ Iic a
y : α
hy : IsCompl x y
⊢ x ⊓ y ⊓ a ≤ ⊥
[PROOFSTEP]
exact le_trans inf_le_left hy.1.le_bot
[GOAL]
case codisjoint
α : Type u_1
inst✝³ : Lattice α
inst✝² : IsModularLattice α
a : α
inst✝¹ : BoundedOrder α
inst✝ : ComplementedLattice α
x✝ : ↑(Iic a)
x : α
hx : x ∈ Iic a
y : α
hy : IsCompl x y
⊢ Codisjoint { val := x, property := hx } { val := y ⊓ a, property := (_ : y ⊓ a ∈ Iic a) }
[PROOFSTEP]
rw [codisjoint_iff_le_sup]
[GOAL]
case codisjoint
α : Type u_1
inst✝³ : Lattice α
inst✝² : IsModularLattice α
a : α
inst✝¹ : BoundedOrder α
inst✝ : ComplementedLattice α
x✝ : ↑(Iic a)
x : α
hx : x ∈ Iic a
y : α
hy : IsCompl x y
⊢ ⊤ ≤ { val := x, property := hx } ⊔ { val := y ⊓ a, property := (_ : y ⊓ a ∈ Iic a) }
[PROOFSTEP]
change a ≤ x ⊔ y ⊓ a
[GOAL]
case codisjoint
α : Type u_1
inst✝³ : Lattice α
inst✝² : IsModularLattice α
a : α
inst✝¹ : BoundedOrder α
inst✝ : ComplementedLattice α
x✝ : ↑(Iic a)
x : α
hx : x ∈ Iic a
y : α
hy : IsCompl x y
⊢ a ≤ x ⊔ y ⊓ a
[PROOFSTEP]
rw [← sup_inf_assoc_of_le _ (Set.mem_Iic.1 hx), hy.2.eq_top, top_inf_eq]
[GOAL]
α : Type u_1
inst✝³ : Lattice α
inst✝² : IsModularLattice α
a : α
inst✝¹ : BoundedOrder α
inst✝ : ComplementedLattice α
x✝ : ↑(Ici a)
x : α
hx : x ∈ Ici a
y : α
hy : IsCompl x y
⊢ IsCompl { val := x, property := hx } { val := y ⊔ a, property := (_ : y ⊔ a ∈ Ici a) }
[PROOFSTEP]
constructor
[GOAL]
case disjoint
α : Type u_1
inst✝³ : Lattice α
inst✝² : IsModularLattice α
a : α
inst✝¹ : BoundedOrder α
inst✝ : ComplementedLattice α
x✝ : ↑(Ici a)
x : α
hx : x ∈ Ici a
y : α
hy : IsCompl x y
⊢ Disjoint { val := x, property := hx } { val := y ⊔ a, property := (_ : y ⊔ a ∈ Ici a) }
[PROOFSTEP]
rw [disjoint_iff_inf_le]
[GOAL]
case disjoint
α : Type u_1
inst✝³ : Lattice α
inst✝² : IsModularLattice α
a : α
inst✝¹ : BoundedOrder α
inst✝ : ComplementedLattice α
x✝ : ↑(Ici a)
x : α
hx : x ∈ Ici a
y : α
hy : IsCompl x y
⊢ { val := x, property := hx } ⊓ { val := y ⊔ a, property := (_ : y ⊔ a ∈ Ici a) } ≤ ⊥
[PROOFSTEP]
change x ⊓ (y ⊔ a) ≤ a
[GOAL]
case disjoint
α : Type u_1
inst✝³ : Lattice α
inst✝² : IsModularLattice α
a : α
inst✝¹ : BoundedOrder α
inst✝ : ComplementedLattice α
x✝ : ↑(Ici a)
x : α
hx : x ∈ Ici a
y : α
hy : IsCompl x y
⊢ x ⊓ (y ⊔ a) ≤ a
[PROOFSTEP]
rw [← inf_sup_assoc_of_le _ (Set.mem_Ici.1 hx), hy.1.eq_bot, bot_sup_eq]
[GOAL]
case codisjoint
α : Type u_1
inst✝³ : Lattice α
inst✝² : IsModularLattice α
a : α
inst✝¹ : BoundedOrder α
inst✝ : ComplementedLattice α
x✝ : ↑(Ici a)
x : α
hx : x ∈ Ici a
y : α
hy : IsCompl x y
⊢ Codisjoint { val := x, property := hx } { val := y ⊔ a, property := (_ : y ⊔ a ∈ Ici a) }
[PROOFSTEP]
rw [codisjoint_iff_le_sup]
[GOAL]
case codisjoint
α : Type u_1
inst✝³ : Lattice α
inst✝² : IsModularLattice α
a : α
inst✝¹ : BoundedOrder α
inst✝ : ComplementedLattice α
x✝ : ↑(Ici a)
x : α
hx : x ∈ Ici a
y : α
hy : IsCompl x y
⊢ ⊤ ≤ { val := x, property := hx } ⊔ { val := y ⊔ a, property := (_ : y ⊔ a ∈ Ici a) }
[PROOFSTEP]
change
  ⊤ ≤
    x ⊔
      (y ⊔ a)
        -- improve lattice subtype API
[GOAL]
case codisjoint
α : Type u_1
inst✝³ : Lattice α
inst✝² : IsModularLattice α
a : α
inst✝¹ : BoundedOrder α
inst✝ : ComplementedLattice α
x✝ : ↑(Ici a)
x : α
hx : x ∈ Ici a
y : α
hy : IsCompl x y
⊢ ⊤ ≤ x ⊔ (y ⊔ a)
[PROOFSTEP]
rw [← sup_assoc]
[GOAL]
case codisjoint
α : Type u_1
inst✝³ : Lattice α
inst✝² : IsModularLattice α
a : α
inst✝¹ : BoundedOrder α
inst✝ : ComplementedLattice α
x✝ : ↑(Ici a)
x : α
hx : x ∈ Ici a
y : α
hy : IsCompl x y
⊢ ⊤ ≤ x ⊔ y ⊔ a
[PROOFSTEP]
exact le_trans hy.2.top_le le_sup_left


[GOAL]
α : Type u_1
M : Type ?u.8804
N : Type ?u.8800
inst✝² : Mul N
inst✝¹ : SMul M N
inst✝ : IsScalarTower M N N
x : M
y : Nᵐᵒᵖ
z : N
⊢ x • y • z = y • x • z
[PROOFSTEP]
induction y using MulOpposite.rec'
[GOAL]
case h
α : Type u_1
M : Type ?u.8804
N : Type ?u.8800
inst✝² : Mul N
inst✝¹ : SMul M N
inst✝ : IsScalarTower M N N
x : M
z X✝ : N
⊢ x • op X✝ • z = op X✝ • x • z
[PROOFSTEP]
simp only [smul_mul_assoc, MulOpposite.smul_eq_mul_unop]


[GOAL]
α : Type u
α' : Type w
β : Type v
β' : Type x
γ✝ : Type u_1
δ : Type u_2
γ : α ⊕ β → Sort u_3
p : ((ab : α ⊕ β) → γ ab) → Prop
h : ∀ (fa : (val : α) → γ (inl val)) (fb : (val : β) → γ (inr val)), p fun t => rec fa fb t
fab : (ab : α ⊕ β) → γ ab
⊢ p fab
[PROOFSTEP]
have h1 : fab = Sum.rec (fun a => fab (Sum.inl a)) (fun b => fab (Sum.inr b)) := by ext ab; cases ab <;> rfl
[GOAL]
α : Type u
α' : Type w
β : Type v
β' : Type x
γ✝ : Type u_1
δ : Type u_2
γ : α ⊕ β → Sort u_3
p : ((ab : α ⊕ β) → γ ab) → Prop
h : ∀ (fa : (val : α) → γ (inl val)) (fb : (val : β) → γ (inr val)), p fun t => rec fa fb t
fab : (ab : α ⊕ β) → γ ab
⊢ fab = fun t => rec (fun a => fab (inl a)) (fun b => fab (inr b)) t
[PROOFSTEP]
ext ab
[GOAL]
case h
α : Type u
α' : Type w
β : Type v
β' : Type x
γ✝ : Type u_1
δ : Type u_2
γ : α ⊕ β → Sort u_3
p : ((ab : α ⊕ β) → γ ab) → Prop
h : ∀ (fa : (val : α) → γ (inl val)) (fb : (val : β) → γ (inr val)), p fun t => rec fa fb t
fab : (ab : α ⊕ β) → γ ab
ab : α ⊕ β
⊢ fab ab = rec (fun a => fab (inl a)) (fun b => fab (inr b)) ab
[PROOFSTEP]
cases ab
[GOAL]
case h.inl
α : Type u
α' : Type w
β : Type v
β' : Type x
γ✝ : Type u_1
δ : Type u_2
γ : α ⊕ β → Sort u_3
p : ((ab : α ⊕ β) → γ ab) → Prop
h : ∀ (fa : (val : α) → γ (inl val)) (fb : (val : β) → γ (inr val)), p fun t => rec fa fb t
fab : (ab : α ⊕ β) → γ ab
val✝ : α
⊢ fab (inl val✝) = rec (fun a => fab (inl a)) (fun b => fab (inr b)) (inl val✝)
[PROOFSTEP]
rfl
[GOAL]
case h.inr
α : Type u
α' : Type w
β : Type v
β' : Type x
γ✝ : Type u_1
δ : Type u_2
γ : α ⊕ β → Sort u_3
p : ((ab : α ⊕ β) → γ ab) → Prop
h : ∀ (fa : (val : α) → γ (inl val)) (fb : (val : β) → γ (inr val)), p fun t => rec fa fb t
fab : (ab : α ⊕ β) → γ ab
val✝ : β
⊢ fab (inr val✝) = rec (fun a => fab (inl a)) (fun b => fab (inr b)) (inr val✝)
[PROOFSTEP]
rfl
[GOAL]
α : Type u
α' : Type w
β : Type v
β' : Type x
γ✝ : Type u_1
δ : Type u_2
γ : α ⊕ β → Sort u_3
p : ((ab : α ⊕ β) → γ ab) → Prop
h : ∀ (fa : (val : α) → γ (inl val)) (fb : (val : β) → γ (inr val)), p fun t => rec fa fb t
fab : (ab : α ⊕ β) → γ ab
h1 : fab = fun t => rec (fun a => fab (inl a)) (fun b => fab (inr b)) t
⊢ p fab
[PROOFSTEP]
rw [h1]
[GOAL]
α : Type u
α' : Type w
β : Type v
β' : Type x
γ✝ : Type u_1
δ : Type u_2
γ : α ⊕ β → Sort u_3
p : ((ab : α ⊕ β) → γ ab) → Prop
h : ∀ (fa : (val : α) → γ (inl val)) (fb : (val : β) → γ (inr val)), p fun t => rec fa fb t
fab : (ab : α ⊕ β) → γ ab
h1 : fab = fun t => rec (fun a => fab (inl a)) (fun b => fab (inr b)) t
⊢ p fun t => rec (fun a => fab (inl a)) (fun b => fab (inr b)) t
[PROOFSTEP]
exact h _ _
[GOAL]
α : Type u
α' : Type w
β : Type v
β' : Type x
γ✝ : Type u_1
δ : Type u_2
γ : α ⊕ β → Sort u_3
p : ((ab : α ⊕ β) → γ ab) → Prop
⊢ (∃ fab, p fab) ↔ ∃ fa fb, p fun t => rec fa fb t
[PROOFSTEP]
rw [← not_forall_not, forall_sum_pi]
[GOAL]
α : Type u
α' : Type w
β : Type v
β' : Type x
γ✝ : Type u_1
δ : Type u_2
γ : α ⊕ β → Sort u_3
p : ((ab : α ⊕ β) → γ ab) → Prop
⊢ (¬∀ (fa : (val : α) → γ (inl val)) (fb : (val : β) → γ (inr val)), ¬p fun t => rec fa fb t) ↔
    ∃ fa fb, p fun t => rec fa fb t
[PROOFSTEP]
simp
[GOAL]
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
x y : α ⊕ β
⊢ getLeft? x = none ↔ isRight x = true
[PROOFSTEP]
cases x
[GOAL]
case inl
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
y : α ⊕ β
val✝ : α
⊢ getLeft? (inl val✝) = none ↔ isRight (inl val✝) = true
[PROOFSTEP]
simp only [getLeft?, isRight, eq_self_iff_true]
[GOAL]
case inr
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
y : α ⊕ β
val✝ : β
⊢ getLeft? (inr val✝) = none ↔ isRight (inr val✝) = true
[PROOFSTEP]
simp only [getLeft?, isRight, eq_self_iff_true]
[GOAL]
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
x y : α ⊕ β
⊢ getRight? x = none ↔ isLeft x = true
[PROOFSTEP]
cases x
[GOAL]
case inl
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
y : α ⊕ β
val✝ : α
⊢ getRight? (inl val✝) = none ↔ isLeft (inl val✝) = true
[PROOFSTEP]
simp only [getRight?, isLeft, eq_self_iff_true]
[GOAL]
case inr
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
y : α ⊕ β
val✝ : β
⊢ getRight? (inr val✝) = none ↔ isLeft (inr val✝) = true
[PROOFSTEP]
simp only [getRight?, isLeft, eq_self_iff_true]
[GOAL]
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
x y : α ⊕ β
a : α
⊢ getLeft? x = some a ↔ x = inl a
[PROOFSTEP]
cases x
[GOAL]
case inl
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
y : α ⊕ β
a val✝ : α
⊢ getLeft? (inl val✝) = some a ↔ inl val✝ = inl a
[PROOFSTEP]
simp only [getLeft?, Option.some.injEq, inl.injEq]
[GOAL]
case inr
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
y : α ⊕ β
a : α
val✝ : β
⊢ getLeft? (inr val✝) = some a ↔ inr val✝ = inl a
[PROOFSTEP]
simp only [getLeft?, Option.some.injEq, inl.injEq]
[GOAL]
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
x y : α ⊕ β
b : β
⊢ getRight? x = some b ↔ x = inr b
[PROOFSTEP]
cases x
[GOAL]
case inl
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
y : α ⊕ β
b : β
val✝ : α
⊢ getRight? (inl val✝) = some b ↔ inl val✝ = inr b
[PROOFSTEP]
simp only [getRight?, Option.some.injEq, inr.injEq]
[GOAL]
case inr
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
y : α ⊕ β
b val✝ : β
⊢ getRight? (inr val✝) = some b ↔ inr val✝ = inr b
[PROOFSTEP]
simp only [getRight?, Option.some.injEq, inr.injEq]
[GOAL]
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
x✝ y x : α ⊕ β
⊢ (!isLeft x) = isRight x
[PROOFSTEP]
cases x
[GOAL]
case inl
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
x y : α ⊕ β
val✝ : α
⊢ (!isLeft (inl val✝)) = isRight (inl val✝)
[PROOFSTEP]
rfl
[GOAL]
case inr
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
x y : α ⊕ β
val✝ : β
⊢ (!isLeft (inr val✝)) = isRight (inr val✝)
[PROOFSTEP]
rfl
[GOAL]
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
x y : α ⊕ β
⊢ isLeft x = false ↔ isRight x = true
[PROOFSTEP]
cases x
[GOAL]
case inl
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
y : α ⊕ β
val✝ : α
⊢ isLeft (inl val✝) = false ↔ isRight (inl val✝) = true
[PROOFSTEP]
simp
[GOAL]
case inr
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
y : α ⊕ β
val✝ : β
⊢ isLeft (inr val✝) = false ↔ isRight (inr val✝) = true
[PROOFSTEP]
simp
[GOAL]
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
x y : α ⊕ β
⊢ ¬isLeft x = true ↔ isRight x = true
[PROOFSTEP]
simp
[GOAL]
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
x✝ y x : α ⊕ β
⊢ (!decide (isRight x = isLeft x)) = true
[PROOFSTEP]
cases x
[GOAL]
case inl
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
x y : α ⊕ β
val✝ : α
⊢ (!decide (isRight (inl val✝) = isLeft (inl val✝))) = true
[PROOFSTEP]
rfl
[GOAL]
case inr
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
x y : α ⊕ β
val✝ : β
⊢ (!decide (isRight (inr val✝) = isLeft (inr val✝))) = true
[PROOFSTEP]
rfl
[GOAL]
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
x y : α ⊕ β
⊢ isRight x = false ↔ isLeft x = true
[PROOFSTEP]
cases x
[GOAL]
case inl
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
y : α ⊕ β
val✝ : α
⊢ isRight (inl val✝) = false ↔ isLeft (inl val✝) = true
[PROOFSTEP]
simp
[GOAL]
case inr
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
y : α ⊕ β
val✝ : β
⊢ isRight (inr val✝) = false ↔ isLeft (inr val✝) = true
[PROOFSTEP]
simp
[GOAL]
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
x y : α ⊕ β
⊢ ¬isRight x = true ↔ isLeft x = true
[PROOFSTEP]
simp
[GOAL]
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
x y : α ⊕ β
⊢ isLeft x = true ↔ ∃ y, x = inl y
[PROOFSTEP]
cases x
[GOAL]
case inl
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
y : α ⊕ β
val✝ : α
⊢ isLeft (inl val✝) = true ↔ ∃ y, inl val✝ = inl y
[PROOFSTEP]
simp
[GOAL]
case inr
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
y : α ⊕ β
val✝ : β
⊢ isLeft (inr val✝) = true ↔ ∃ y, inr val✝ = inl y
[PROOFSTEP]
simp
[GOAL]
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
x y : α ⊕ β
⊢ isRight x = true ↔ ∃ y, x = inr y
[PROOFSTEP]
cases x
[GOAL]
case inl
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
y : α ⊕ β
val✝ : α
⊢ isRight (inl val✝) = true ↔ ∃ y, inl val✝ = inr y
[PROOFSTEP]
simp
[GOAL]
case inr
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
y : α ⊕ β
val✝ : β
⊢ isRight (inr val✝) = true ↔ ∃ y, inr val✝ = inr y
[PROOFSTEP]
simp
[GOAL]
α✝ : Type u
α' : Type w
β✝ : Type v
β' : Type x
γ✝ : Type u_1
δ✝ : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
δ : Type u_6
ε : Sort u_7
f₁ : α → β
f₂ : β → ε
g₁ : γ → δ
g₂ : δ → ε
x : α ⊕ γ
⊢ Sum.elim f₂ g₂ (Sum.map f₁ g₁ x) = Sum.elim (f₂ ∘ f₁) (g₂ ∘ g₁) x
[PROOFSTEP]
cases x
[GOAL]
case inl
α✝ : Type u
α' : Type w
β✝ : Type v
β' : Type x
γ✝ : Type u_1
δ✝ : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
δ : Type u_6
ε : Sort u_7
f₁ : α → β
f₂ : β → ε
g₁ : γ → δ
g₂ : δ → ε
val✝ : α
⊢ Sum.elim f₂ g₂ (Sum.map f₁ g₁ (inl val✝)) = Sum.elim (f₂ ∘ f₁) (g₂ ∘ g₁) (inl val✝)
[PROOFSTEP]
rfl
[GOAL]
case inr
α✝ : Type u
α' : Type w
β✝ : Type v
β' : Type x
γ✝ : Type u_1
δ✝ : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
δ : Type u_6
ε : Sort u_7
f₁ : α → β
f₂ : β → ε
g₁ : γ → δ
g₂ : δ → ε
val✝ : γ
⊢ Sum.elim f₂ g₂ (Sum.map f₁ g₁ (inr val✝)) = Sum.elim (f₂ ∘ f₁) (g₂ ∘ g₁) (inr val✝)
[PROOFSTEP]
rfl
[GOAL]
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
f : α → β
g : γ → δ
x : α ⊕ γ
⊢ isLeft (Sum.map f g x) = isLeft x
[PROOFSTEP]
cases x
[GOAL]
case inl
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
f : α → β
g : γ → δ
val✝ : α
⊢ isLeft (Sum.map f g (inl val✝)) = isLeft (inl val✝)
[PROOFSTEP]
rfl
[GOAL]
case inr
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
f : α → β
g : γ → δ
val✝ : γ
⊢ isLeft (Sum.map f g (inr val✝)) = isLeft (inr val✝)
[PROOFSTEP]
rfl
[GOAL]
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
f : α → β
g : γ → δ
x : α ⊕ γ
⊢ isRight (Sum.map f g x) = isRight x
[PROOFSTEP]
cases x
[GOAL]
case inl
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
f : α → β
g : γ → δ
val✝ : α
⊢ isRight (Sum.map f g (inl val✝)) = isRight (inl val✝)
[PROOFSTEP]
rfl
[GOAL]
case inr
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
f : α → β
g : γ → δ
val✝ : γ
⊢ isRight (Sum.map f g (inr val✝)) = isRight (inr val✝)
[PROOFSTEP]
rfl
[GOAL]
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
f : α → β
g : γ → δ
x : α ⊕ γ
⊢ getLeft? (Sum.map f g x) = Option.map f (getLeft? x)
[PROOFSTEP]
cases x
[GOAL]
case inl
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
f : α → β
g : γ → δ
val✝ : α
⊢ getLeft? (Sum.map f g (inl val✝)) = Option.map f (getLeft? (inl val✝))
[PROOFSTEP]
rfl
[GOAL]
case inr
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
f : α → β
g : γ → δ
val✝ : γ
⊢ getLeft? (Sum.map f g (inr val✝)) = Option.map f (getLeft? (inr val✝))
[PROOFSTEP]
rfl
[GOAL]
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
f : α → β
g : γ → δ
x : α ⊕ γ
⊢ getRight? (Sum.map f g x) = Option.map g (getRight? x)
[PROOFSTEP]
cases x
[GOAL]
case inl
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
f : α → β
g : γ → δ
val✝ : α
⊢ getRight? (Sum.map f g (inl val✝)) = Option.map g (getRight? (inl val✝))
[PROOFSTEP]
rfl
[GOAL]
case inr
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
f : α → β
g : γ → δ
val✝ : γ
⊢ getRight? (Sum.map f g (inr val✝)) = Option.map g (getRight? (inr val✝))
[PROOFSTEP]
rfl
[GOAL]
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq (α ⊕ β)
f : α → γ
g : β → γ
i : α
x : γ
⊢ x = Sum.elim (update f i x) g (inl i)
[PROOFSTEP]
simp
[GOAL]
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq (α ⊕ β)
f : α → γ
g : β → γ
i : α
x : γ
⊢ ∀ (x_1 : α ⊕ β), x_1 ≠ inl i → Sum.elim f g x_1 = Sum.elim (update f i x) g x_1
[PROOFSTEP]
simp (config := { contextual := true })
[GOAL]
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
inst✝¹ : DecidableEq β
inst✝ : DecidableEq (α ⊕ β)
f : α → γ
g : β → γ
i : β
x : γ
⊢ x = Sum.elim f (update g i x) (inr i)
[PROOFSTEP]
simp
[GOAL]
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
inst✝¹ : DecidableEq β
inst✝ : DecidableEq (α ⊕ β)
f : α → γ
g : β → γ
i : β
x : γ
⊢ ∀ (x_1 : α ⊕ β), x_1 ≠ inr i → Sum.elim f g x_1 = Sum.elim f (update g i x) x_1
[PROOFSTEP]
simp (config := { contextual := true })
[GOAL]
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq (α ⊕ β)
f : α ⊕ β → γ
i j : α
x : γ
⊢ update f (inl i) x (inl j) = update (f ∘ inl) i x j
[PROOFSTEP]
rw [← update_inl_comp_inl, Function.comp_apply]
[GOAL]
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
inst✝¹ : DecidableEq β
inst✝ : DecidableEq (α ⊕ β)
f : α ⊕ β → γ
i j : β
x : γ
⊢ update f (inr i) x (inr j) = update (f ∘ inr) i x j
[PROOFSTEP]
rw [← update_inr_comp_inr, Function.comp_apply]
[GOAL]
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
x : α ⊕ β
⊢ swap (swap x) = x
[PROOFSTEP]
cases x
[GOAL]
case inl
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
val✝ : α
⊢ swap (swap (inl val✝)) = inl val✝
[PROOFSTEP]
rfl
[GOAL]
case inr
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
val✝ : β
⊢ swap (swap (inr val✝)) = inr val✝
[PROOFSTEP]
rfl
[GOAL]
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
x : α ⊕ β
⊢ isLeft (swap x) = isRight x
[PROOFSTEP]
cases x
[GOAL]
case inl
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
val✝ : α
⊢ isLeft (swap (inl val✝)) = isRight (inl val✝)
[PROOFSTEP]
rfl
[GOAL]
case inr
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
val✝ : β
⊢ isLeft (swap (inr val✝)) = isRight (inr val✝)
[PROOFSTEP]
rfl
[GOAL]
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
x : α ⊕ β
⊢ isRight (swap x) = isLeft x
[PROOFSTEP]
cases x
[GOAL]
case inl
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
val✝ : α
⊢ isRight (swap (inl val✝)) = isLeft (inl val✝)
[PROOFSTEP]
rfl
[GOAL]
case inr
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
val✝ : β
⊢ isRight (swap (inr val✝)) = isLeft (inr val✝)
[PROOFSTEP]
rfl
[GOAL]
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
x : α ⊕ β
⊢ getLeft? (swap x) = getRight? x
[PROOFSTEP]
cases x
[GOAL]
case inl
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
val✝ : α
⊢ getLeft? (swap (inl val✝)) = getRight? (inl val✝)
[PROOFSTEP]
rfl
[GOAL]
case inr
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
val✝ : β
⊢ getLeft? (swap (inr val✝)) = getRight? (inr val✝)
[PROOFSTEP]
rfl
[GOAL]
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
x : α ⊕ β
⊢ getRight? (swap x) = getLeft? x
[PROOFSTEP]
cases x
[GOAL]
case inl
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
val✝ : α
⊢ getRight? (swap (inl val✝)) = getLeft? (inl val✝)
[PROOFSTEP]
rfl
[GOAL]
case inr
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
val✝ : β
⊢ getRight? (swap (inr val✝)) = getLeft? (inr val✝)
[PROOFSTEP]
rfl
[GOAL]
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
r r₁ r₂ : α → γ → Prop
s s₁ s₂ : β → δ → Prop
a : α
b : β
c : γ
d : δ
x : α ⊕ β
y : γ ⊕ δ
h : LiftRel r s (inl a) (inl c)
⊢ r a c
[PROOFSTEP]
cases h
[GOAL]
case inl
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
r r₁ r₂ : α → γ → Prop
s s₁ s₂ : β → δ → Prop
a : α
b : β
c : γ
d : δ
x : α ⊕ β
y : γ ⊕ δ
a✝ : r a c
⊢ r a c
[PROOFSTEP]
assumption
[GOAL]
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
r r₁ r₂ : α → γ → Prop
s s₁ s₂ : β → δ → Prop
a : α
b : β
c : γ
d : δ
x : α ⊕ β
y : γ ⊕ δ
h : LiftRel r s (inr b) (inr d)
⊢ s b d
[PROOFSTEP]
cases h
[GOAL]
case inr
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
r r₁ r₂ : α → γ → Prop
s s₁ s₂ : β → δ → Prop
a : α
b : β
c : γ
d : δ
x : α ⊕ β
y : γ ⊕ δ
a✝ : s b d
⊢ s b d
[PROOFSTEP]
assumption
[GOAL]
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
r r₁ r₂ : α → γ → Prop
s s₁ s₂ : β → δ → Prop
a : α
b : β
c : γ
d : δ
x : α ⊕ β
y : γ ⊕ δ
hr : ∀ (a : α) (b : γ), r₁ a b → r₂ a b
hs : ∀ (a : β) (b : δ), s₁ a b → s₂ a b
h : LiftRel r₁ s₁ x y
⊢ LiftRel r₂ s₂ x y
[PROOFSTEP]
cases h
[GOAL]
case inl
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
r r₁ r₂ : α → γ → Prop
s s₁ s₂ : β → δ → Prop
a : α
b : β
c : γ
d : δ
hr : ∀ (a : α) (b : γ), r₁ a b → r₂ a b
hs : ∀ (a : β) (b : δ), s₁ a b → s₂ a b
a✝¹ : α
c✝ : γ
a✝ : r₁ a✝¹ c✝
⊢ LiftRel r₂ s₂ (inl a✝¹) (inl c✝)
[PROOFSTEP]
exact LiftRel.inl (hr _ _ ‹_›)
[GOAL]
case inr
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
r r₁ r₂ : α → γ → Prop
s s₁ s₂ : β → δ → Prop
a : α
b : β
c : γ
d : δ
hr : ∀ (a : α) (b : γ), r₁ a b → r₂ a b
hs : ∀ (a : β) (b : δ), s₁ a b → s₂ a b
b✝ : β
d✝ : δ
a✝ : s₁ b✝ d✝
⊢ LiftRel r₂ s₂ (inr b✝) (inr d✝)
[PROOFSTEP]
exact LiftRel.inr (hs _ _ ‹_›)
[GOAL]
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
r r₁ r₂ : α → γ → Prop
s s₁ s₂ : β → δ → Prop
a : α
b : β
c : γ
d : δ
x : α ⊕ β
y : γ ⊕ δ
h : LiftRel r s x y
⊢ LiftRel s r (swap x) (swap y)
[PROOFSTEP]
cases h
[GOAL]
case inl
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
r r₁ r₂ : α → γ → Prop
s s₁ s₂ : β → δ → Prop
a : α
b : β
c : γ
d : δ
a✝¹ : α
c✝ : γ
a✝ : r a✝¹ c✝
⊢ LiftRel s r (swap (inl a✝¹)) (swap (inl c✝))
[PROOFSTEP]
exact LiftRel.inr ‹_›
[GOAL]
case inr
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
r r₁ r₂ : α → γ → Prop
s s₁ s₂ : β → δ → Prop
a : α
b : β
c : γ
d : δ
b✝ : β
d✝ : δ
a✝ : s b✝ d✝
⊢ LiftRel s r (swap (inr b✝)) (swap (inr d✝))
[PROOFSTEP]
exact LiftRel.inl ‹_›
[GOAL]
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
r r₁ r₂ : α → γ → Prop
s s₁ s₂ : β → δ → Prop
a : α
b : β
c : γ
d : δ
x : α ⊕ β
y : γ ⊕ δ
h : LiftRel s r (swap x) (swap y)
⊢ LiftRel r s x y
[PROOFSTEP]
rw [← swap_swap x, ← swap_swap y]
[GOAL]
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
r r₁ r₂ : α → γ → Prop
s s₁ s₂ : β → δ → Prop
a : α
b : β
c : γ
d : δ
x : α ⊕ β
y : γ ⊕ δ
h : LiftRel s r (swap x) (swap y)
⊢ LiftRel r s (swap (swap x)) (swap (swap y))
[PROOFSTEP]
exact h.swap
[GOAL]
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
r r₁ r₂ : α → α → Prop
s s₁ s₂ : β → β → Prop
a a₁ a₂ : α
b b₁ b₂ : β
x y : α ⊕ β
h : Lex r s (inl a₁) (inl a₂)
⊢ r a₁ a₂
[PROOFSTEP]
cases h
[GOAL]
case inl
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
r r₁ r₂ : α → α → Prop
s s₁ s₂ : β → β → Prop
a a₁ a₂ : α
b b₁ b₂ : β
x y : α ⊕ β
h✝ : r a₁ a₂
⊢ r a₁ a₂
[PROOFSTEP]
assumption
[GOAL]
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
r r₁ r₂ : α → α → Prop
s s₁ s₂ : β → β → Prop
a a₁ a₂ : α
b b₁ b₂ : β
x y : α ⊕ β
h : Lex r s (inr b₁) (inr b₂)
⊢ s b₁ b₂
[PROOFSTEP]
cases h
[GOAL]
case inr
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
r r₁ r₂ : α → α → Prop
s s₁ s₂ : β → β → Prop
a a₁ a₂ : α
b b₁ b₂ : β
x y : α ⊕ β
h✝ : s b₁ b₂
⊢ s b₁ b₂
[PROOFSTEP]
assumption
[GOAL]
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
r r₁ r₂ : α → α → Prop
s s₁ s₂ : β → β → Prop
a✝ a₁ a₂ : α
b✝ b₁ b₂ : β
x y a b : α ⊕ β
h : LiftRel r s a b
⊢ Lex r s a b
[PROOFSTEP]
cases h
[GOAL]
case inl
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
r r₁ r₂ : α → α → Prop
s s₁ s₂ : β → β → Prop
a a₁ a₂ : α
b b₁ b₂ : β
x y : α ⊕ β
a✝¹ c✝ : α
a✝ : r a✝¹ c✝
⊢ Lex r s (inl a✝¹) (inl c✝)
[PROOFSTEP]
exact Lex.inl ‹_›
[GOAL]
case inr
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
r r₁ r₂ : α → α → Prop
s s₁ s₂ : β → β → Prop
a a₁ a₂ : α
b b₁ b₂ : β
x y : α ⊕ β
b✝ d✝ : β
a✝ : s b✝ d✝
⊢ Lex r s (inr b✝) (inr d✝)
[PROOFSTEP]
exact Lex.inr ‹_›
[GOAL]
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
r r₁ r₂ : α → α → Prop
s s₁ s₂ : β → β → Prop
a a₁ a₂ : α
b b₁ b₂ : β
x y : α ⊕ β
hr : ∀ (a b : α), r₁ a b → r₂ a b
hs : ∀ (a b : β), s₁ a b → s₂ a b
h : Lex r₁ s₁ x y
⊢ Lex r₂ s₂ x y
[PROOFSTEP]
cases h
[GOAL]
case inl
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
r r₁ r₂ : α → α → Prop
s s₁ s₂ : β → β → Prop
a a₁ a₂ : α
b b₁ b₂ : β
hr : ∀ (a b : α), r₁ a b → r₂ a b
hs : ∀ (a b : β), s₁ a b → s₂ a b
a₁✝ a₂✝ : α
h✝ : r₁ a₁✝ a₂✝
⊢ Lex r₂ s₂ (inl a₁✝) (inl a₂✝)
[PROOFSTEP]
exact Lex.inl (hr _ _ ‹_›)
[GOAL]
case inr
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
r r₁ r₂ : α → α → Prop
s s₁ s₂ : β → β → Prop
a a₁ a₂ : α
b b₁ b₂ : β
hr : ∀ (a b : α), r₁ a b → r₂ a b
hs : ∀ (a b : β), s₁ a b → s₂ a b
b₁✝ b₂✝ : β
h✝ : s₁ b₁✝ b₂✝
⊢ Lex r₂ s₂ (inr b₁✝) (inr b₂✝)
[PROOFSTEP]
exact Lex.inr (hs _ _ ‹_›)
[GOAL]
case sep
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
r r₁ r₂ : α → α → Prop
s s₁ s₂ : β → β → Prop
a a₁ a₂ : α
b b₁ b₂ : β
hr : ∀ (a b : α), r₁ a b → r₂ a b
hs : ∀ (a b : β), s₁ a b → s₂ a b
a✝ : α
b✝ : β
⊢ Lex r₂ s₂ (inl a✝) (inr b✝)
[PROOFSTEP]
exact Lex.sep _ _
[GOAL]
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
r r₁ r₂ : α → α → Prop
s s₁ s₂ : β → β → Prop
a✝ a₁ a₂ : α
b b₁ b₂ : β
x y : α ⊕ β
a : α
aca : Acc r a
⊢ Acc (Lex r s) (inl a)
[PROOFSTEP]
induction' aca with a _ IH
[GOAL]
case intro
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
r r₁ r₂ : α → α → Prop
s s₁ s₂ : β → β → Prop
a✝¹ a₁ a₂ : α
b b₁ b₂ : β
x y : α ⊕ β
a✝ a : α
h✝ : ∀ (y : α), r y a → Acc r y
IH : ∀ (y : α), r y a → Acc (Lex r s) (inl y)
⊢ Acc (Lex r s) (inl a)
[PROOFSTEP]
constructor
[GOAL]
case intro.h
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
r r₁ r₂ : α → α → Prop
s s₁ s₂ : β → β → Prop
a✝¹ a₁ a₂ : α
b b₁ b₂ : β
x y : α ⊕ β
a✝ a : α
h✝ : ∀ (y : α), r y a → Acc r y
IH : ∀ (y : α), r y a → Acc (Lex r s) (inl y)
⊢ ∀ (y : α ⊕ β), Lex r s y (inl a) → Acc (Lex r s) y
[PROOFSTEP]
intro y h
[GOAL]
case intro.h
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
r r₁ r₂ : α → α → Prop
s s₁ s₂ : β → β → Prop
a✝¹ a₁ a₂ : α
b b₁ b₂ : β
x y✝ : α ⊕ β
a✝ a : α
h✝ : ∀ (y : α), r y a → Acc r y
IH : ∀ (y : α), r y a → Acc (Lex r s) (inl y)
y : α ⊕ β
h : Lex r s y (inl a)
⊢ Acc (Lex r s) y
[PROOFSTEP]
cases' h with a' _ h'
[GOAL]
case intro.h.inl
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
r r₁ r₂ : α → α → Prop
s s₁ s₂ : β → β → Prop
a✝¹ a₁ a₂ : α
b b₁ b₂ : β
x y : α ⊕ β
a✝ a : α
h✝ : ∀ (y : α), r y a → Acc r y
IH : ∀ (y : α), r y a → Acc (Lex r s) (inl y)
a' : α
h' : r a' a
⊢ Acc (Lex r s) (inl a')
[PROOFSTEP]
exact IH _ h'
[GOAL]
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
r r₁ r₂ : α → α → Prop
s s₁ s₂ : β → β → Prop
a a₁ a₂ : α
b✝ b₁ b₂ : β
x y : α ⊕ β
aca : ∀ (a : α), Acc (Lex r s) (inl a)
b : β
acb : Acc s b
⊢ Acc (Lex r s) (inr b)
[PROOFSTEP]
induction' acb with b _ IH
[GOAL]
case intro
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
r r₁ r₂ : α → α → Prop
s s₁ s₂ : β → β → Prop
a a₁ a₂ : α
b✝¹ b₁ b₂ : β
x y : α ⊕ β
aca : ∀ (a : α), Acc (Lex r s) (inl a)
b✝ b : β
h✝ : ∀ (y : β), s y b → Acc s y
IH : ∀ (y : β), s y b → Acc (Lex r s) (inr y)
⊢ Acc (Lex r s) (inr b)
[PROOFSTEP]
constructor
[GOAL]
case intro.h
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
r r₁ r₂ : α → α → Prop
s s₁ s₂ : β → β → Prop
a a₁ a₂ : α
b✝¹ b₁ b₂ : β
x y : α ⊕ β
aca : ∀ (a : α), Acc (Lex r s) (inl a)
b✝ b : β
h✝ : ∀ (y : β), s y b → Acc s y
IH : ∀ (y : β), s y b → Acc (Lex r s) (inr y)
⊢ ∀ (y : α ⊕ β), Lex r s y (inr b) → Acc (Lex r s) y
[PROOFSTEP]
intro y h
[GOAL]
case intro.h
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
r r₁ r₂ : α → α → Prop
s s₁ s₂ : β → β → Prop
a a₁ a₂ : α
b✝¹ b₁ b₂ : β
x y✝ : α ⊕ β
aca : ∀ (a : α), Acc (Lex r s) (inl a)
b✝ b : β
h✝ : ∀ (y : β), s y b → Acc s y
IH : ∀ (y : β), s y b → Acc (Lex r s) (inr y)
y : α ⊕ β
h : Lex r s y (inr b)
⊢ Acc (Lex r s) y
[PROOFSTEP]
cases' h with _ _ _ b' _ h' a
[GOAL]
case intro.h.inr
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
r r₁ r₂ : α → α → Prop
s s₁ s₂ : β → β → Prop
a a₁ a₂ : α
b✝¹ b₁ b₂ : β
x y : α ⊕ β
aca : ∀ (a : α), Acc (Lex r s) (inl a)
b✝ b : β
h✝ : ∀ (y : β), s y b → Acc s y
IH : ∀ (y : β), s y b → Acc (Lex r s) (inr y)
b' : β
h' : s b' b
⊢ Acc (Lex r s) (inr b')
[PROOFSTEP]
exact IH _ h'
[GOAL]
case intro.h.sep
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
r r₁ r₂ : α → α → Prop
s s₁ s₂ : β → β → Prop
a✝ a₁ a₂ : α
b✝¹ b₁ b₂ : β
x y : α ⊕ β
aca : ∀ (a : α), Acc (Lex r s) (inl a)
b✝ b : β
h✝ : ∀ (y : β), s y b → Acc s y
IH : ∀ (y : β), s y b → Acc (Lex r s) (inr y)
a : α
⊢ Acc (Lex r s) (inl a)
[PROOFSTEP]
exact aca _
[GOAL]
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
f : α → γ
g : β → δ
h : Surjective (Sum.map f g)
c : γ
⊢ ∃ a, f a = c
[PROOFSTEP]
obtain ⟨a | b, h⟩ := h (inl c)
[GOAL]
case intro.inl
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
f : α → γ
g : β → δ
h✝ : Surjective (Sum.map f g)
c : γ
a : α
h : Sum.map f g (inl a) = inl c
⊢ ∃ a, f a = c
[PROOFSTEP]
exact ⟨a, inl_injective h⟩
[GOAL]
case intro.inr
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
f : α → γ
g : β → δ
h✝ : Surjective (Sum.map f g)
c : γ
b : β
h : Sum.map f g (inr b) = inl c
⊢ ∃ a, f a = c
[PROOFSTEP]
cases h
[GOAL]
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
f : α → γ
g : β → δ
h : Surjective (Sum.map f g)
d : δ
⊢ ∃ a, g a = d
[PROOFSTEP]
obtain ⟨a | b, h⟩ := h (inr d)
[GOAL]
case intro.inl
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
f : α → γ
g : β → δ
h✝ : Surjective (Sum.map f g)
d : δ
a : α
h : Sum.map f g (inl a) = inr d
⊢ ∃ a, g a = d
[PROOFSTEP]
cases h
[GOAL]
case intro.inr
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
f : α → γ
g : β → δ
h✝ : Surjective (Sum.map f g)
d : δ
b : β
h : Sum.map f g (inr b) = inr d
⊢ ∃ a, g a = d
[PROOFSTEP]
exact ⟨b, inr_injective h⟩
[GOAL]
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
c : γ
⊢ Sum.elim (const α c) (const β c) = const (α ⊕ β) c
[PROOFSTEP]
ext x
[GOAL]
case h
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
c : γ
x : α ⊕ β
⊢ Sum.elim (const α c) (const β c) x = const (α ⊕ β) c x
[PROOFSTEP]
cases x
[GOAL]
case h.inl
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
c : γ
val✝ : α
⊢ Sum.elim (const α c) (const β c) (inl val✝) = const (α ⊕ β) c (inl val✝)
[PROOFSTEP]
rfl
[GOAL]
case h.inr
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
c : γ
val✝ : β
⊢ Sum.elim (const α c) (const β c) (inr val✝) = const (α ⊕ β) c (inr val✝)
[PROOFSTEP]
rfl
[GOAL]
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
f : α → γ
g : β → γ
i : α
c : γ
⊢ Sum.elim (update f i c) g = update (Sum.elim f g) (inl i) c
[PROOFSTEP]
ext x
[GOAL]
case h
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
f : α → γ
g : β → γ
i : α
c : γ
x : α ⊕ β
⊢ Sum.elim (update f i c) g x = update (Sum.elim f g) (inl i) c x
[PROOFSTEP]
rcases x with x | x
[GOAL]
case h.inl
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
f : α → γ
g : β → γ
i : α
c : γ
x : α
⊢ Sum.elim (update f i c) g (inl x) = update (Sum.elim f g) (inl i) c (inl x)
[PROOFSTEP]
by_cases h : x = i
[GOAL]
case pos
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
f : α → γ
g : β → γ
i : α
c : γ
x : α
h : x = i
⊢ Sum.elim (update f i c) g (inl x) = update (Sum.elim f g) (inl i) c (inl x)
[PROOFSTEP]
subst h
[GOAL]
case pos
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
f : α → γ
g : β → γ
c : γ
x : α
⊢ Sum.elim (update f x c) g (inl x) = update (Sum.elim f g) (inl x) c (inl x)
[PROOFSTEP]
simp
[GOAL]
case neg
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
f : α → γ
g : β → γ
i : α
c : γ
x : α
h : ¬x = i
⊢ Sum.elim (update f i c) g (inl x) = update (Sum.elim f g) (inl i) c (inl x)
[PROOFSTEP]
simp [h]
[GOAL]
case h.inr
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
f : α → γ
g : β → γ
i : α
c : γ
x : β
⊢ Sum.elim (update f i c) g (inr x) = update (Sum.elim f g) (inl i) c (inr x)
[PROOFSTEP]
simp
[GOAL]
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
f : α → γ
g : β → γ
i : β
c : γ
⊢ Sum.elim f (update g i c) = update (Sum.elim f g) (inr i) c
[PROOFSTEP]
ext x
[GOAL]
case h
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
f : α → γ
g : β → γ
i : β
c : γ
x : α ⊕ β
⊢ Sum.elim f (update g i c) x = update (Sum.elim f g) (inr i) c x
[PROOFSTEP]
rcases x with x | x
[GOAL]
case h.inl
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
f : α → γ
g : β → γ
i : β
c : γ
x : α
⊢ Sum.elim f (update g i c) (inl x) = update (Sum.elim f g) (inr i) c (inl x)
[PROOFSTEP]
simp
[GOAL]
case h.inr
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
f : α → γ
g : β → γ
i : β
c : γ
x : β
⊢ Sum.elim f (update g i c) (inr x) = update (Sum.elim f g) (inr i) c (inr x)
[PROOFSTEP]
by_cases h : x = i
[GOAL]
case pos
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
f : α → γ
g : β → γ
i : β
c : γ
x : β
h : x = i
⊢ Sum.elim f (update g i c) (inr x) = update (Sum.elim f g) (inr i) c (inr x)
[PROOFSTEP]
subst h
[GOAL]
case pos
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
f : α → γ
g : β → γ
c : γ
x : β
⊢ Sum.elim f (update g x c) (inr x) = update (Sum.elim f g) (inr x) c (inr x)
[PROOFSTEP]
simp
[GOAL]
case neg
α : Type u
α' : Type w
β : Type v
β' : Type x
γ : Type u_1
δ : Type u_2
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
f : α → γ
g : β → γ
i : β
c : γ
x : β
h : ¬x = i
⊢ Sum.elim f (update g i c) (inr x) = update (Sum.elim f g) (inr i) c (inr x)
[PROOFSTEP]
simp [h]