[m-dev.] [Bug] write_term: improper representation of nesting of compound disjoint goals
doug.auclair at logicaltypes.com
doug.auclair at logicaltypes.com
Sat Mar 4 08:01:23 AEDT 2006
Dear all,
There appears to be a bug in term_io.write_term/4. When I write out a
compound disjoin set of goals, it gets the parentheses wrong, particularly
for the outermost disjoint term (the parentheses disappear). So, a
compilable Mercury program, when read then written back out using
term_io.write_term/4 is no longer compilable. The example of a compilable
program becoming uncompilable follows:
----- BEGIN CODE -----------------------------------------
:- module problem_write_term.
:- interface.
:- import_module io.
:- pred main(io::di, io::uo) is cc_multi.
:- implementation.
:- import_module string, list, term_io.
main -->
{ (a(1),
X = 1,
(b, Y = 1,
(c, Z = 1; Z = 2)
;
Y = 2, Z = 2)
;
X = 2, Y = 2, Z = 2),
A = 1 },
loopy,
format("\n%% A(%d), X(%d), Y(%d), Z(%d)\n", [i(A), i(X), i(Y), i(Z)]).
:- pred loopy(io::di, io::uo) is det.
loopy -->
nl,
read_term(T),
print_term(T).
:- pred print_term(read_term(T)::in, io::di, io::uo) is det.
print_term(term(Varset, Term)) --> write_term(Varset, Term), print("."), loopy.
print_term(Err at error(_, _)) --> print(Err), nl.
print_term(eof) --> [].
:- pred a(int::in) is semidet.
a(1).
:- pred b is failure.
b :- fail.
:- pred c is failure.
c :- fail.
----- END CODE -------------------------------------------
The output of
$ ./problem_write_term < problem_write_term
is:
----- BEGIN OUTPUT ----------------------------------------
:- module problem_write_term.
:- interface.
:- import_module io.
:- pred main(io :: di, io :: uo) is cc_multi.
:- implementation.
:- import_module string, list, term_io.
main --> {a(1), X = 1, (b, Y = 1, (c, Z = 1 ; Z = 2) ; Y = 2, Z = 2) ; X = 2, Y = 2, Z = 2, A = 1}, loopy, format("\n%% A(%d), X(%d), Y(%d), Z(%d)\n", [i(A), i(X), i(Y), i(Z)]).
:- pred loopy(io :: di, io :: uo) is det.
loopy --> nl, read_term(T), print_term(T).
:- pred print_term(read_term(T) :: in, io :: di, io :: uo) is det.
print_term(term(Varset, Term)) --> write_term(Varset, Term), print("."), loopy.
print_term(Err @ error(_2, _3)) --> print(Err), nl.
print_term(eof) --> [].
:- pred a(int :: in) is semidet.
a(1).
:- pred b is failure.
b :- fail.
:- pred c is failure.
c :- fail.
% A(1), X(1), Y(2), Z(2)
----- END OUTPUT --------------------------------------
which obviously doesn't compile (note the missing outermost paratheses that
are supposted to precede a(1) and precede A = 1):
Making Mercury/cs/problem_write_term.c
[...]
problem_write_term.m:008: In clause for `main(di, uo)':
problem_write_term.m:008: mode mismatch in disjunction.
problem_write_term.m:008: `A' :: free, unique(1).
For more information, try recompiling with `-E'.
** Error making `Mercury/cs/problem_write_term.c'.
I think this could be a pretty easy fix, but I also think it's a pretty
important one: could this fix go in before release 0.13, please?
Sincerely,
Doug Auclair
--------------------------------------------------------------------------
mercury-developers mailing list
Post messages to: mercury-developers at cs.mu.oz.au
Administrative Queries: owner-mercury-developers at cs.mu.oz.au
Subscriptions: mercury-developers-request at cs.mu.oz.au
--------------------------------------------------------------------------
More information about the developers
mailing list