let print_automata (_ ,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"