]> Repositorios git - scryer-prolog.git/commitdiff
ENHANCED: Improve determinism of ... //0 and seq//1.
authorMarkus Triska <[email protected]>
Sun, 21 Aug 2022 12:29:32 +0000 (14:29 +0200)
committerMark Thom <[email protected]>
Thu, 27 Oct 2022 05:36:07 +0000 (23:36 -0600)
Example:

    ?- phrase(..., "hello").
       true.

This addresses #1577.

src/lib/dcgs.pl

index 54160cf6e2001f824144138b0ad1fd93cf295e0d..ae996cf0821bd5ae138afda6576b22fd7725f1ab 100644 (file)
@@ -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)).