[m-dev.] On the addition of assertions

Fergus Henderson fjh at cs.mu.OZ.AU
Tue Aug 24 18:32:11 AEST 1999

On 24-Aug-1999, Peter Ross <petdr at cs.mu.OZ.AU> wrote:
> This email is about where assertions should be placed in a Mercury
> source file.
> There is two options
>     a) have a seperate assertions/specification section
>     b) have pragma style assertions that reside in the
>        interface/implementation sections
> The only diffenence between these two options is what happens when an
> assertion needs to be used inside a different module.

Well, there are also differences as far as users are concerned.
For users option b) would probably be preferable.

> There are two reasons that I can think of why an assertion would be
> needed in a different module
>     * optimization purposes
>     * proving properties of predicates
> Accumulator introduction requires an assertion declaring that a
> predicate is commutative.
> Now imagine a situation where a programmer has declared float:'+' to be
> commutative, intending it to mean float:'+' can be considered
> commutative for the current module so accumulator introducation can be
> used.

This is a bad example.  If the programmer declares float:'+' to be commutative,
then they have lied to the compiler, and so they deserve to be punished ;-)

If we want to support that kind of thing, then it should be via
a separate pragma saying whether the compiler is or is not allowed to
rearrange floating point arithmetic, not via an assertion.
However, even then it would still be a bit problematic, since
such rearrangements could break referential transparency.

> Option a) has no controls on the visibility of the assertions, so the 
> assertion may escape out to any module that imports the current module,
> where the programmer didn't intend float:'+' to be considered to be
> commutative.

For proper uses of assertions, the assertion should be true universally,
not true in some modules and false in others.  So that's not an issue
for proper uses of assertions.

> The problem with option b) is that inside an interface section :-
> import_module only imports the types/modes and insts of a module.
> This means that any predicate/function symbols used by the assertion
> will not be recognised.
> I think that the best approach would be a hybrid of the two and have
> :- spec_interface and :- spec_implementation sections, where assertions
> inside the spec_interface sections can be used in other modules.

How about the following alternative: assertion declarations are allowed
in the interface, but the implementation never copies them to the `.int*'
files, instead putting them only in the `.opt' and `.trans_opt' files.
After type-checking the module, the implementation should check that any
assertion declarations in the interface do not contain any symbols from
modules imported only in the implementation.

Fergus Henderson <fjh at cs.mu.oz.au>  |  "I have always known that the pursuit
WWW: <http://www.cs.mu.oz.au/~fjh>  |  of excellence is a lethal habit"
PGP: finger fjh at        |     -- the last words of T. S. Garp.
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