<div class="gmail_quote"><br></div><div class="gmail_quote">On Wed, Mar 30, 2011 at 2:40 AM, Peter Wang <span dir="ltr"><<a href="mailto:novalazy@gmail.com">novalazy@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div class="im">On 2011-03-29, Vladimir Gubarkov <<a href="mailto:xonixx@gmail.com">xonixx@gmail.com</a>> wrote:<br>
> Hi,<br>
><br>
> I'm experimenting with some optimization options. I know, that mercury<br>
> supports goal-reodering for optimization, so I thought, that it could<br>
> optimize next code to tail-recursive, but seems It's not.<br>
</div>...<br>
<div class="im">><br>
> :- pred replaceEvenElementList(list(char), list(char)).<br>
> :- mode replaceEvenElementList(in, out) is det.<br>
><br>
> replaceEvenElementList([A,E|T1],[A,E1|T2]):- replaceEvenElementList(T1,T2),<br>
> E1 = (E='x'->'y'; E).<br>
<br>
</div>--optimise-constructor-last-call can do it if you move the construction<br>
directly after the recursive call.<br>
<br>
replaceEvenElementList([], []).<br>
replaceEvenElementList([A], [A]).<br>
replaceEvenElementList([A, B0 | L0], L) :-<br>
    B = (B0 = 'x' -> 'y' ; B0),<br>
    replaceEvenElementList(L0, L1),<br>
    L = [A, B | L1].<br></blockquote><div><br></div><div>The thing is that --optimise-constructor-last-call can do it also for code:</div><div><br></div><div>replaceEvenElementList([], []).<br>replaceEvenElementList([A], [A]).<br>
replaceEvenElementList([A, B0 | L0], [A, B | L1]) :-<br>   B = (B0 = 'x' -> 'y' ; B0),<br>   replaceEvenElementList(L0, L1).</div><div><br></div><div>but not for:</div><div><br></div><div>replaceEvenElementList([], []).<br>
replaceEvenElementList([A], [A]).<br>replaceEvenElementList([A, B0 | L0], [A, B | L1]) :-<br>   replaceEvenElementList(L0, L1),</div><div>   B = (B0 = 'x' -> 'y' ; B0).</div><div><br></div><div>But I thought that if for mercury this two definitions should be logically equal (goal order not metters) then it could in theory optimize the second one to be tail-recursive (ok, with constractor-last-call) either. But it's not. </div>
<div><br></div><div>How do you think, theoretically is this optimization possible, or maybe it's incorrect to perform such optimization? Though, I don't see why.</div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

Peter<br>
--------------------------------------------------------------------------<br>
mercury-users mailing list<br>
Post messages to:       <a href="mailto:mercury-users@csse.unimelb.edu.au">mercury-users@csse.unimelb.edu.au</a><br>
Administrative Queries: <a href="mailto:owner-mercury-users@csse.unimelb.edu.au">owner-mercury-users@csse.unimelb.edu.au</a><br>
Subscriptions:          <a href="mailto:mercury-users-request@csse.unimelb.edu.au">mercury-users-request@csse.unimelb.edu.au</a><br>
--------------------------------------------------------------------------<br>
</blockquote></div><br>