docs: def show_rules(cls, *names, attr=None):
          """Print algebraic rules used by :class:`create`
  
          Print a summary of the algebraic rules with the given names, or all
          rules if not names a given.
  
          Args:
              names (str): Names of rules to show
              attr (None or str): Name of the class attribute from which to get
                  the rules. Cf. :meth:`add_rule`.
  
          Raises:
              AttributeError: If invalid `attr`
          """
          from qnet.printing import srepr
          try:
              if attr is None:
                  attr = cls._rules_attr()
              rules = getattr(cls, attr)
          except TypeError:
              rules = {}
          for (name, rule) in rules.items():
              if len(names) > 0 and name not in names:
                  continue
              pat, repl = rule
              print(name)
              print("    PATTERN:")
              print(textwrap.indent(
                  textwrap.dedent(srepr(pat, indented=True)),
                  prefix=" "*8))
              print("    REPLACEMENT:")
              print(textwrap.indent(
                  textwrap.dedent(inspect.getsource(repl).rstrip()),
                  prefix=" "*8))