<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def assembly_plus_protons(input_file, path=True, pdb_name=None, save_output=False, force_save=False):
 """Returns an Assembly with protons added by Reduce. Notes ----- Looks for a pre-existing Reduce output in the standard location before running Reduce. If the protein contains oligosaccharides or glycans, use reduce_correct_carbohydrates. Parameters input_file : str or pathlib.Path Location of file to be converted to Assembly or PDB file as string. path : bool Whether we are looking at a file or a pdb string. Defaults to file. pdb_name : str PDB ID of protein. Required if providing string not path. save_output : bool If True will save the generated assembly. force_save : bool If True will overwrite existing reduced assembly. Returns ------- reduced_assembly : AMPAL Assembly Assembly of protein with protons added by Reduce. """

    from ampal.pdb_parser import convert_pdb_to_ampal

    if path:
        input_path = Path(input_file)
        if not pdb_name:
            pdb_name = input_path.stem[:4]
        reduced_path = reduce_output_path(path=input_path)
        if reduced_path.exists() and not save_output and not force_save:
            reduced_assembly = convert_pdb_to_ampal(
                str(reduced_path), pdb_id=pdb_name)
            return reduced_assembly
    if save_output:
        reduced_path = output_reduce(
            input_file, path=path, pdb_name=pdb_name, force=force_save)
        reduced_assembly = convert_pdb_to_ampal(str(reduced_path), path=True)
    else:
        reduce_mmol, reduce_message = run_reduce(input_file, path=path)
        if not reduce_mmol:
            return None
        reduced_assembly = convert_pdb_to_ampal(
            reduce_mmol, path=False, pdb_id=pdb_name)
    return reduced_assembly