[mercury-users] unification with out arguments

Gordon Tisher gordon at balafon.net
Wed Jun 9 04:02:26 AEST 2010


I've come across an interesting situation (rotd 2010-06-06).  The
compiler sometimes doesn't seem to want to unify an "out" argument
with a complex data term given in a predicate call.  The following
small program:

:- module test.

:- interface.
:- pred test is semidet.

:- implementation.
:- import_module char.
:- import_module list.

test :-
	parse(['a'], leaf(_)),                       % why does this work?
	parse(['a', 'b'], node(leaf(_), leaf('b'))). % when this doesn't?
%	parse(['a', 'b'], Tree), Tree = node(leaf(_), leaf('b')). % this works

:- type tree ---> leaf(char) ; node(tree, tree).
:- pred parse(list(char)::in, tree::out) is semidet.

parse([C], leaf(C)).
parse([A,B], node(leaf(A), leaf(B))).

gives the error:

test.m:012: In clause for
test.m:012:   `'__Unify__'((unique(test.node(unique(test.leaf(free)),
test.m:012:   unique(test.leaf(unique('b'))))) >>
test.m:012:   bound(test.node(bound(test.leaf(ground)),
test.m:012:   bound(test.leaf(bound('b')))))), (ground >>
test.m:012:   bound(test.node(bound(test.leaf(ground)),
test.m:012:   bound(test.leaf(bound('b')))))))':
test.m:012:   mode error in unification of `HeadVar__1' and `test.node(V_14,
test.m:012:   V_15)'.
test.m:012:   Variable `HeadVar__1' has instantiatedness
test.m:012:   `unique(test.node(unique(test.leaf(free)),
test.m:012:   unique(test.leaf(unique('b')))))',
test.m:012:   term `test.node(V_14, V_15)' has instantiatedness `test.node(
test.m:012:     free,
test.m:012:     free
test.m:012:   )'.

I'm assuming the "unique" is screwing things up, but why does the
compiler complain about line 12 and not line 11?

Gordon Tisher
mercury-users mailing list
Post messages to:       mercury-users at csse.unimelb.edu.au
Administrative Queries: owner-mercury-users at csse.unimelb.edu.au
Subscriptions:          mercury-users-request at csse.unimelb.edu.au

More information about the users mailing list