let print_automata (_ (*states_l*),trans_l) =
  print_start_block "Automata definition";

  fprintf !out_fmt "// Starting state of each transition\n//\n";
  fprintf !out_fmt "//%c logic int %s (int tr) reads tr\n" '@' transStart ;
  List.iter (fun t ->
    fprintf !out_fmt "//%c axiom %s_%d : %s(%d) == %d\n" '@' transStart t.numt transStart t.numt t.start.nums
  ) trans_l;


  fprintf !out_fmt "//\n// Ending state of each transition\n//\n";
  fprintf !out_fmt "//%c logic int %s (int tr) reads tr\n" '@' transStop ;
  List.iter (fun t ->
    fprintf !out_fmt "//%c axiom %s_%d : %s(%d) == %d\n" '@' transStop t.numt transStop t.numt t.stop.nums
  ) trans_l;

  fprintf !out_fmt "//\n// Cross condition of each transition\n//\n";
  fprintf !out_fmt "/*%c predicate %s (int TransNum, int %s, int %s) = \n" '@' transCondP curOp curOpStatus;
  fprintf !out_fmt "  %c   ((TransNum==%d) => (%s)) " '@' (List.hd trans_l).numt (c_string_of_condition (List.hd trans_l).cross);
  List.iter (fun t ->
    fprintf !out_fmt "&&\n  %c   ((TransNum==%d) => (%s)) " '@' t.numt (c_string_of_condition t.cross)
  ) (List.tl trans_l);
  fprintf !out_fmt "\n)\n*/\n" ;

  fprintf !out_fmt "//%c predicate %s (int TransNum) = %s (TransNum,%s,%s)\n" '@' transCond transCondP curOp curOpStatus;


  fprintf !out_fmt "//\n// Some invariants\n//\n";
  fprintf !out_fmt "//%c invariant inv_buch_range : \\valid_range(%s,0,%s-1) \n" '@' curState nbStates;
  fprintf !out_fmt "//%c invariant inv_buch_accept_valid: \\valid_range(%s,0,%s-1) \n" '@' acceptSt  nbAcceptSt;
  fprintf !out_fmt "//%c invariant inv_buch_accept_correct: \\forall int st ; 0<=st<%s => 0<=%s[st]<%s \n" '@' nbAcceptSt acceptSt nbStates;

  print_end_block "Automata definition"