intro y
case h
α : Type u
m : Type v → Type w
inst✝¹ : Monad m
β : Type v
inst✝ : LawfulMonad m
f : α → m β
x✝¹ x : Array α
a : α
x✝ : SatisfiesM (fun y => size y = size x) (mapM f x)
y : m { a // (fun y => size y = size x) a }
h : Subtype.val <$> y = mapM f x
push' : { y // size y = size x } → β → { y // size y = size (push x a) } :=
  fun y b => { val := push y.val b, property := (_ : size (push y.val b) = size (push x a)) }
⊢ ∀ (a_1 : { a // size a = size x }),
    (do
        let x_1 ← f a
        let a_2 ← pure { val := push a_1.val x_1, property := (_ : size (push a_1.val x_1) = size (push x a)) }
        pure a_2.val) =
      do
      let y ← pure a_1.val
      let b ← f a
      pure (push y b)
case h
α : Type u
m : Type v → Type w
inst✝¹ : Monad m
β : Type v
inst✝ : LawfulMonad m
f : α → m β
x✝¹ x : Array α
a : α
x✝ : SatisfiesM (fun y => size y = size x) (mapM f x)
y✝ : m { a // (fun y => size y = size x) a }
h : Subtype.val <$> y✝ = mapM f x
push' : { y // size y = size x } → β → { y // size y = size (push x a) } :=
  fun y b => { val := push y.val b, property := (_ : size (push y.val b) = size (push x a)) }
y : { a // size a = size x }
⊢ (do
      let x_1 ← f a
      let a_1 ← pure { val := push y.val x_1, property := (_ : size (push y.val x_1) = size (push x a)) }
      pure a_1.val) =
    do
    let y ← pure y.val
    let b ← f a
    pure (push y b)