[mercury-users] Fact tables

David Overton dmo at cs.mu.OZ.AU
Fri Jul 18 12:26:18 AEST 2003

On Fri, Jul 18, 2003 at 12:15:22PM +1000, Michael Day wrote:
> Hi,
> To represent a relation that maps some ints to some other ints, which
> would be the best Mercury implementation:
> :- pred encoding(int, int).
> :- mode encoding(in, out) is semidet.
> :- pred encoding(int, maybe(int)).
> :- mode encoding(in, out) is det.
> :- pred encoding(int, int).		% returns -1 on failure (ugh)
> :- mode encoding(in, out) is det.
> The input does not form a contiguous range (although it may form multiple
> independent contiguous ranges).
> Would using the fact_table pragma affect the implementation, or just the
> compilation speed? (presumably it would rule out using maybe(int)).

Well, you _could_ could still use maybe(int) if you wanted, you just put
a wrapper around the semidet version of the fact table:

	encoding(N, M) :-
		( encoding2(N, M0) ->
			M = yes(M0)
			M = no

	:- pred encoding2(int::in, int::out) is semidet.
	:- pragma fact_table(encoding2/2, ....).

`:- pragma fact_table' uses a completely different compilation process to
compiling normal predicates so the C code you end up with will be
different.  It basically generates a bunch of hash tables which will
probably be at least as efficient as the code generated for a normal
predicate, but there is no guarantee...

David Overton                  Uni of Melbourne     +61 3 8344 1354
dmo at cs.mu.oz.au                Monash Uni (Clayton) +61 3 9905 5779
http://www.cs.mu.oz.au/~dmo    Mobile Phone         +61 4 0337 4393
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