docs: def _compile_pvariable_expression(self,
                                        expr: Expression,
                                        scope: Dict[str, TensorFluent],
                                        batch_size: Optional[int] = None,
                                        noise: Optional[List[tf.Tensor]] = None) -> TensorFluent:
          '''Compile a pvariable expression `expr` into a TensorFluent
          in the given `scope` with optional batch size.
  
          Args:
              expr (:obj:`rddl2tf.expr.Expression`): A RDDL pvariable expression.
              scope (Dict[str, :obj:`rddl2tf.fluent.TensorFluent`]): A fluent scope.
              batch_size (Optional[size]): The batch size.
  
          Returns:
              :obj:`rddl2tf.fluent.TensorFluent`: The compiled expression as a TensorFluent.
          '''
          etype = expr.etype
          args = expr.args
          name = expr._pvar_to_name(args)
          if name not in scope:
              raise ValueError('Variable {} not in scope.'.format(name))
          fluent = scope[name]
          scope = args[1] if args[1] is not None else []
          if isinstance(fluent, TensorFluent):
              fluent = TensorFluent(fluent.tensor, scope, batch=fluent.batch)
          elif isinstance(fluent, tf.Tensor):
              fluent = TensorFluent(fluent, scope, batch=self.batch_mode)
          else:
              raise ValueError('Variable in scope must be TensorFluent-like: {}'.format(fluent))
          return fluent