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