Hi,<div><br></div><div>I'm experimenting with some optimization options. I know, that mercury supports goal-reodering for optimization, so I thought, that it could optimize next code to tail-recursive, but seems It's not.</div>
<div><br></div><div>%%% begin</div><div><br></div><div><div>:- module x_to_y.</div><div>:- interface.</div><div>:- import_module io.</div><div>:- pred main(io::di, io::uo) is det.</div><div>:- implementation.</div><div><br>
</div><div>:- import_module list, char, int, require.</div><div><br></div><div>:- pred replaceEvenElementList(list(char), list(char)).</div><div>:- mode replaceEvenElementList(in, out) is det.</div><div><br></div><div>replaceEvenElementList([A,E|T1],[A,E1|T2]):- replaceEvenElementList(T1,T2), E1 = (E='x'->'y'; E).</div>
<div>%replaceEvenElementList([A,E|T1],[A,E1|T2]):- E1 = (E='x'->'y'; E), replaceEvenElementList(T1,T2).</div><div>replaceEvenElementList([E],[E]).</div><div>replaceEvenElementList([],[]).</div><div><br>
</div><div>:- mode gen(in, in, out, in) is det.</div><div>gen(N, E) --> </div><div><span class="Apple-tab-span" style="white-space:pre">       </span>(<span class="Apple-tab-span" style="white-space:pre">   </span>{N>0} -></div>
<div><span class="Apple-tab-span" style="white-space:pre">              </span>[E],</div><div><span class="Apple-tab-span" style="white-space:pre">         </span>gen(N-1, E)</div><div><span class="Apple-tab-span" style="white-space:pre">  </span>;</div>
<div><span class="Apple-tab-span" style="white-space:pre">              </span>[]</div><div><span class="Apple-tab-span" style="white-space:pre">   </span>).</div><div><span class="Apple-tab-span" style="white-space:pre">   </span></div>
<div>l = L :- gen(10000000, 'x', L, []).</div><div><br></div><div>main --> {replaceEvenElementList(l, L1), (take(10,L1,L2) -> L = L2; error("Not enough!"))}, print(L).</div></div><div><br></div><div>
%%% end</div><div><br></div><div>I'm using command line options</div><div><br></div><div><div>set OPTS=%OPTS% --make --infer-all </div><div>set OPTS=%OPTS% -O6</div><div>set OPTS=%OPTS% --optimize-constructor-last-call</div>
<div>set OPTS=%OPTS% --grade=hlc.gc</div><div>set OPTS=%OPTS% --structure-reuse</div></div><div><br></div><div>But it shows stack-overflow this way. If uncomment second line of clause definition and comment first one - works fine.</div>
<div>Maybe there is some additional optimization command line switch that can do the job?</div><div><br></div><div><br></div><div>This is more theoretical than practical question and it appears as a result of some holywar I'm participating in. :-)</div>
<div><br></div><div><br></div><div>Thank you</div>