我无法让Prolog DCG与atom concat一起工作

我无法让Prolog DCG与atom concat一起工作,prolog,dcg,Prolog,Dcg,我无法使此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([]) --> []. 我通过将基本情况中的[]改为 spaces(XXs)

我无法使此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([]) --> [].

我通过将基本情况中的[]改为

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

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

我通过将基本情况中的[]改为

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

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

我觉得改进后的解决方案可能是这样的:

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

没有必要问代码32的字符是什么,你知道它是一个空格。另外,[X],{X=32}从你的答案来看,比[32]更好,比[32]更好。

我觉得改进后的解决方案可能是这样的:

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

没有必要问代码32的字符是什么,你知道它是一个空格。另外,您的答案中的[X],{X=32}比[32]好,这比[32]更好。

如果您正在做DCG并使用SWI Prolog,则在中有一个常用谓词和DCG子句库。这可以在代码中使用

:- use_module(library(dcg/basics)).
列出谓词使用的代码,例如

该库有一个DCG子句blanks//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 --> [].
铌 库版本使用字符代码,而不是字符


如果您正在执行DCG并使用SWI Prolog,那么在中有一个常用谓词和DCG子句库。这可以在代码中使用

:- use_module(library(dcg/basics)).
列出谓词使用的代码,例如

该库有一个DCG子句blanks//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 --> [].
铌 库版本使用字符代码,而不是字符


如果您在后面添加了set_prolog_flagsdouble_引号,请注意这一点。有趣的是:如果你在后面加上set\u prolog\u flagsdouble\u引号,要小心。它会把你的整个星期搞得一团糟。有趣的是: