[mercury-users] List instantiation question

Ralph Becket rafe at cs.mu.OZ.AU
Thu Mar 2 17:44:07 AEDT 2006


doug.auclair at logicaltypes.com, Thursday,  2 March 2006:
> 
> For this particular case it wasn't (the partially instantiated list
> was a guarantee of the list length, declaratively, as well as
> providing the place-holders for the resulting values, making the
> entire block deterministic)

Could you use an array instead?

> , but I have worked on systems where
> efficiency /was/ an issue -- a serious one -- so if I may ask, what is
> the efficient equivalent to Prolog's:
> 
> add_elements([H0|T]) -->
>   { do_something_with(H0, H) },
>   [H],
>   add_elements(T).
> 
> (called thusly:  add_elements(SomeStuff, Answer, []))
> 
> The above example is 0(N), whereas the documented Mercury response of
> 'prepend to the head and then reverse the resulting list' is O(2N).

And, of course, O(2n) = O(n) :-)

Prolog programs pay a huge performance cost supporting variables that
support this kind of thing.  Mercury programs don't pay this cost at all
because Mercury variables do not support Prolog-style aliasing.  Mercury
will beat Prolog in almost any contest of this kind because Mercury's
constant factors are much smaller.

> This approach is what I settled on for the code I sent as the example:
> is there a better way than prepend-then-reverse?

Well... you could use an array buffer and double its length when needed
although that's still "O(2n)" in the worst case.  And, of course, using
arrays has consequences for determinism.

I did some experiments a couple of years ago and found that when n was
small (say 50 - 100) it was very hard to beat simple applicative list
programming for performance, no matter how clever I tried to be.

-- Ralph
--------------------------------------------------------------------------
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