[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