[m-dev.] proposal for promise_pure scope warning
Ian MacLarty
maclarty at csse.unimelb.edu.au
Tue Apr 15 14:45:15 AEST 2008
On Tue, Apr 15, 2008 at 02:09:47PM +1000, Julien Fischer wrote:
>
> On Tue, 15 Apr 2008, Ian MacLarty wrote:
>
>> On Tue, Apr 15, 2008 at 01:05:22PM +1000, Julien Fischer wrote:
>>> On Tue, 15 Apr 2008, Ian MacLarty wrote:
>>>
>>>> On Tue, Apr 15, 2008 at 9:26 AM, Peter Schachte
>>>> <schachte at csse.unimelb.edu.au> wrote:
>>>>>
>>>>>>
>>>>>>> Well, either the author of the called predicate made it impure for a
>>>>>>> reason, in which case you shouldn't be promising that a call to the
>>>>>>> predicate is pure, or the author made a mistake and the predicate is
>>>>>>> actually pure, in which case it is the author's responsibility to
>>>>>>> fix the interface. In any case the warning can always be disabled.
>>>>>>>
>>>>>>
>>>>>
>>>>> Isn't it possible for one particular call to a generally impure
>>>>> predicate
>>>>> to be pure? Eg, with that particular argument list, it's pure.
>>>>>
>>>>
>>>> I suppose so, but is this a good enough reason not to issue a warning?
>>>> I've come across bugs where this warning would have helped twice now.
>>>>
>>>> Most of the warnings issued by the compiler have cases where they
>>>> don't apply (consider for example too lax determinism warnings). We
>>>> still issue them, because often they are helpful. In the cases where
>>>> the warning is inappropriate we usually either change the code or
>>>> disable the warning if changing the code is not possible.
>>>>
>>>> I think the warning I'm proposing would be useful enough to be worth
>>>> the slight inconvenience caused when it's not applicable.
>>>
>>> You could always have the warning turned off by default.
>>>
>>> I think you only want to emit a warning for promise_pure scopes around
>>> impure goals that do not have any outputs and have determinism det or
>>> cc_multi however.
>>>
>>
>> Why no outputs?
>>
>> Also why only if the determinism is det or cc_multi?
>>
>> If you have:
>>
>> promise_pure ( impure p )
>>
>> where p is semidet, then surely that is an error?
>
> Maybe, but the compiler won't optimise that away because it can fail.
It depends on the context. The compiler could optimise the following
away:
( promise_pure ( impure p ) ->
true
;
true
)
The same applies to the case where there is output, but the output is
not used.
> (Which is the "bug" I assume you are trying to address here)
>
That is a symptom, but the underlying problem is that purity is being
promised away in the wrong spot. A goal like:
promise_pure ( impure p )
just makes no sense (regardless of the determinism), because either the
goal should be impure, or p itself should be pure.
Ian.
--------------------------------------------------------------------------
mercury-developers mailing list
Post messages to: mercury-developers at csse.unimelb.edu.au
Administrative Queries: owner-mercury-developers at csse.unimelb.edu.au
Subscriptions: mercury-developers-request at csse.unimelb.edu.au
--------------------------------------------------------------------------
More information about the developers
mailing list