123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566exceptionBad_atom(** Exception raised if an atom cannot be created *)typet=int(** Atoms are represented as integers. [-i] begin the negation of [i].
Additionally, since we nee dot be able to create fresh atoms, we
use even integers for user-created atoms, and odd integers for the
fresh atoms. *)letmax_lit=max_int(* Counters *)letmax_index=ref0letmax_fresh=ref(-1)(** Internal function for creating atoms.
Updates the internal counters *)let_makei=ifi<>0&&(absi)<max_litthenbeginmax_index:=max!max_index(absi);iendelseraiseBad_atomletto_inti=i(** *)letnega=-aletnorma=absa,ifa<0thenSolver_intf.NegatedelseSolver_intf.Same_signletabs=absletsigni=i>0letapply_signbi=ifbthenielsenegiletset_signbi=ifbthenabsielseneg(absi)lethash(a:int)=alandmax_intletequal(a:int)b=a=bletcompare(a:int)b=compareabletmakei=_make(2*i)letfresh()=incrmax_fresh;_make(2*!max_fresh+1)(*
let iter: (t -> unit) -> unit = fun f ->
for j = 1 to !max_index do
f j
done
*)letppfmta=Format.fprintffmt"%s%s%d"(ifa<0then"~"else"")(ifamod2=0then"v"else"f")((absa)/2)