Re: [m-users.] Problem with DCG producing false negative

Razetime <[email protected]>
Newsgroups gmane.comp.lang.mercury.general
Message-ID <CAMtxHUttgQy+tpxOAG2pBw0Sjs4_FYqP2R6CKRt959G4CdWacw@mail.gmail.com>
hm, it makes sense that the dcg rule should be semidet or det. These
are the problems I had when trying to change the rules.

1)
a07.m:011: In `tls'(out, out, in, out):
a07.m:011:   error: determinism declaration not satisfied.
a07.m:011:   Declared `semidet', inferred `nondet'.
a07.m:011:   The reasons for the difference are the following.
a07.m:012:   Disjunction has multiple clauses with solutions.
a07.m:013:   Call to `alib.seq'(out, in, out) can succeed more than once.
a07.m:014:   Call to `alib.seq'(out, in, out) can succeed more than once.

2) after changing alib.seq to semidet (changing to det also gives the
same error)
a07.m:011: In `tls'(out, out, in, out):
a07.m:011:   error: determinism declaration not satisfied.
a07.m:011:   Declared `semidet', inferred `nondet'.
a07.m:011:   The reason for the difference is the following.
a07.m:012:   Disjunction has multiple clauses with solutions.

I assume that `any_true(abba,[X0|X])' is causing this but i do not
know how to fix it. For now I am separating the logic from the DCG.

On 10/17/22, Volker Wysk <[email protected]> wrote:
> Hi
>
> I don't fully understand what you're doing here. But you should try to make
> the DCG rules det or semidet. Then you can let the compiler spot your
> errors, when it doesn't agree with the determinism category which you have
> declared.
>
> Hope that helps,
> Volker
>
>
> Am Montag, dem 17.10.2022 um 00:14 +0530 schrieb Razetime:
>> I have created the following predicate tls to match lines that satisfy
>> the conditions given in Advent of Code Day 7:
>> https://adventofcode.com/2016/day/7 (Spoilers)
>>
>> For some reason during testing ,the DCG fails when given
>> L="fslvgbiibdkhchajyb[zpbhqrokrbfuqrowop]gqqzoqvfsdfcjcdurrs[xhqfcfytbbekivnvod]jxjwuxivnyhppvfhaol[evfnrmrjnnhychtpv]emiyjcjsnojxexs",
>> tls(X,Y,to_char_list(L),[])
>> and I am not sure why it is giving that result. What is done wrong here?
>>
>> :- pred tls(list(cl)::out,list(cl)::out,cl::in,cl::out) is nondet.
>> tls([X],[])        --> {alp(X)},seq(X).
>> tls([X0|X],[Y0|Y]) --> {alp(X0),alp(Y0),\+abba(Y0)},
>>
>> seq(X0),['['],seq(Y0),[']'],tls(X,Y),{any_true(abba,[X0|X])}.
>>
>> :- pred seq(list(T),list(T),list(T)).
>> :- mode seq(out,in,out) is multi.
>> seq([])     --> [].
>> seq([E|Es]) --> [E], seq(Es).
>>
>> :- pred alp(cl::in) is semidet.
>> alp(L):-all_true(is_alpha,L).
>>
>> :- pred abba(cl::in) is semidet.
>> abba([A,B,B,A|L]):-A\=B.
>> abba([_,A,B,C|L]):-abba([A,B,C|L]).
>> _______________________________________________
>> users mailing list
>> [email protected]
>> https://lists.mercurylang.org/listinfo/users
>
>
_______________________________________________
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.