def collect_matchable_successors(start_state):
    """
    Collect the matchable successor states.
    NOTE: The start state also evaluated as a successor!
    :param start_state: the start state of the searching
    :return: the set of matchable successors
    """
    processable_states = {start_state}
    matchable_states = set()
    visited_states = set()
    while processable_states:
        state = processable_states.pop()
        if state not in visited_states:
            if state.node.is_matchable():
                matchable_states.add(state)
            elif not state.node.is_default():
                processable_states.update(state.find_successor_states())
            visited_states.add(state)
    return matchable_states