let simplifyCond condition =
  Aorai_option.debug 
    "initial condition: %a" Promelaoutput.print_condition condition;
  (* Step 1 : Condition is translate into Disjunctive Normal Form *)
  let res1 = condToDNF condition in 
  Aorai_option.debug "initial dnf: %a" pretty_dnf res1;
  (* Step 2 : Positive Call/Ret are used to simplify negative ones *)
  let res = 
    List.fold_left 
      (fun lclauses clause -> simplClause lclauses (positiveCallOrRet clause))
      [] res1
  in
  Aorai_option.debug "after step 2: %a" pretty_dnf res;
  (* Step 3 : simplification between exprs inside a clause *)
  let res = 
    List.fold_left 
      (fun lclauses clause -> simplClause lclauses (simplify clause)) [] res
  in
  Aorai_option.debug "after step 3: %a" pretty_dnf res;
  
  (* Step 4 : simplification between clauses *)
  let res = simplifyClauses res in 
  Aorai_option.debug "after step 4: %a" pretty_dnf res;
  ((dnfToCond res), res)