code: def add_constant(self, name: str, value: Any, type_: Type = None):
          
          value_type = type_ if type_ else type(value)
          constant_type = PredicateType.get_type(value_type)
          self._functions[name] = lambda: value
          self._function_types[name].append(constant_type)
docs: Adds a constant to this domain language.  You would typically just pass in a list of
          constants to the ``super().__init__()`` call in your constructor, but you can also call
          this method to add constants if it is more convenient.
  
          Because we construct a grammar over this language for you, in order for the grammar to be
          finite we cannot allow arbitrary constants.  Having a finite grammar is important when
          you're doing semantic parsing - we need to be able to search over this space, and compute
          normalized probability distributions.