docs: def free_symbols(self):
          """Set of free SymPy symbols contained within the expression."""
          if self._free_symbols is None:
              if len(self._vals) == 0:
                  self._free_symbols = self.operand.free_symbols
              else:
                  dummy_map = {}
                  for sym in self._vals.keys():
                      dummy_map[sym] = sympy.Dummy()
                  # bound symbols may not be atomic, so we have to replace them
                  # with dummies
                  self._free_symbols = {
                      sym for sym
                      in self.operand.substitute(dummy_map).free_symbols
                      if not isinstance(sym, sympy.Dummy)}
                  for val in self._vals.values():
                      self._free_symbols.update(val.free_symbols)
          return self._free_symbols