<div dir="ltr">Julian your analysis was spot on.</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, 20 Aug 2019 at 17:44, 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-20 11:06, Mark Brown wrote:<br>
> On Tue, Aug 20, 2019 at 3:20 AM Zoltan Somogyi<br>
> <<a href="mailto:zoltan.somogyi@runbox.com" target="_blank">zoltan.somogyi@runbox.com</a>> wrote:<br>
>> <br>
>> On Mon, 19 Aug 2019 14:17:31 +0100, emacstheviking <<a href="mailto:objitsu@gmail.com" target="_blank">objitsu@gmail.com</a>> <br>
>> wrote:<br>
>> > Every time I use multiple predicates with (_,..) as the event<br>
>> <br>
>> What does this mean? If you don't show us the actual code, we cannot <br>
>> tell you<br>
>> what is wrong with it. We can only guess, as the previous two replies <br>
>> have done,<br>
>> which may only confuse you further.<br>
> <br>
> Code was posted, and the relevant predicate was referred to by name.<br>
> The code compiles fine with a reasonable type declaration so long as<br>
> it doesn't have user defined equality or comparison, but if it does<br>
> the compiler reports that a unification has multiple solutions. That<br>
> is why I asked about that feature.<br>
<br>
The code that was posted isn't the code that he had a problem with<br>
though.  "Every time I use multiple predicates with (_,..)" <- so when,<br>
*instead* of the posted code, he tries writing multiple clauses where<br>
one of the clauses uses a _ catch-all, he gets this problem: that the _<br>
means the predicate isn't deterministic anymore, because every event he<br>
wants to handle, he's also handling with the catch-all.<br>
<br>
I think this is pretty clearly what the question is about, but without<br>
code it's arguable that I'm guessing. And, I didn't understand your<br>
reply at all, so clearly there are other potential interpretations of<br>
the question :)<br>
<br>
Mercury FAQ for people from FP langs with pattern-matching (SML, OCaml,<br>
Erlang, Haskell, even Rust):<br>
<br>
Q. Why isn't this deterministic?<br>
<br>
   :- func handle(bool) = string.<br>
   handle(yes) = "the bool was 'yes'".<br>
   handle(_) = "the bool was something else".<br>
<br>
A. Unlike in FP langs with pattern-matching, these clauses aren't<br>
ordered and the _ isn't a "catch-all" that in this code will only ever<br>
match 'no' after the 'no' fails to match against the first clause. This<br>
is a disjunction and only one clause must be true; because _ also<br>
matches yes, both clauses define solutions for handle(yes), so this must<br>
be (at least) a 'multi' rule.<br>
<br>
As a rule, you can<br>
<br>
1. exhaustively match all the cases to achieve a deterministic<br>
disjunction.<br>
<br>
   handle(yes) = "...".<br>
   handle(no) = "...".<br>
<br>
or<br>
<br>
   :- type other_thing ---> yes ; no ; maybe.<br>
<br>
   :- func handle(other_thing) = string.<br>
   handle(yes) = "the other thing was 'yes'".<br>
   handle(X) = _ :-<br>
       ( X = no ; X = maybe ),<br>
       throw(not_implemented).<br>
<br>
2. wrap an incomplete disjunction in a conditional, with the 'else' part<br>
of the conditional as your catch-all.<br>
<br>
   handle(B) = R :-<br>
       ( if X = yes, R0 = "ok" ; X = no, R0 = "denied" then<br>
           R = R0<br>
       else<br>
           throw(not_implemented)<br>
       ).<br>
<br>
3. drop down to semidet determinism, allowing for failure and no 'else'<br>
case.<br>
<br>
     :- func handle(bool::in) = (string::out) is semidet.<br>
     handle(yes) = "the bool was 'yes'".<br>
     % nothing else.<br>
<br>
As a rule, you SHOULD NOT EVER<br>
<br>
1. replace 'det' with 'cc_multi'. It will only accidentally seem to do<br>
what you want.<br>
<br>
>> only det code may do I/O.<br>
> <br>
> cc_multi code may do I/O.<br>
> <br>
> Mark<br>
> _______________________________________________<br>
> users mailing list<br>
> <a href="mailto:users@lists.mercurylang.org" target="_blank">users@lists.mercurylang.org</a><br>
> <a href="https://lists.mercurylang.org/listinfo/users" rel="noreferrer" target="_blank">https://lists.mercurylang.org/listinfo/users</a><br>
_______________________________________________<br>
users mailing list<br>
<a href="mailto:users@lists.mercurylang.org" target="_blank">users@lists.mercurylang.org</a><br>
<a href="https://lists.mercurylang.org/listinfo/users" rel="noreferrer" target="_blank">https://lists.mercurylang.org/listinfo/users</a><br>
</blockquote></div>