ENHANCED: Improve determinism of ... //0 and seq//1.
Example:
?- phrase(..., "hello").
true.
This addresses #1577.
This commit is contained in:
@@ -132,16 +132,29 @@ user:term_expansion(Term0, Term) :-
|
|||||||
dcg_rule(Term0, Term).
|
dcg_rule(Term0, Term).
|
||||||
|
|
||||||
% Describes a sequence
|
% Describes a sequence
|
||||||
|
seq(Xs) -->
|
||||||
|
call(det_end_(Xs)),
|
||||||
|
!.
|
||||||
seq([]) --> [].
|
seq([]) --> [].
|
||||||
seq([E|Es]) --> [E], seq(Es).
|
seq([E|Es]) --> [E], seq(Es).
|
||||||
|
|
||||||
|
det_end_(Xs, Cs0,Cs) :-
|
||||||
|
var(Xs),
|
||||||
|
Cs0 == [],
|
||||||
|
Xs = [],
|
||||||
|
Cs0 = Cs.
|
||||||
|
|
||||||
% Describes a sequence of sequences
|
% Describes a sequence of sequences
|
||||||
seqq([]) --> [].
|
seqq([]) --> [].
|
||||||
seqq([Es|Ess]) --> seq(Es), seqq(Ess).
|
seqq([Es|Ess]) --> seq(Es), seqq(Ess).
|
||||||
|
|
||||||
% Describes an arbitrary number of elements
|
% 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, must_be/2), error(E, must_be/2)).
|
||||||
error_goal(error(E, (=..)/2), error(E, (=..)/2)).
|
error_goal(error(E, (=..)/2), error(E, (=..)/2)).
|
||||||
|
|||||||
Reference in New Issue
Block a user