RosettaCodeData/Task/Gray-code/Mercury/gray-code-2.mercury

41 lines
1.2 KiB
Plaintext

:- module gray_test.
:- interface.
:- import_module io.
:- pred main(io::di, io::uo) is det.
:- implementation.
:- import_module gray.
:- import_module int, list, string.
:- pred check_conversion(list(int)::in, list(gray)::out) is semidet.
:- pred display_lists(list(int)::in, list(gray)::in, io::di, io::uo) is det.
:- pred display_record(int::in, gray::in, io::di, io::uo) is det.
main(!IO) :-
Numbers = 0..31,
( check_conversion(Numbers, Grays) ->
io.format("%8s %8s %8s\n", [s("Number"), s("Binary"), s("Gray")], !IO),
io.format("%8s %8s %8s\n", [s("------"), s("------"), s("----")], !IO),
display_lists(Numbers, Grays, !IO)
; io.write("Either conversion or back-conversion failed.\n", !IO)).
check_conversion(Numbers, Grays) :-
Grays = list.map(gray.from_int, Numbers),
Numbers = list.map(gray.to_int, Grays).
display_lists(Numbers, Grays, !IO) :-
list.foldl_corresponding(display_record, Numbers, Grays, !IO).
display_record(Number, Gray, !IO) :-
gray.coerce(Gray, GrayRep),
NumBin = string.int_to_base_string(Number, 2),
GrayBin = string.int_to_base_string(GrayRep, 2),
io.format("%8d %8s %8s\n", [i(Number), s(NumBin), s(GrayBin)], !IO).
:- end_module gray_test.