Return True if `v` is a solution of `expr` with the extra constraints, False otherwise.

        :param expr:                An expression (an AST) to evaluate
        :param v:                   The proposed solution (an AST)
        :param solver:              A solver object, native to the backend, to assist in the evaluation (for example,
                                    a z3.Solver).
        :param extra_constraints:   Extra constraints (as ASTs) to add to the solver for this solve.
        :param model_callback:      a function that will be executed with recovered models (if any)
        :return:                    True if `v` is a solution of `expr`, False otherwise

def solution(self, expr, v, extra_constraints=(), solver=None, model_callback=None):
        """
        Return True if `v` is a solution of `expr` with the extra constraints, False otherwise.

        :param expr:                An expression (an AST) to evaluate
        :param v:                   The proposed solution (an AST)
        :param solver:              A solver object, native to the backend, to assist in the evaluation (for example,
                                    a z3.Solver).
        :param extra_constraints:   Extra constraints (as ASTs) to add to the solver for this solve.
        :param model_callback:      a function that will be executed with recovered models (if any)
        :return:                    True if `v` is a solution of `expr`, False otherwise
        """
        if self._solver_required and solver is None:
            raise BackendError("%s requires a solver for evaluation" % self.__class__.__name__)

        return self._solution(self.convert(expr), self.convert(v), extra_constraints=self.convert_list(extra_constraints), solver=solver, model_callback=model_callback)