[m-users.] Determinism woes...

David Overton david at overtons.id.au
Fri Jul 5 09:17:11 AEST 2019


You can use if then else to make it det.

On Fri, 5 Jul 2019 at 09:10, emacstheviking <objitsu at gmail.com> wrote:

> Spoke too soon! FUll source and error output....it's beyond my little bear
> brain this time of night...I thought that by declaring char_type as
> cc_multi the compiler would NOT think it would have multiple solutions as I
> committed to the first one as the only solution?!?!
>
> fl1.m:020: In `char_loop'(di, uo):
> fl1.m:020:   error: determinism declaration not satisfied.
> fl1.m:020:   Declared `det', inferred `multi'.
> fl1.m:027:   Call to `fl1.char_type'(in, out) can succeed more than once.
> fl1.m:027: Error: call to predicate `fl1.char_type'/2 with determinism
> fl1.m:027:   `cc_multi' occurs in a context which requires all solutions.
> ** Error making `Mercury/cs/fl1.c'.
>
> and the code
>
>     :- pred char_loop(io::di, io::uo) is det.
>     char_loop(!IO) :-
>         read_char(C, !IO),
>         (
>             C = eof
>         ;
>             C = ok(C2),
>             char_type(C2, CType),
>             chartype_s(CType, CTypeStr),
>             format("%c %d %s\n", [c(C2), i(char.to_int(C2)), s(CTypeStr)],
> !IO),
>             char_loop(!IO)
>         ;
>             C = error(ErrorCode),
>             io.format("%s...\n", [s(io.error_message(ErrorCode))], !IO)
>         ).
>
> :- type chartype
>     --->    p_open
>     ;       p_close
>     ;       c_general.
>
> :- pred char_type(char::in, chartype::out) is cc_multi.
> char_type(')', p_open).
> char_type('(', p_close).
> char_type(_, c_general).
>
> :- pred chartype_s(chartype::in, string::out) is det.
> chartype_s(p_open, "general").
> chartype_s(p_close, "popen").
> chartype_s(c_general, "pclose").
>
> Going to sleep on it...
>
> On Thu, 4 Jul 2019 at 23:46, emacstheviking <objitsu at gmail.com> wrote:
>
>> Thanks Richard!
>>
>> That is so obvious when you see it. I am thinking like a Haskell hacker
>> this evening for sure.
>> I changed it to "cc_multi" and it compiled ANd did what I expected /
>> wanted.
>>
>> In my prolog code I have a cut after each match to commit (cc_multi!!!)
>> to that and no more....OMG (trust me I have to be desparate to even think
>> that acronym) it really does match !!! I am going to stick that response on
>> a post-it under my monitor for a whole month!
>>
>> Currently re-reading section 6 of the manual...sigh...these are the times
>> when I just know that a formal education might have helped me stumble and
>> fall a little less.
>>
>> Thanks again,
>> Sean.
>>
>>
>>
>> On Thu, 4 Jul 2019 at 23:40, Richard O'Keefe <raoknz at gmail.com> wrote:
>>
>>> char_type(')', p_open).
>>> char_type('(', p_close).
>>> char_type(_, c_general).
>>>
>>> ')' matches two clauses, the first and last.
>>> '(' matches two clauses, the second and last.
>>>
>>> On Fri, 5 Jul 2019 at 10:24, emacstheviking <objitsu at gmail.com> wrote:
>>>
>>>> To paraphrase Neo, "I know Prolog".
>>>>
>>>> but I don't know Mercury and I am struggling to figure out this
>>>> error....I am porting some old SWI code and it boils down to the fact that
>>>> I obvuisly don't truly understand what "det" means! Here is the code both
>>>> as discrete disjunctive clauses and a single big disjunct:
>>>>
>>>> :- pred char_type(char::in, chartype::out) is det.
>>>>
>>>> char_type(')', p_open).
>>>> char_type('(', p_close).
>>>> char_type(_, c_general).
>>>>
>>>> char_type(C, T) :-
>>>>     (
>>>>         C = '(', T = p_open
>>>>     ;   C = ')', T = p_close
>>>>     ;   C = _,   T = c_general
>>>>     ).
>>>>
>>>> and here is the compiler output:
>>>>
>>>> fl1.m:049: In `char_type'(in, out):
>>>> fl1.m:049:   error: determinism declaration not satisfied.
>>>> fl1.m:049:   Declared `det', inferred `multi'.
>>>> fl1.m:056:   Disjunction has multiple clauses with solutions.
>>>>
>>>> Now...I understand why (I think) this happens: it's because the final
>>>> matching disjuny can match more than one character value hence the multiple
>>>> (multi) classification by the compiler BUT he calling loop seeks merely to
>>>> convert a character into a character type.
>>>>
>>>> Is this "cc_multi" in disguise as if the character is not one of the
>>>> ones explicitly tested for then I will commit to the first choice as it
>>>> will be a "general" character i.e. one with no special meaning to my little
>>>> lexer.
>>>>
>>>> Thank you,
>>>> Sean.
>>>>
>>>> _______________________________________________
>>>> users mailing list
>>>> users at lists.mercurylang.org
>>>> https://lists.mercurylang.org/listinfo/users
>>>>
>>> _______________________________________________
> users mailing list
> users at lists.mercurylang.org
> https://lists.mercurylang.org/listinfo/users
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mercurylang.org/archives/users/attachments/20190705/6f18759c/attachment-0001.html>


More information about the users mailing list