1
votes

Je n'arrive pas à faire fonctionner mon Prolog DCG avec Atom concat

Je ne parviens pas à faire fonctionner ce code 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([]) --> [].


2 commentaires

Soyez prudent avec cela si vous ajoutez par la suite set_prolog_flags (double_quotes, ). Cela peut gâcher toute votre semaine.


D'intérêt: Prolog DCG Primer


3 Réponses :


2
votes

J'ai résolu ce problème en remplaçant [] dans le cas de base par "".

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

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


0 commentaires

1
votes

J'ai l'impression qu'une solution améliorée serait probablement quelque chose comme ceci:

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

Il n'y a pas vraiment besoin de demander quel est le caractère du code 32, vous savez que c'est un espace. De plus, [X], {X = 32} de votre réponse est mieux comme [32] , qui est encore mieux comme "" .


0 commentaires

1
votes

Si vous utilisez DCG et utilisez SWI-Prolog, il existe une bibliothèque de prédicats et de clauses DCG souvent utilisés dans dcgbasics . Cela peut être utilisé dans le code avec

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

Pour lister le code des prédicats, utilisez listing / 1 , par exemple

blank -->
    [C],
    {
        nonvar(C),
        code_type(C,space)
    }.

blanks -->
    blank, !, blanks.

blanks --> [].

La bibliothèque a une clause DCG blanks // 0 qui fait ce que vous voulez, par exemple

?- 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.

qui en tant que DCG est

?- listing(dcg_basics:_). 

NB
La version de la bibliothèque utilise des codes de caractères et non des caractères.

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


0 commentaires