Если вы используете DCG и используете SWI-Prolog, в dcgbasics есть библиотека часто используемых предикатов и предложений DCG.Это можно использовать в коде с
:- use_module(library(dcg/basics)).
. Для перечисления кода для предикатов используйте перечисление / 1 , например,
?- listing(dcg_basics:_).
В библиотеке есть предложение DCGblanks//0
выполняет то, что вы хотите, например,
?- listing(dcg_basics:blanks).
blanks(A, B) :-
blank(A, C),
!,
D=C,
blanks(D, B).
blanks(A, A).
true.
?- listing(dcg_basics:blank).
blank([C|A], B) :-
nonvar(C),
code_type(C, space),
B=A.
true.
, что в качестве DCG равно
blank -->
[C],
{
nonvar(C),
code_type(C,space)
}.
blanks -->
blank, !, blanks.
blanks --> [].
NB
В версии библиотеки используется character codes
, а не characters
.
?- string_codes("",Codes),phrase(blanks,Codes,Rest).
Codes = Rest, Rest = [].
?- string_codes(" ",Codes),phrase(blanks,Codes,Rest).
Codes = [32],
Rest = [].
?- string_codes(" ",Codes),phrase(blanks,Codes,Rest).
Codes = [32, 32],
Rest = [].
?- string_codes(" ",Codes),phrase(blanks,Codes,Rest).
Codes = [32, 32, 32],
Rest = [].