docs: def distributive(self):
          """
          Return a term where the leading AND or OR terms are switched.
  
          This is done by applying the distributive laws:
              A & (B|C) = (A&B) | (A&C)
              A | (B&C) = (A|B) & (A|C)
          """
          dual = self.dual
          args = list(self.args)
          for i, arg in enumerate(args):
              if isinstance(arg, dual):
                  args[i] = arg.args
              else:
                  args[i] = (arg,)
  
          prod = itertools.product(*args)
          args = tuple(self.__class__(*arg).simplify() for arg in prod)
  
          if len(args) == 1:
              return args[0]
          else:
              return dual(*args)