Мне нравится ответ 'pat fats', но вы должны преобразовать вашу строку в атом раньше:
..., atom_codes(Atom, String), atomic_list_concat(L, ' ', Atom), ...
Если вам нужно работать напрямую со строками, у меня естьэтот код в моем «арсенале»:
%% split input on Sep
%
% minimal implementation
%
splitter(Sep, [Chunk|R]) -->
string(Chunk),
( Sep -> !, splitter(Sep, R)
; [], {R = []}
).
, являющийся DCG, должен называться следующим образом:
?- 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] .
редактировать: больше объяснений
Я забыл объяснить, как это работает: DCG хорошо объясняется @larsman, в этом другом ответе.Я цитирую его
->, что фактически добавляет к нему два скрытых аргумента.Первый из них - это список, который нужно проанализировать по правилу грамматики;второе "что осталось" после разбора.c (F, X, []) вызывает c в списке X, чтобы получить результат F, ожидая, что [] будет оставлен, то есть парсер должен использовать весь список X.
Здесь я имею2 аргумента, первый - разделитель, второй - строящийся список.Встроенная строка // 1 взята из библиотеки SWI-Prolog (http / dcg_basics).Это очень удобный строительный блок, который в буквальном смысле соответствует всему на пути возврата.Здесь он «съедает» каждый символ перед разделителем или до конца строки.Сделав это, мы можем вернуться ...