Thanks,<font class="Apple-style-span" face="arial, sans-serif"><span class="Apple-style-span" style="border-collapse: collapse; white-space: nowrap; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"> Ian for your explanation</span></font><div>
<font class="Apple-style-span" face="arial, sans-serif"><span class="Apple-style-span" style="border-collapse: collapse; white-space: nowrap; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"><br>
</span></font></div><div><div><font class="Apple-style-span" face="arial, sans-serif"><span class="Apple-style-span" style="border-collapse: collapse; white-space: nowrap; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;">Now I indeed see the difference.<img src="cid:330@goomoji.gmail" style="margin-top: 0px; margin-right: 0.2ex; margin-bottom: 0px; margin-left: 0.2ex; vertical-align: middle; " goomoji="330"></span></font></div>
<div><font class="Apple-style-span" face="arial, sans-serif"><span class="Apple-style-span" style="border-collapse: collapse; white-space: nowrap; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"><br>
</span></font></div><div><br></div><div>On Mon, May 17, 2010 at 4:20 AM, Ian MacLarty <span dir="ltr"><<a href="mailto:maclarty@csse.unimelb.edu.au">maclarty@csse.unimelb.edu.au</a>></span> wrote:</div><div><div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div><div></div><div class="h5">On Sun, May 16, 2010 at 11:46 PM, Vladimir Gubarkov <<a href="mailto:xonixx@gmail.com">xonixx@gmail.com</a>> wrote:<br>

> Hi Dear sirs<br>
><br>
> let's look at code<br>
><br>
><br>
> :- module tst2.<br>
><br>
> :- interface.<br>
><br>
> :- import_module io.<br>
><br>
> :- pred main(io, io).<br>
> :- mode main(di, uo) is det.<br>
><br>
> :- implementation.<br>
><br>
><br>
> :- import_module solutions, list, int.<br>
><br>
> main --><br>
>     {<br>
>      promise_equivalent_solutions [L] unsorted_solutions((pred(E::out) is<br>
> nondet :-<br>
>                                  member(E, 1..20),<br>
>                                   E mod 3 = 0<br>
>                                  ), L)<br>
>     },<br>
>     print(L).<br>
><br>
><br>
> Note, that without "promise_equivalent_solutions [L]" it gives<br>
><br>
><br>
> $ mmc tst2<br>
> tst2.m:008: In `main'(di, uo):<br>
> tst2.m:008:   error: determinism declaration not satisfied.<br>
> tst2.m:008:   Declared `det', inferred `multi'.<br>
> tst2.m:017:   call to `solutions.unsorted_solutions'((pred(out) is nondet),<br>
> tst2.m:017:   out) can succeed more than once.<br>
> tst2.m:017: Error: call to predicate `solutions.unsorted_solutions'/2 with<br>
> tst2.m:017:   determinism `cc_multi' occurs in a context which requires all<br>
> tst2.m:017:   solutions.<br>
><br>
><br>
> while compiling.<br>
><br>
> I've read some documentation on cc_multi, and I seem to understand the<br>
> meaning of cc_multi. It's used when we defining predicate as being multi,<br>
> but using it in place where we nead only 1 solution (actually, anyone.. this<br>
> is determined by compiler what solution to return taking in mind<br>
> optimization concerns). What I can't understand is why should I explicitely<br>
> convert it to det with "promise_equivalent_solutions [L]". Why compiler is<br>
> not smart enough to make this automatically?<br>
<br>
</div></div>In general det is not the same as cc_multi, which is why the compiler<br>
doesn't infer them the same automatically.  det means that there is<br>
exactly one solution to the procedure when it's inputs are bound.<br>
cc_multi means that there are one or more solutions, but we only want<br>
to pick one of them.<br>
<br>
Consider the following example:<br>
<br>
:- pred q is semidet.<br>
q :-<br>
    p(X),<br>
    X > 2.<br>
<br>
:- pred p(int::out) is multi.<br>
p(1).<br>
p(2).<br>
p(3).<br>
<br>
When you evaluate q it succeeds.  Now say we changed the determinism<br>
of p to cc_multi and used promise_equivalent_solutions to cast it to<br>
det in the body of q:<br>
<br>
:- pred q is semidet.<br>
q :-<br>
    promise_equivalent_solutions [X] p(X),<br>
    X > 2.<br>
<br>
:- pred p(int::out) is cc_multi.<br>
p(1).<br>
p(2).<br>
p(3).<br>
<br>
Now q fails, even though the program logic (the declarative semantics)<br>
hasn't changed.<br>
<br>
By requiring you to add the promise_equivalent_solutions the compiler<br>
is forcing you to think about whether the solutions to p really are<br>
equivalent.  In this case they aren't and the<br>
promise_equivalent_solutions is a bug.<br>
<br>
I hope that helps.<br>
<br>
Ian.<br>
<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></div></div>