[mercury-users] Fact tables

Fergus Henderson fjh at cs.mu.OZ.AU
Fri Jul 18 13:43:46 AEST 2003

On 18-Jul-2003, Michael Day <mikeday at yeslogic.com> wrote:
> To represent a relation that maps some ints to some other ints, which
> would be the best Mercury implementation:

Best in what way?  Do you mean most efficient? 
Or most readable/maintainable?

> :- pred encoding(int, int).
> :- mode encoding(in, out) is semidet.

That is a good solution.

> :- pred encoding(int, maybe(int)).
> :- mode encoding(in, out) is det.

That is not a particularly good solution.
Firstly, from a style perspective, it would be
better to use a function.  Secondly, as far as
efficiency goes, this will require a heap allocation
for every yes(_) answer, which the other alternatives don't.

> :- pred encoding(int, int).		% returns -1 on failure (ugh)
> :- mode encoding(in, out) is det.

That is likely to be only very marginally more efficient than the first
solution, and stylistically it's better to use a semidet predicate rather
than a sentinel value such as -1.

If you're really going for maximum efficiency above style,
then it's better to use a function:

	:- func encoding(int) = int.	% returns -1 on failure (ugh)

The reason is that for the MLDS based (--high-level-code) back-ends,
a det function's return value will be returned in a register, whereas
an output argument will be passed by reference, which is slightly
less efficient.  (For the original LLDS based back-end, it will make
no difference.)

So, in ordinary circumstances, I'd suggest using the semidet pred.
If your application is performance-critical, and you know that this
procedure will be called in the innermost loop of your application,
then consider using the det function with sentinel value.

Fergus Henderson <fjh at cs.mu.oz.au>  |  "I have always known that the pursuit
The University of Melbourne         |  of excellence is a lethal habit"
WWW: <http://www.cs.mu.oz.au/~fjh>  |     -- the last words of T. S. Garp.
mercury-users mailing list
post:  mercury-users at cs.mu.oz.au
administrative address: owner-mercury-users at cs.mu.oz.au
unsubscribe: Address: mercury-users-request at cs.mu.oz.au Message: unsubscribe
subscribe:   Address: mercury-users-request at cs.mu.oz.au Message: subscribe

More information about the users mailing list