Theorem: Array.join_data
File: .lake/packages/batteries/Batteries/Data/Array/Lemmas.lean

tactic: dsimp [join]
state_before: α : Type u_1
l : Array (Array α)
⊢ l.join.data = (List.map data l.data).join
state_after: α : Type u_1
l : Array (Array α)
⊢ (foldl (fun x x_1 => x ++ x_1) #[] l 0).data = (List.map data l.data).join

tactic: simp only [foldl_eq_foldl_data]
state_before: α : Type u_1
l : Array (Array α)
⊢ (foldl (fun x x_1 => x ++ x_1) #[] l 0).data = (List.map data l.data).join
state_after: α : Type u_1
l : Array (Array α)
⊢ (List.foldl (fun x x_1 => x ++ x_1) #[] l.data).data = (List.map data l.data).join

tactic: generalize l.data = l
state_before: α : Type u_1
l : Array (Array α)
⊢ (List.foldl (fun x x_1 => x ++ x_1) #[] l.data).data = (List.map data l.data).join
state_after: α : Type u_1
l✝ : Array (Array α)
l : List (Array α)
⊢ (List.foldl (fun x x_1 => x ++ x_1) #[] l).data = (List.map data l).join

tactic: have : ∀ a : Array α, (List.foldl ?_ a l).data = a.data ++ ?_ := ?_
state_before: α : Type u_1
l✝ : Array (Array α)
l : List (Array α)
⊢ (List.foldl (fun x x_1 => x ++ x_1) #[] l).data = (List.map data l).join
state_after: case refine_4
α : Type u_1
l✝ : Array (Array α)
l : List (Array α)
this : ∀ (a : Array α), (List.foldl (?m.43089 a) a l).data = a.data ++ ?m.43090 a
⊢ (List.foldl (fun x x_1 => x ++ x_1) #[] l).data = (List.map data l).join

case refine_1
α : Type u_1
l✝ : Array (Array α)
l : List (Array α)
a : Array α
⊢ Array α → Array α → Array α

case refine_2
α : Type u_1
l✝ : Array (Array α)
l : List (Array α)
a : Array α
⊢ List α

case refine_3
α : Type u_1
l✝ : Array (Array α)
l : List (Array α)
⊢ ∀ (a : Array α), (List.foldl (?m.43089 a) a l).data = a.data ++ ?m.43090 a

tactic: exact this #[]
state_before: case refine_4
α : Type u_1
l✝ : Array (Array α)
l : List (Array α)
this : ∀ (a : Array α), (List.foldl (?m.43089 a) a l).data = a.data ++ ?m.43090 a
⊢ (List.foldl (fun x x_1 => x ++ x_1) #[] l).data = (List.map data l).join

case refine_1
α : Type u_1
l✝ : Array (Array α)
l : List (Array α)
a : Array α
⊢ Array α → Array α → Array α

case refine_2
α : Type u_1
l✝ : Array (Array α)
l : List (Array α)
a : Array α
⊢ List α

case refine_3
α : Type u_1
l✝ : Array (Array α)
l : List (Array α)
⊢ ∀ (a : Array α), (List.foldl (?m.43089 a) a l).data = a.data ++ ?m.43090 a
state_after: case refine_3
α : Type u_1
l✝ : Array (Array α)
l : List (Array α)
⊢ ∀ (a : Array α), (List.foldl (fun x x_1 => x ++ x_1) a l).data = a.data ++ (List.map data l).join

tactic: induction l with
| nil => simp
| cons h => induction h.data <;> simp [*]
state_before: case refine_3
α : Type u_1
l✝ : Array (Array α)
l : List (Array α)
⊢ ∀ (a : Array α), (List.foldl (fun x x_1 => x ++ x_1) a l).data = a.data ++ (List.map data l).join
state_after: no goals

tactic: simp
state_before: case refine_3.nil
α : Type u_1
l : Array (Array α)
⊢ ∀ (a : Array α), (List.foldl (fun x x_1 => x ++ x_1) a []).data = a.data ++ (List.map data []).join
state_after: no goals

tactic: induction h.data <;> simp [*]
state_before: case refine_3.cons
α : Type u_1
l : Array (Array α)
h : Array α
tail✝ : List (Array α)
tail_ih✝ : ∀ (a : Array α), (List.foldl (fun x x_1 => x ++ x_1) a tail✝).data = a.data ++ (List.map data tail✝).join
⊢ ∀ (a : Array α),
    (List.foldl (fun x x_1 => x ++ x_1) a (h :: tail✝)).data = a.data ++ (List.map data (h :: tail✝)).join
state_after: no goals