我不能让我的Prolog DCG与原子CONCAT工作(I can't get my Pro

2019-09-29 00:07发布

我不能让这段序言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([]) --> [].

Answer 1:

我通过在基础案例改变[]为“”解决了这个。

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

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


Answer 2:

我觉得自己像一个改进的方案很可能是这样的:

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

有没有真正需要问的char是什么码32,你知道这是一个空间。 此外, [X], {X=32}从你的答案是更好的[32]这仍然是更好的" "



Answer 3:

如果你正在做的DCG和使用SWI-Prolog的存在经常使用的谓词和DCG条款库dcgbasics 。 这可以在代码中使用

:- use_module(library(dcg/basics)).

要列出的谓词的代码中使用列表/ 1 ,如

?- listing(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 --> [].

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 = [].


文章来源: I can't get my Prolog DCG working with atom concat
标签: prolog dcg