<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def make_table(headers, lines, prefix=None):
 """ Generates an ASCII table according to the given headers and lines :param headers: List of table headers (N-tuple) :param lines: List of table lines (N-tuples) :param prefix: Optional prefix for each line :return: The ASCII representation of the table :raise ValueError: Different number of columns between headers and lines """

        # Normalize the prefix
        prefix = str(prefix or "")

        # Maximum lengths
        lengths = [len(title) for title in headers]

        # Store the number of columns (0-based)
        nb_columns = len(lengths) - 1

        # Lines
        str_lines = []
        for idx, line in enumerate(lines):
            # Recompute lengths
            str_line = []
            str_lines.append(str_line)
            column = -1

            try:
                for column, entry in enumerate(line):
                    str_entry = str(entry)
                    str_line.append(str_entry)

                    if len(str_entry) > lengths[column]:
                        lengths[column] = len(str_entry)

            except IndexError:
                # Line too small/big
                raise ValueError(
                    "Different sizes for header and lines "
                    "(line {0})".format(idx + 1)
                )

            except (TypeError, AttributeError):
                # Invalid type of line
                raise ValueError(
                    "Invalid type of line: %s", type(line).__name__
                )

            else:
                if column != nb_columns:
                    # Check if all lines have the same number of columns
                    raise ValueError(
                        "Different sizes for header and lines "
                        "(line {0})".format(idx + 1)
                    )

        # Prepare the head (centered text)
        format_str = "{0}|".format(prefix)
        for column, length in enumerate(lengths):
            format_str += " {%d:^%d} |" % (column, length)

        head_str = format_str.format(*headers)

        # Prepare the separator, according the length of the headers string
        separator = "{0}{1}".format(prefix, "-" * (len(head_str) - len(prefix)))
        idx = head_str.find("|")
        while idx != -1:
            separator = "+".join((separator[:idx], separator[idx + 1 :]))
            idx = head_str.find("|", idx + 1)

        # Prepare the output
        output = [separator, head_str, separator.replace("-", "=")]

        # Compute the lines
        format_str = format_str.replace("^", "<")
        for line in str_lines:
            output.append(format_str.format(*line))
            output.append(separator)

        # Force the last end of line
        output.append("")

        # Join'em
        return "\n".join(output)