Взгляните на этот ответ .Код, который я написал там, разбивает строку Пролога на пробелы, чтобы сформировать список атомов.С небольшой модификацией вы можете изменить код для создания строк вместо атомов.Вот соответствующий код из предыдущего поста, с необходимой модификацией для вашего случая:
data([A|As]) -->
spaces(_),
chars([X|Xs]),
{string_to_list(A, [X|Xs])}, %% Using string_to_list/2 instead
spaces(_),
data(As).
data([]) --> [].
chars([X|Xs]) --> char(X), !, chars(Xs).
chars([]) --> [].
spaces([X|Xs]) --> space(X), !, spaces(Xs).
spaces([]) --> [].
space(X) --> [X], {code_type(X, space)}.
char(X) --> [X], {\+ code_type(X, space)}.
В вашем примере вы взяли бы строку Prolog, содержащую ваш пример, например "....| 0 .| |||"
, и запустили приведенный выше кодиспользуя встроенный phrase/2
, например так:
?- phrase(data(NumeralList), "....| 0 .| |||").
NumeralList = ["....|", "0", ".|", "|||"]
Обратите внимание, что я протестировал это на SWI-Prolog , и он работает, но если вы используете другойВнедрение Prolog может не поддерживать DCG или встроенные модули, которые я использовал.
Если бы вы добились результата, который точно , как вы описали как L
выше, вы можете изменить код, чтобы он возвращал список [X | Xs] непосредственно в предложении data
(удаляя подцель {string_to_list(A, [X|Xs])},
), и измените последний предикат char
на следующий:
char(C) --> [X], {\+ code_type(X, space), atom_codes(C,[X])}.
Выполнение этого дает:
?- phrase(data(L), "....| 0 .| |||").
L = [['.', '.', '.', '.', '|'], ['0'], ['.', '|'], ['|', '|', '|']]
РЕДАКТИРОВАТЬ: В соответствии с запросом, здесь приведен модифицированный код, который генерирует вышеуказанный результат в полном объеме:
data([[X|Xs]|As]) -->
spaces(_),
chars([X|Xs]),
spaces(_),
data(As).
data([]) --> [].
chars([X|Xs]) --> char(X), !, chars(Xs).
chars([]) --> [].
spaces([X|Xs]) --> space(X), !, spaces(Xs).
spaces([]) --> [].
space(X) --> [X], {code_type(X, space)}.
char(C) --> [X], {\+ code_type(X, space), atom_codes(C,[X])}.