let process_flag (flag: flag) (apply: 'a apply_to_flag) : 'a =
  match flag with
    | Int                flag_base -> apply.apply flag_base#as_flag_type
    | Float              flag_base -> apply.apply flag_base#as_flag_type
    | Bool               flag_base -> apply.apply flag_base#as_flag_type
    | String             flag_base -> apply.apply flag_base#as_flag_type
    | Unit               flag_base -> apply.apply flag_base#as_flag_type
    | Equality           flag_base -> apply.apply flag_base#as_flag_type
    | Backtracking       flag_base -> apply.apply flag_base#as_flag_type
    | IterativeDeepening flag_base -> apply.apply flag_base#as_flag_type
    | Restart            flag_base -> apply.apply flag_base#as_flag_type
    | HornCandidates     flag_base -> apply.apply flag_base#as_flag_type
    | Lemma              flag_base -> apply.apply flag_base#as_flag_type
    | PreprocessSplit    flag_base -> apply.apply flag_base#as_flag_type
    | InputFormat        flag_base -> apply.apply flag_base#as_flag_type
    | PrintFDProblem     flag_base -> apply.apply flag_base#as_flag_type