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

Razetime rraghu.11502 at gmail.com
Mon Oct 17 21:26:47 AEDT 2022


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 <post at volker-wysk.de> 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
>> users at lists.mercurylang.org
>> https://lists.mercurylang.org/listinfo/users
>
>


More information about the users mailing list