[mercury-users] Exceptions, determinism and purity

Peter Schachte schachte at csse.unimelb.edu.au
Fri Mar 7 14:22:36 AEDT 2008


Nicholas Nethercote wrote:
> Hi,
> 
> Take this predicate:
> 
>   :- pred p(int::in) is det.
> 
> It is det and doesn't produce any output.  So at first glance you'd 
> think you could safely remove any call to it.
> 
> But, it could be defined like this:
> 
>   pos(X) :- ( if X >= 0 then true else error("negative!") ).
> 
> So removing calls could clearly change a program's behaviour.

Similarly if pos/1 were implemented like:

	pos(X) :- pos(X).

If you think of a predicate in terms of its finite success and failure sets, 
removing a det goal cannot change the finite failure set, so it doesn't make 
anything true that was previously false (nor vice-versa, of course).  All it 
does is make the code more complete by adding to the finite success set.

Perhaps it's a bit unfortunate that you can't simulate C's assert() in 
Mercury by using a det goal with some error cases.  It wouldn't be correct 
anyway, since the compiler can freely reorder the test after where it's needed.

-- 
Peter Schachte              We should not focus on giving any one group an
schachte at cs.mu.OZ.AU        especially good life, but on giving the greatest
www.cs.mu.oz.au/~schachte/  possible life for the community as whole.
Phone: +61 3 8344 1338          -- Plato
--------------------------------------------------------------------------
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