:- module gray. :- interface. :- import_module int. :- type gray. % VALUE conversion functions :- func gray.from_int(int) = gray. :- func gray.to_int(gray) = int. % REPRESENTATION conversion predicate :- pred gray.coerce(gray, int). :- mode gray.coerce(in, out) is det. :- mode gray.coerce(out, in) is det. :- implementation. :- import_module list. :- type gray ---> gray(int). gray.from_int(X) = gray(X `xor` (X >> 1)). gray.to_int(gray(G)) = (G > 0 -> G `xor` gray.to_int(gray(G >> 1)) ; G). gray.coerce(gray(I), I). :- end_module gray.