Мне нравится ответ "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] .
изменить: больше пояснений
Я забыл объяснить, как это работает: @larsman хорошо объяснил DCG в этом другом ответе. . я цитирую его
-->, что на самом деле добавляет к нему два скрытых аргумента. Первый из них — это список, который нужно разобрать по правилу грамматики; второй — «то, что осталось» после синтаксического анализа. c(F,X,[]) вызывает c в списке X для получения результата F, ожидая, что останется [] , т. е. синтаксический анализатор должен использовать весь список X.
Здесь у меня 2 аргумента, первый это разделитель, второй строится список. Встроенная строка //1 взята из библиотеки SWI-Prolog (http/dcg_basics). Это очень удобный строительный блок, который соответствует буквально чему угодно при откате. Здесь он «съедает» каждый символ перед разделителем или в конце строки. Сделав это, мы можем рекурсивно...
person
CapelliC
schedule
01.02.2012