code: def lower(expr: Funsor) -> Funsor:
      """
      Lower a funsor expression:
      - eliminate bound variables
      - convert Contraction to Binary
  
      :param Funsor expr: An arbitrary funsor expression.
      :returns: A lowered funsor expression.
      :rtype: Funsor
      """
      # FIXME should this be lazy? What about Lambda?
      with funsor.interpretations.reflect:
          return _lower(expr)
  
file_path: funsor/funsor/compiler.py
imports: import functools
  import funsor
  from .cnf import Contraction
  from .ops.program import OpProgram, make_tuple
  from .tensor import Tensor
  from .terms import Binary, Funsor, Number, Tuple, Unary, Variable
label_desc: Use image node_id 2 for calling a global function with example usage: lower(expr) and returns: _lower