let print_macros (states_l,trans_l) =
  print_start_block "Some macros factorizing pre/post-conditions predicates";

  fprintf !out_fmt "# define %s=(op,st) \\\n" macro_ligth;
  fprintf !out_fmt "      %s == op\\\n" curOp;
  fprintf !out_fmt "  &&  %s == st\\\n" curOpStatus;
  fprintf !out_fmt "  && (%s[ 0] != 0" curState;
  for i=1 to (List.length states_l)-1 do
      fprintf !out_fmt " ||\\\n      %s[%2d] != 0" curState i
  done;
  fprintf !out_fmt ")\\\n";
  fprintf !out_fmt "  && (%s[ 0] != 0" curTrans;
  for i=1 to (List.length trans_l)-1 do
    fprintf !out_fmt " ||\\\n      %s[%2d] != 0" curTrans i
  done ;
  fprintf !out_fmt ")\n";
  fprintf !out_fmt "//\n";


  fprintf !out_fmt "# define %s=(op,st) \\\n" macro_full;
  fprintf !out_fmt "  %s(op,et) \\\n" macro_ligth;
  fprintf !out_fmt "  && (\\forall int tr ; 0<=tr<%s && %s[tr]!=0 => %s[%s(tr)]!=0 && %s(tr)) \\\n" nbTrans curTrans curState transStop transCond;
  fprintf !out_fmt "  && (\\forall int st ; 0<=st<%s && %s[st]!=0=> \\\n" nbStates curState;
  fprintf !out_fmt "        (\\exists int tr ; 0<=tr<%s && %s(tr) && %s(tr)==st && %s[tr]!=0)) \\\n" nbTrans transCond transStop curTrans;
  fprintf !out_fmt "  && (\\forall int st ;  \\\n";
  fprintf !out_fmt "        0<=st<%s && \\\n" nbStates;
  fprintf !out_fmt "        (\\forall int tr ;  \\\n";
  fprintf !out_fmt "            0<=tr<%s => \\\n" nbTrans;
  fprintf !out_fmt "                (%s[tr]==0 ||  \\\n" curTrans;
  fprintf !out_fmt "                 %s(tr)!=st ||  \\\n" transStop;
  fprintf !out_fmt "                 !%s(tr)) \\\n" transCond;
  fprintf !out_fmt "        ) \\\n";
  fprintf !out_fmt "       => %s[st]==0 \\\n" curState;
  fprintf !out_fmt "     )\n";
  fprintf !out_fmt "//\n";


  fprintf !out_fmt "# define %s \\\n"  macro_pure ;
  fprintf !out_fmt "     (\\forall int st ; 0<=st<%s && %s[st]==0 =>                                     \\\n" nbStates curState;
  fprintf !out_fmt "          (\\forall int tr ; 0<=tr<%s =>                                                          \\\n" nbTrans;
  fprintf !out_fmt "             (   %s[tr]==0 || !%s(tr)                                                   \\\n" curTrans transCond;
  fprintf !out_fmt "              || %s(tr)!=st || \\old(%s[%s(tr)]==0))))                    \\\n" transStop curState transStart;
  fprintf !out_fmt "  && (\\forall int end ; 0<=end<%s && %s[end]!=0 =>                                  \\\n" nbStates curState;
  fprintf !out_fmt "          (\\exists int tr ; 0<=tr<%s && %s[tr]!=0 && %s(tr) &&                     \\\n" nbTrans curTrans transCond;
  fprintf !out_fmt "                            end==%s(tr) && \\old(%s[%s(tr)]!=0)))\n" transStop curState transStart;
  print_end_block "Some macros factorizing pre/post-conditions predicates"