在序言中读取行到原子列表

non*_*hip 5 prolog swi-prolog

我需要将任何行(来自 user_input)读入原子列表,例如:

Example line, which contains any ASCII chars.
Run Code Online (Sandbox Code Playgroud)

进入:

[Example,'line,',which,contains,any,ASCII,'chars.']
Run Code Online (Sandbox Code Playgroud)

到目前为止我所得到的:

read_line_to_codes(user_input, Input),
atom_codes(IA,Input),
atomic_list_concat(AlistI,' ',IA).
Run Code Online (Sandbox Code Playgroud)

但这仅适用于单个单词,因为 atom_codes。read/2 也抱怨空格,所以有什么办法可以做到这一点吗?

哦,然后可能以逗号分割成二维列表,附加点/感叹号/问号,例如:

[[Example,line],[which,contains,any,ASCII,chars],'.']
Run Code Online (Sandbox Code Playgroud)

顺便说一句:那是 SWI 序言。

编辑:找到解决方案:

read_line_to_codes(user_input, Input),
string_to_atom(Input,IA),
atomic_list_concat(AlistI,' ',IA),
Run Code Online (Sandbox Code Playgroud)

无法回答我自己的问题,因为我没有 100 声望:-/

BLU*_*IXY 2

input_to_atom_list(L) :-
    read_line_to_codes(user_input, Input),
    string_to_atom(Input,IA),
    tail_not_mark(IA, R, T),
    atomic_list_concat(XL, ',', R),
    maplist(split_atom(' '), XL, S),
    append(S, [T], L).

is_period(.).
is_period(?).
is_period(!).

split_atom(S, A, L) :- atomic_list_concat(XL, S, A), delete(XL, '', L).

%if tale is ? or ! or . then remove
%A:Atom, R:Removed, T:special mark
tail_not_mark(A, R, T) :- atom_concat(R, T, A), is_period(T),!. 
tail_not_mark(A, R, '') :- A = R.
Run Code Online (Sandbox Code Playgroud)

演示版

1 ?- input_to_atom_list(L).
|: Example line, which contains any ASCII chars.
L = [['Example', line], [which, contains, any, 'ASCII', chars], '.'].
Run Code Online (Sandbox Code Playgroud)