как разбить предложение в swi-прологе - PullRequest
5 голосов
/ 20 октября 2010

Я пробую свои силы на SWI-Prolog в Win XP.Я пытаюсь понять, как разбить предложение в Прологе на отдельные атомы.

Пример: скажем, у меня есть такое предложение:

"это строка"
способ получить отдельные слова, чтобы сохранить в переменной?

вроде:

X = это
Y = равно
....
и так далее.

Может кто-нибудь объяснить, как это работает?

Спасибо.

Ответы [ 3 ]

11 голосов
/ 01 февраля 2012

Я бы использовал atomic_list_concat / 3. См

http://www.swi -prolog.org / pldoc / человек? Сказуемое = atomic_list_concat% 2F3

Обычно он предназначен для вставки разделителя, но из-за двунаправленности объединения Пролога его также можно использовать для разделения строки с учетом разделителя:

atomic_list_concat(L,' ', 'This is a string').
L = ['This',is,a,string]

Конечно, когда разделение выполнено, вы можете играть с элементами списка L.

4 голосов
/ 01 февраля 2012

Мне нравится ответ '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).Это очень удобный строительный блок, который в буквальном смысле соответствует всему на пути возврата.Здесь он «съедает» каждый символ перед разделителем или до конца строки.Сделав это, мы можем вернуться ...

0 голосов
/ 20 октября 2010

? - split ("это строка", "", Out).

Out = ["this", "is", "a", "string"]

...