Re: [m-users.] Determinism error caused by instantiation error, not sure why.

"Zoltan Somogyi" <[email protected]>
Newsgroups gmane.comp.lang.mercury.general
Message-ID <[email protected]>
2022-10-31 10:11 GMT+11:00 "Sean Charles (emacstheviking)" <[email protected]>:
> The error:
> 
> repl.m:738: In `take_gencall'(in, out, in, out, in, out):
> repl.m:738:   error: determinism declaration not satisfied.
> repl.m:738:   Declared `det', inferred `semidet'.
> repl.m:747: In clause for `take_gencall(in, out, in, out, in, out)':
> repl.m:747:   warning: unification of `Out' and maybe.yes cannot succeed.
> repl.m:747:   `Out' has instantiatedness `unique(no)'.
> 
> The code:
> 
> :- pred take_gencall(error_msg::in, maybe(snode)::out, s::in, s::out,
>     lsnode::in, lsnode::out) is det.
> 
> take_gencall(Er, Out, !S) -->
>     ( if no_errors(!.S) then
>         ( if [GC] then
>             { Pos = snpos(GC) },
>             ( if { GC = gencall(_, _, _) } then
>                  { Out = yes(GC) }   <== line 747
>             else
>                 cerror(Pos, Er, !S),
>                 { Out = no }
>             )
>         else
>             premature(!S)),
>             { Out = no }
>     else
>         { Out = no }
>     ).
> 
> For the life of me I don't understand why the line in bold is causing an error, why has Out become `unique(no)` and does that no refer to a general no or is it the no from the may() discriminated union, I just don't see my mistake. Sorry.

Because the code you are looking at is not what the compiler sees.

You have a misplaced close parenthesis. It *should* be just before the final "else",
but in actuality, it occurs just after "premature(!S)". So what the compiler sees
is a conjunction containing both (a) the code after the call to premature,
which is Out = no, and the if-then-else containing Out = yes(GC).

Zoltan.
_______________________________________________
users mailing list
[email protected]
https://lists.mercurylang.org/listinfo/users
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.