induction x
case h
m : Type → Type u_1
a : Type
M : Monad m
LM : LawfulMonad m
f g : a → m a
COMMUTE :
  ∀ {b : Type} (x y : a) (k : a → a → m b),
    (do
        let r1 ← f x
        let r2 ← g y
        k r1 r2) =
      do
      let r2 ← g y
      let r1 ← f x
      k r1 r2
x : List a
⊢ fish (mapM f) (mapM g) x = mapM (fish f g) x
case h.nil
m : Type → Type u_1
a : Type
M : Monad m
LM : LawfulMonad m
f g : a → m a
COMMUTE :
  ∀ {b : Type} (x y : a) (k : a → a → m b),
    (do
        let r1 ← f x
        let r2 ← g y
        k r1 r2) =
      do
      let r2 ← g y
      let r1 ← f x
      k r1 r2
⊢ fish (mapM f) (mapM g) [] = mapM (fish f g) []

case h.cons
m : Type → Type u_1
a : Type
M : Monad m
LM : LawfulMonad m
f g : a → m a
COMMUTE :
  ∀ {b : Type} (x y : a) (k : a → a → m b),
    (do
        let r1 ← f x
        let r2 ← g y
        k r1 r2) =
      do
      let r2 ← g y
      let r1 ← f x
      k r1 r2
head✝ : a
tail✝ : List a
tail_ih✝ : fish (mapM f) (mapM g) tail✝ = mapM (fish f g) tail✝
⊢ fish (mapM f) (mapM g) (head✝ :: tail✝) = mapM (fish f g) (head✝ :: tail✝)