{m : Type u → Type u} →
  {P : Sort u_1} →
    {listM : Type u → Type u} →
      {nil : {α : Type u} → listM α} →
        {cons : {α : Type u} → α → listM α → listM α} →
          {thunk : {α : Type u} → (Unit → listM α) → listM α} →
            {squash : {α : Type u} → (Unit → m (listM α)) → listM α} →
              {uncons : {α : Type u} → [Monad m] → listM α → m (Option (α × listM α))} →
                {uncons? : {α : Type u} → listM α → Option (Option (α × listM α))} →
                  {listM' : Type u → Type u} →
                    {nil' : {α : Type u} → listM' α} →
                      {cons' : {α : Type u} → α → listM' α → listM' α} →
                        {thunk' : {α : Type u} → (Unit → listM' α) → listM' α} →
                          {squash' : {α : Type u} → (Unit → m (listM' α)) → listM' α} →
                            {uncons' : {α : Type u} → [Monad m] → listM' α → m (Option (α × listM' α))} →
                              {uncons?' : {α : Type u} → listM' α → Option (Option (α × listM' α))} →
                                { listM := listM, nil := nil, cons := cons, thunk := thunk, squash := squash,
                                      uncons := uncons, uncons? := uncons? } =
                                    { listM := listM', nil := nil', cons := cons', thunk := thunk', squash := squash',
                                      uncons := uncons', uncons? := uncons?' } →
                                  (listM = listM' →
                                      nil ≍ nil' →
                                        cons ≍ cons' →
                                          thunk ≍ thunk' →
                                            squash ≍ squash' → uncons ≍ uncons' → uncons? ≍ uncons?' → P) →
                                    P