J'aime la réponse de 'pat fats', mais vous devez convertir votre chaîne en atome avant:
..., atom_codes(Atom, String), atomic_list_concat(L, ' ', Atom), ...
Si vous avez besoin de travailler directement avec les chaînes, j'ai ce code dans mon arsenal ':
%% split input on Sep
%
% minimal implementation
%
splitter(Sep, [Chunk|R]) -->
string(Chunk),
( Sep -> !, splitter(Sep, R)
; [], {R = []}
).
étant un DCG, doit être appelée ainsi:
?- phrase(splitter(" ", L), "this is a string"), maplist(atom_codes, As, L).
L = [[116, 104, 105, 115], [105, 115], [97], [115, 116, 114, 105, 110|...]],
As = [this, is, a, string] .
modifier: plus d'explications
J'ai oublié d'expliquer comment cela fonctionne: DCG sont bien expliqués par @larsman, en this autre réponse. Je le cite
->, ce qui lui ajoute deux arguments cachés. Le premier d'entre eux est une liste à analyser par la règle de grammaire; la seconde est "ce qui reste" après l'analyse. c (F, X, []) appelle c sur la liste X pour obtenir un résultat F, attendre [] à gauche, à savoir l'analyseur doit consommer toute la liste X.
Ici, j'ai 2 arguments, le premier est le séparateur, le second la liste en cours de construction. La chaîne intégrée // 1 provient de la bibliothèque SWI-Prolog (http/dcg_basics). C'est un bloc de construction très pratique, qui correspond littéralement à quoi que ce soit en faisant marche arrière.Ici, il «mange» chaque caractère devant le séparateur ou la fin de la chaîne. Après avoir fait cela, nous pouvons recurse ...
divisé en non défini – JPro