<div dir="ltr">Superb!<div>Julian, that did it for me, the pennies dropped.</div><div>Thanks.<br></div><div>Sean.</div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, 16 Aug 2019 at 15:54, Julian Fondren <<a href="mailto:jfondren@minimaltype.com">jfondren@minimaltype.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On 2019-08-16 09:27, emacstheviking wrote:<br>
> Julian, thanks.<br>
> <br>
> I have refactored / restructured my code and it's all good now...I<br>
> kind of get the explanation but I kept the bad code so I can go back<br>
> and study harder later.<br>
> <br>
> I'm not really understanding your comment about ,<br>
> <br>
>> The !IO there represents IO1 = IO2.<br>
> <br>
> Thanks again.<br>
> <br>
<br>
My answer was imprecise in a few other ways too.<br>
<br>
1. !IO maps to a pair of parameters !.IO, !:IO,<br>
<br>
2. which gets translated to (something like) IO1, IO2, where IO1 is<br>
passed to the predicate and IO2 is a free variable that gets bound<br>
as a result of the predicate.<br>
<br>
3. all bindings established within conditional code are only still<br>
set in the 'then' case. Again: if the conditional fails, none of<br>
these bindings are set, so IO2 in particular isn't set, so you've<br>
passed the 'io' value to a predicate but didn't get it back.<br>
<br>
4. the 'else' case therefore must reuse IO1 (even if it doesn't<br>
refer to !IO, because the !:IO paramter of the predicate the<br>
conditional is in still needs to be satisfied).<br>
<br>
the error tells you that IO1 in my explanation is actually named<br>
STATE_VARIABLE_IO_0.<br>
<br>
As a rule, don't use !IO in conditional code. I/O always succeeds,<br>
even if it successfully reports an error. That you're told the copy<br>
is 'mostly_unique' instead of 'ground' is a hint about a feature<br>
(that isn't an option for io state):<br>
<a href="https://mercurylang.org/information/doc-latest/mercury_ref/Backtrackable-destructive-update.html" rel="noreferrer" target="_blank">https://mercurylang.org/information/doc-latest/mercury_ref/Backtrackable-destructive-update.html</a><br>
<br>
</blockquote></div>