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