case basic
M : Type u_1
inst✝¹ : Monoid M
s✝ : Set M
A : Type ?u.66965
inst✝ : AddMonoid A
t : Set A
s : Set M
a a✝¹ : M
a✝ : a✝¹ ∈ s
⊢ ∃ l, (∀ (x : M), x ∈ l → x ∈ s) ∧ List.prod l = a✝¹

case one
M : Type u_1
inst✝¹ : Monoid M
s✝ : Set M
A : Type ?u.66965
inst✝ : AddMonoid A
t : Set A
s : Set M
a : M
⊢ ∃ l, (∀ (x : M), x ∈ l → x ∈ s) ∧ List.prod l = 1

case mul
M : Type u_1
inst✝¹ : Monoid M
s✝ : Set M
A : Type ?u.66965
inst✝ : AddMonoid A
t : Set A
s : Set M
a a✝² b✝ : M
a✝¹ : InClosure s a✝²
a✝ : InClosure s b✝
a_ih✝¹ : ∃ l, (∀ (x : M), x ∈ l → x ∈ s) ∧ List.prod l = a✝²
a_ih✝ : ∃ l, (∀ (x : M), x ∈ l → x ∈ s) ∧ List.prod l = b✝
⊢ ∃ l, (∀ (x : M), x ∈ l → x ∈ s) ∧ List.prod l = a✝² * b✝
M : Type u_1
inst✝¹ : Monoid M
s✝ : Set M
A : Type ?u.66965
inst✝ : AddMonoid A
t : Set A
s : Set M
a : M
h : a ∈ Closure s
⊢ ∃ l, (∀ (x : M), x ∈ l → x ∈ s) ∧ List.prod l = a
induction h
case one
M : Type u_1
inst✝¹ : Monoid M
s✝ : Set M
A : Type ?u.66965
inst✝ : AddMonoid A
t : Set A
s : Set M
a : M
⊢ ∃ l, (∀ (x : M), x ∈ l → x ∈ s) ∧ List.prod l = 1

case mul
M : Type u_1
inst✝¹ : Monoid M
s✝ : Set M
A : Type ?u.66965
inst✝ : AddMonoid A
t : Set A
s : Set M
a a✝² b✝ : M
a✝¹ : InClosure s a✝²
a✝ : InClosure s b✝
a_ih✝¹ : ∃ l, (∀ (x : M), x ∈ l → x ∈ s) ∧ List.prod l = a✝²
a_ih✝ : ∃ l, (∀ (x : M), x ∈ l → x ∈ s) ∧ List.prod l = b✝
⊢ ∃ l, (∀ (x : M), x ∈ l → x ∈ s) ∧ List.prod l = a✝² * b✝
case basic
M : Type u_1
inst✝¹ : Monoid M
s✝ : Set M
A : Type ?u.66965
inst✝ : AddMonoid A
t : Set A
s : Set M
a a✝¹ : M
a✝ : a✝¹ ∈ s
⊢ ∃ l, (∀ (x : M), x ∈ l → x ∈ s) ∧ List.prod l = a✝¹

case one
M : Type u_1
inst✝¹ : Monoid M
s✝ : Set M
A : Type ?u.66965
inst✝ : AddMonoid A
t : Set A
s : Set M
a : M
⊢ ∃ l, (∀ (x : M), x ∈ l → x ∈ s) ∧ List.prod l = 1

case mul
M : Type u_1
inst✝¹ : Monoid M
s✝ : Set M
A : Type ?u.66965
inst✝ : AddMonoid A
t : Set A
s : Set M
a a✝² b✝ : M
a✝¹ : InClosure s a✝²
a✝ : InClosure s b✝
a_ih✝¹ : ∃ l, (∀ (x : M), x ∈ l → x ∈ s) ∧ List.prod l = a✝²
a_ih✝ : ∃ l, (∀ (x : M), x ∈ l → x ∈ s) ∧ List.prod l = b✝
⊢ ∃ l, (∀ (x : M), x ∈ l → x ∈ s) ∧ List.prod l = a✝² * b✝
case basic a ha => exists [a]; simp [ha]
case mul
M : Type u_1
inst✝¹ : Monoid M
s✝ : Set M
A : Type ?u.66965
inst✝ : AddMonoid A
t : Set A
s : Set M
a a✝² b✝ : M
a✝¹ : InClosure s a✝²
a✝ : InClosure s b✝
a_ih✝¹ : ∃ l, (∀ (x : M), x ∈ l → x ∈ s) ∧ List.prod l = a✝²
a_ih✝ : ∃ l, (∀ (x : M), x ∈ l → x ∈ s) ∧ List.prod l = b✝
⊢ ∃ l, (∀ (x : M), x ∈ l → x ∈ s) ∧ List.prod l = a✝² * b✝
case one
M : Type u_1
inst✝¹ : Monoid M
s✝ : Set M
A : Type ?u.66965
inst✝ : AddMonoid A
t : Set A
s : Set M
a : M
⊢ ∃ l, (∀ (x : M), x ∈ l → x ∈ s) ∧ List.prod l = 1

case mul
M : Type u_1
inst✝¹ : Monoid M
s✝ : Set M
A : Type ?u.66965
inst✝ : AddMonoid A
t : Set A
s : Set M
a a✝² b✝ : M
a✝¹ : InClosure s a✝²
a✝ : InClosure s b✝
a_ih✝¹ : ∃ l, (∀ (x : M), x ∈ l → x ∈ s) ∧ List.prod l = a✝²
a_ih✝ : ∃ l, (∀ (x : M), x ∈ l → x ∈ s) ∧ List.prod l = b✝
⊢ ∃ l, (∀ (x : M), x ∈ l → x ∈ s) ∧ List.prod l = a✝² * b✝
case one => exists []; simp
no goals
case mul
M : Type u_1
inst✝¹ : Monoid M
s✝ : Set M
A : Type ?u.66965
inst✝ : AddMonoid A
t : Set A
s : Set M
a a✝² b✝ : M
a✝¹ : InClosure s a✝²
a✝ : InClosure s b✝
a_ih✝¹ : ∃ l, (∀ (x : M), x ∈ l → x ∈ s) ∧ List.prod l = a✝²
a_ih✝ : ∃ l, (∀ (x : M), x ∈ l → x ∈ s) ∧ List.prod l = b✝
⊢ ∃ l, (∀ (x : M), x ∈ l → x ∈ s) ∧ List.prod l = a✝² * b✝
case mul a b _ _ ha hb =>
  rcases ha with ⟨la, ha, eqa⟩
  rcases hb with ⟨lb, hb, eqb⟩
  exists la ++ lb
  simp [eqa.symm, eqb.symm, or_imp]
  exact fun a => ⟨ha a, hb a⟩
M : Type u_1
inst✝¹ : Monoid M
s✝ : Set M
A : Type ?u.66965
inst✝ : AddMonoid A
t : Set A
s : Set M
a✝ a : M
ha : a ∈ s
⊢ (∀ (x : M), x ∈ [a] → x ∈ s) ∧ List.prod [a] = a
M : Type u_1
inst✝¹ : Monoid M
s✝ : Set M
A : Type ?u.66965
inst✝ : AddMonoid A
t : Set A
s : Set M
a✝ a : M
ha : a ∈ s
⊢ ∃ l, (∀ (x : M), x ∈ l → x ∈ s) ∧ List.prod l = a
exists [a]
no goals
M : Type u_1
inst✝¹ : Monoid M
s✝ : Set M
A : Type ?u.66965
inst✝ : AddMonoid A
t : Set A
s : Set M
a✝ a : M
ha : a ∈ s
⊢ (∀ (x : M), x ∈ [a] → x ∈ s) ∧ List.prod [a] = a
simp [ha]
M : Type u_1
inst✝¹ : Monoid M
s✝ : Set M
A : Type ?u.66965
inst✝ : AddMonoid A
t : Set A
s : Set M
a : M
⊢ (∀ (x : M), x ∈ [] → x ∈ s) ∧ List.prod [] = 1
M : Type u_1
inst✝¹ : Monoid M
s✝ : Set M
A : Type ?u.66965
inst✝ : AddMonoid A
t : Set A
s : Set M
a : M
⊢ ∃ l, (∀ (x : M), x ∈ l → x ∈ s) ∧ List.prod l = 1
exists []
no goals
M : Type u_1
inst✝¹ : Monoid M
s✝ : Set M
A : Type ?u.66965
inst✝ : AddMonoid A
t : Set A
s : Set M
a : M
⊢ (∀ (x : M), x ∈ [] → x ∈ s) ∧ List.prod [] = 1
simp
case intro.intro
M : Type u_1
inst✝¹ : Monoid M
s✝ : Set M
A : Type ?u.66965
inst✝ : AddMonoid A
t : Set A
s : Set M
a✝² a b : M
a✝¹ : InClosure s a
a✝ : InClosure s b
hb : ∃ l, (∀ (x : M), x ∈ l → x ∈ s) ∧ List.prod l = b
la : List M
ha : ∀ (x : M), x ∈ la → x ∈ s
eqa : List.prod la = a
⊢ ∃ l, (∀ (x : M), x ∈ l → x ∈ s) ∧ List.prod l = a * b
M : Type u_1
inst✝¹ : Monoid M
s✝ : Set M
A : Type ?u.66965
inst✝ : AddMonoid A
t : Set A
s : Set M
a✝² a b : M
a✝¹ : InClosure s a
a✝ : InClosure s b
ha : ∃ l, (∀ (x : M), x ∈ l → x ∈ s) ∧ List.prod l = a
hb : ∃ l, (∀ (x : M), x ∈ l → x ∈ s) ∧ List.prod l = b
⊢ ∃ l, (∀ (x : M), x ∈ l → x ∈ s) ∧ List.prod l = a * b
rcases ha with ⟨la, ha, eqa⟩
case intro.intro.intro.intro
M : Type u_1
inst✝¹ : Monoid M
s✝ : Set M
A : Type ?u.66965
inst✝ : AddMonoid A
t : Set A
s : Set M
a✝² a b : M
a✝¹ : InClosure s a
a✝ : InClosure s b
la : List M
ha : ∀ (x : M), x ∈ la → x ∈ s
eqa : List.prod la = a
lb : List M
hb : ∀ (x : M), x ∈ lb → x ∈ s
eqb : List.prod lb = b
⊢ ∃ l, (∀ (x : M), x ∈ l → x ∈ s) ∧ List.prod l = a * b
case intro.intro
M : Type u_1
inst✝¹ : Monoid M
s✝ : Set M
A : Type ?u.66965
inst✝ : AddMonoid A
t : Set A
s : Set M
a✝² a b : M
a✝¹ : InClosure s a
a✝ : InClosure s b
hb : ∃ l, (∀ (x : M), x ∈ l → x ∈ s) ∧ List.prod l = b
la : List M
ha : ∀ (x : M), x ∈ la → x ∈ s
eqa : List.prod la = a
⊢ ∃ l, (∀ (x : M), x ∈ l → x ∈ s) ∧ List.prod l = a * b
rcases hb with ⟨lb, hb, eqb⟩
case intro.intro.intro.intro
M : Type u_1
inst✝¹ : Monoid M
s✝ : Set M
A : Type ?u.66965
inst✝ : AddMonoid A
t : Set A
s : Set M
a✝² a b : M
a✝¹ : InClosure s a
a✝ : InClosure s b
la : List M
ha : ∀ (x : M), x ∈ la → x ∈ s
eqa : List.prod la = a
lb : List M
hb : ∀ (x : M), x ∈ lb → x ∈ s
eqb : List.prod lb = b
⊢ (∀ (x : M), x ∈ la ++ lb → x ∈ s) ∧ List.prod (la ++ lb) = a * b
case intro.intro.intro.intro
M : Type u_1
inst✝¹ : Monoid M
s✝ : Set M
A : Type ?u.66965
inst✝ : AddMonoid A
t : Set A
s : Set M
a✝² a b : M
a✝¹ : InClosure s a
a✝ : InClosure s b
la : List M
ha : ∀ (x : M), x ∈ la → x ∈ s
eqa : List.prod la = a
lb : List M
hb : ∀ (x : M), x ∈ lb → x ∈ s
eqb : List.prod lb = b
⊢ ∃ l, (∀ (x : M), x ∈ l → x ∈ s) ∧ List.prod l = a * b
exists la ++ lb
case intro.intro.intro.intro
M : Type u_1
inst✝¹ : Monoid M
s✝ : Set M
A : Type ?u.66965
inst✝ : AddMonoid A
t : Set A
s : Set M
a✝² a b : M
a✝¹ : InClosure s a
a✝ : InClosure s b
la : List M
ha : ∀ (x : M), x ∈ la → x ∈ s
eqa : List.prod la = a
lb : List M
hb : ∀ (x : M), x ∈ lb → x ∈ s
eqb : List.prod lb = b
⊢ ∀ (x : M), (x ∈ la → x ∈ s) ∧ (x ∈ lb → x ∈ s)
case intro.intro.intro.intro
M : Type u_1
inst✝¹ : Monoid M
s✝ : Set M
A : Type ?u.66965
inst✝ : AddMonoid A
t : Set A
s : Set M
a✝² a b : M
a✝¹ : InClosure s a
a✝ : InClosure s b
la : List M
ha : ∀ (x : M), x ∈ la → x ∈ s
eqa : List.prod la = a
lb : List M
hb : ∀ (x : M), x ∈ lb → x ∈ s
eqb : List.prod lb = b
⊢ (∀ (x : M), x ∈ la ++ lb → x ∈ s) ∧ List.prod (la ++ lb) = a * b
simp [eqa.symm, eqb.symm, or_imp]
no goals
case intro.intro.intro.intro
M : Type u_1
inst✝¹ : Monoid M
s✝ : Set M
A : Type ?u.66965
inst✝ : AddMonoid A
t : Set A
s : Set M
a✝² a b : M
a✝¹ : InClosure s a
a✝ : InClosure s b
la : List M
ha : ∀ (x : M), x ∈ la → x ∈ s
eqa : List.prod la = a
lb : List M
hb : ∀ (x : M), x ∈ lb → x ∈ s
eqb : List.prod lb = b
⊢ ∀ (x : M), (x ∈ la → x ∈ s) ∧ (x ∈ lb → x ∈ s)
exact fun a => ⟨ha a, hb a⟩