Я не могу заставить мою Prolog DCG работать с атомом concat - PullRequest
0 голосов
/ 26 января 2019

Я не могу заставить работать этот код Prolog DCG:

String1="   ",string_codes(String1,Codes),phrase(spaces(Output),Codes).

spaces(XXs) -->
   [X], {X=32}, spaces(Xs),
   {char_code(Ch,X), atom_concat(Ch,Xs,XXs)}, !. %%Space
spaces([]) --> [].

Ответы [ 3 ]

0 голосов
/ 26 января 2019

Мне кажется, что улучшенное решение, вероятно, будет примерно таким:

spaces(Spaces) --> " ", spaces(S0), { atom_concat(' ', S0, Spaces) }.
spaces('') --> [].

Нет необходимости спрашивать, что такое символ для кода 32, вы знаете, что это пробел.Кроме того, [X], {X=32} из вашего ответа лучше как [32], что еще лучше как " ".

0 голосов
/ 26 января 2019

Если вы используете 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 = [].
0 голосов
/ 26 января 2019

Я решил это, изменив [] в базовом случае на ''.

spaces(XXs) -->
   [X], {X=32}, spaces(Xs),
   {char_code(Ch,X), atom_concat(Ch,Xs,XXs)}, !. %% Space
spaces('') --> [].

String1 = "   ",
Codes = [32, 32, 32],
Output = '   '.
...