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([]) --> [].
3 Réponses :
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 = ' '.
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 "" .
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)).
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