From: Markus Triska Date: Sun, 21 Aug 2022 12:29:32 +0000 (+0200) Subject: ENHANCED: Improve determinism of ... //0 and seq//1. X-Git-Tag: v0.9.1^2~32 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=47892bf24a8c4becb196f1b400fe40d5b50be9fa;p=scryer-prolog.git ENHANCED: Improve determinism of ... //0 and seq//1. Example: ?- phrase(..., "hello"). true. This addresses #1577. --- diff --git a/src/lib/dcgs.pl b/src/lib/dcgs.pl index 54160cf6..ae996cf0 100644 --- a/src/lib/dcgs.pl +++ b/src/lib/dcgs.pl @@ -132,16 +132,29 @@ user:term_expansion(Term0, Term) :- dcg_rule(Term0, Term). % Describes a sequence +seq(Xs) --> + call(det_end_(Xs)), + !. seq([]) --> []. seq([E|Es]) --> [E], seq(Es). +det_end_(Xs, Cs0,Cs) :- + var(Xs), + Cs0 == [], + Xs = [], + Cs0 = Cs. + % Describes a sequence of sequences seqq([]) --> []. seqq([Es|Ess]) --> seq(Es), seqq(Ess). % Describes an arbitrary number of elements +... --> call(det_end), !. ... --> [] | [_], ... . +det_end(Cs0,Cs) :- + Cs0 == [], + Cs0 = Cs. error_goal(error(E, must_be/2), error(E, must_be/2)). error_goal(error(E, (=..)/2), error(E, (=..)/2)).