[m-rev.] For review: change the way we handle inst any non-locals in negated contexts (again)

Ralph Becket rafe at cs.mu.OZ.AU
Wed Dec 14 10:47:39 AEDT 2005

Mark Brown, Wednesday, 14 December 2005:
> On 13-Dec-2005, Ralph Becket <rafe at cs.mu.OZ.AU> wrote:
> > Undo my recent changes to purity error checking in the context of inst any
> > non-locals in negated contexts.
> > 
> > Implement a better way of handling the problem, as discussed on the mailing
> > list.  The new solution is to require that any goals featuring inst any 
> > non-locals in a negated context must appear in a
> > promise_{pure,semipure,impure} context.
> This isn't quite the solution that was discussed on the mailing list.

Perhaps I should have said "as inspired by discussion on the mailing

> The
> solution we discussed is that negations/if-then-elses which may bind inst
> 'any' non-locals in a negated context should be inferred to be impure, and
> must be explicitly marked as such (unless in a promise_pure_implicit scope).
> For example, if Cond binds a non-local variable then we can do one of the
> following:   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> [...]
> The rationale is orthogonality: goals which introduce impurity should be
> treated the same way regardless of whether they are calls to impure
> predicates, unifications containing a call to an impure function, or impure
> negations/if-then-elses.  The three options we have above are the same
> three options that we have for dealing with the already existing ways of
> introducing impurity.  Is there any reason why the new way should be
> different?

There is one key difference: we can't know whether a non-local solver
var is being constrained in a negated context or not.  Consider

:- pred any_list.det_head(list(T)::ia, T::oa) is semidet.
any_list.det_head(Xs, X) :-
	( if Xs = [X0 | _] then X = X0 else throw("empty list") ).

Note that the list spine is not a solver type, but the list members are.
The condition features inst any non-locals, but does not further
constrain them.  If, instead, the condition used some auxiliary
predicate instead of a deconstruction then there'd be no way in
general of deciding.

It therefore isn't at all clear whether something impure is really
happening or not, which makes this a legitimate use for purity promises.

> > This is something of a compromise:
> > on the one hand it does require that the condition be explicitly recognised
> > by the programmer; on the other, it does not require that the "offending" goals
> > be individually identified
> I don't think you need to say this.  Bear in mind that when we say "inst 'any'
> non-locals" we mean those that are non-local to the negation/if-then-else.
> The offending goal is the negation or if-then-else, and according to the
> solution we had settled on it _is_ the one which is identified.

But the negation/if-then-else may not be impure at all.  Your approach
requires the programmer to say something is impure, regardless of
whether it is or not, and *then* promise otherwise.

-- Ralph
mercury-reviews mailing list
post:  mercury-reviews at cs.mu.oz.au
administrative address: owner-mercury-reviews at cs.mu.oz.au
unsubscribe: Address: mercury-reviews-request at cs.mu.oz.au Message: unsubscribe
subscribe:   Address: mercury-reviews-request at cs.mu.oz.au Message: subscribe

More information about the reviews mailing list