human
Complete this python program:
def from_hyper(func, x0=0, evalf=False):
assistant
#Here is the Python program you requested.

    """Converts a hypergeometric function to holonomic.
    ``func`` is the Hypergeometric Function and ``x0`` is the point at
    which initial conditions are required.
    Examples
    >>> from sympy.holonomic.holonomic import from_hyper, DifferentialOperators
    >>> from sympy import symbols, hyper, S
    >>> x = symbols(\x\)
    >>> from_hyper(hyper([], [S(3)/2], x**2/4))
    HolonomicFunction((-x) + (2)*Dx + (x)*Dx**2, x, 1, [sinh(1), -sinh(1) + cosh(1)])
    """
    a = func.ap
    b = func.bq
    z = func.args[2]
    x = z.atoms(Symbol).pop()
    (R, Dx) = DifferentialOperators(QQ.old_poly_ring(x), 'Dx')
    r1 = 1
    for i in range(len(a)):
        r1 = (r1 * ((x * Dx) + a[i]))
    r2 = Dx
    for i in range(len(b)):
        r2 = (r2 * (((x * Dx) + b[i]) - 1))
    sol = (r1 - r2)
    simp = hyperexpand(func)
    if (isinstance(simp, Infinity) or isinstance(simp, NegativeInfinity)):
        return HolonomicFunction(sol, x).composition(z)
    def _find_conditions(simp, x, x0, order, evalf=False):
        y0 = []
        for i in range(order):
            if evalf:
                val = simp.subs(x, x0).evalf()
            else:
                val = simp.subs(x, x0)
            if (((val.is_finite is not None) and (not val.is_finite)) or isinstance(val, NaN)):
                return None
            y0.append(val)
            simp = simp.diff(x)
        return y0
    if (not isinstance(simp, hyper)):
        y0 = _find_conditions(simp, x, x0, sol.order)
        while (not y0):
            x0 += 1
            y0 = _find_conditions(simp, x, x0, sol.order)
        return HolonomicFunction(sol, x).composition(z, x0, y0)
    if isinstance(simp, hyper):
        x0 = 1
        y0 = _find_conditions(simp, x, x0, sol.order, evalf)
        while (not y0):
            x0 += 1
            y0 = _find_conditions(simp, x, x0, sol.order, evalf)
        return HolonomicFunction(sol, x).composition(z, x0, y0)
    return HolonomicFunction(sol, x).composition(z)