как разделить предложение в swi-prolog

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

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

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

как :

X = this
Y = is
....
и так далее.

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

Спасибо.


person JPro    schedule 20.10.2010    source источник


Ответы (3)


Я бы использовал atomic_list_concat/3. Видеть

http://www.swi-prolog.org/pldoc/man?predicate=atomic_list_concat%2F3

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

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

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

person sumx    schedule 01.02.2012
comment
Для SWI-пролога можно использовать более новую версию split_string/4. swi-prolog.org/pldoc/man?predicate=split_string/4< /а> split_string("Hello, here I am!"," "," ",Temp). - person syfantid; 01.06.2015

Мне нравится ответ "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

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

Out=["это","есть","а","строка"]

person Mindaugas    schedule 20.10.2010