code: def _is_echelon(M, iszerofunc=_iszero):
      """Returns `True` if the matrix is in echelon form. That is, all rows of
      zeros are at the bottom, and below each leading non-zero in a row are
      exclusively zeros."""
  
      if M.rows <= 0 or M.cols <= 0:
          return True
  
      zeros_below = all(iszerofunc(t) for t in M[1:, 0])
  
      if iszerofunc(M[0, 0]):
          return zeros_below and _is_echelon(M[:, 1:], iszerofunc)
  
      return zeros_below and _is_echelon(M[1:, 1:], iszerofunc)
  
file_path: sympy/sympy/matrices/reductions.py
imports: from types import FunctionType
  from sympy.polys.polyerrors import CoercionFailed
  from sympy.polys.domains import ZZ, QQ
  from .utilities import _get_intermediate_simp, _iszero, _dotprodsimp, _simplify
  from .determinant import _find_reasonable_pivot
label_desc: Use image node_id 3 for calling a global function with example usage: _is_echelon(M, iszerofunc) and returns: unknown, True, unknown