code: def add_predicate(self, name: str, function: Callable, side_arguments: List[str] = None):
          
          side_arguments = side_arguments or []
          signature = inspect.signature(function)
          argument_types = [param.annotation for name, param in signature.parameters.items()
                            if name not in side_arguments]
          return_type = signature.return_annotation
          argument_nltk_types: List[PredicateType] = [PredicateType.get_type(arg_type)
                                                      for arg_type in argument_types]
          return_nltk_type = PredicateType.get_type(return_type)
          function_nltk_type = PredicateType.get_function_type(argument_nltk_types, return_nltk_type)
          self._functions[name] = function
          self._function_types[name].append(function_nltk_type)
docs: Adds a predicate to this domain language.  Typically you do this with the ``@predicate``
          decorator on the methods in your class.  But, if you need to for whatever reason, you can
          also call this function yourself with a (type-annotated) function to add it to your
          language.
  
          Parameters
          ----------
          name : ``str``
              The name that we will use in the induced language for this function.
          function : ``Callable``
              The function that gets called when executing a predicate with the given name.
          side_arguments : ``List[str]``, optional
              If given, we will ignore these arguments for the purposes of grammar induction.  This
              is to allow passing extra arguments from the decoder state that are not explicitly part
              of the language the decoder produces, such as the decoder's attention over the question
              when a terminal was predicted.  If you use this functionality, you also `must` use
              ``language.execute_action_sequence()`` instead of ``language.execute()``, and you must
              pass the additional side arguments needed to that function.  See
              :func:`execute_action_sequence` for more information.