[m-dev.] Mostly unique
Fergus Henderson
fjh at cs.mu.OZ.AU
Mon Dec 7 14:58:37 AEDT 1998
On 07-Dec-1998, Peter Schachte <pets at cs.mu.OZ.AU> wrote:
> Is there a difference between mostly unique input and unique input?
Yes.
Mostly unique input is defined as
:- mode mui :: mostly_unique -> mostly_unique.
whereas unique input is defined as
:- mode ui :: unique -> unique.
If the argument has initial inst `unique', as is the case for `ui' modes,
then there are guaranteed to be no references to it on backtracking.
One consequence of this is that a semidet procedure whose argument
has mode `ui' is allowed to clobber that argument before failing.
:- mode clobber(di) is det.
/* this is perfectly legal */
:- mode p1(ui) is semidet.
p1(X) :-
clobber(X),
fail.
/* this one has a unique mode error */
:- mode p2(mui) is semidet.
p1(X) :-
clobber(X),
fail.
Likewise, if the argument has final inst `unique', as it the case for `ui'
modes, then there are guaranteed to be no references to it on backtracking,
so a procedure that comes after this one is allowed to clobber it without
trailing.
:- mode p1(di, out) is nondet.
:- mode q1(ui, out) is semidet. % `ui' and `semidet'
:- mode r(di, uo) is det.
/* this one is legal */
p1(X, W) :-
q1(X, Y),
r(X, Z), /* may clobber X */
W = f(Y, Z).
:- mode p2(di, out) is nondet.
:- mode q2(mui, out) is nondet. % `mui' and `nondet'
/* this one has a unique mode error */
p2(X, W) :-
q2(X, Y),
r(X, Z), /* mode error here */
W = f(Y, Z).
> As far as I can see, a promise not to copy a pointer to any part of a
> term should not depend on how many solutions that predicate has, so I
> would argue there isn't a difference. The problem with multiple
> solutions comes up when one wants to destructively modify something,
> which requires both deadness and uniqueness.
`unique' promises deadness on backtracking, as well as uniqueness.
This means that `ui' allows destructive update in some cases
where `mui' wouldn't.
> This then raises the question: is there a useful difference between
> the unique and mostly unique insts? I'm not as sure about this, but I
> don't see this difference either. If there isn't a meaningful
> difference, I think it would be a good thing to remove that
> distinction from the language.
Well, there is a meaningful difference. Whether or not it is useful
is another question.
Removing the distinction would be a non-trivial exercise,
since the distinction derives directly from the distinct
definitions of `unique' and `mostly_unique'.
How would you suggest going about it?
--
Fergus Henderson <fjh at cs.mu.oz.au> | "Binaries may die
WWW: <http://www.cs.mu.oz.au/~fjh> | but source code lives forever"
PGP: finger fjh at 128.250.37.3 | -- leaked Microsoft memo.
More information about the developers
mailing list