5

(user_input から) 任意の行をアトミック リストに読み込む必要があります。

Example line, which contains any ASCII chars.

の中へ:

[Example,'line,',which,contains,any,ASCII,'chars.']

私がこれまでに持っているもの:

read_line_to_codes(user_input, Input),
atom_codes(IA,Input),
atomic_list_concat(AlistI,' ',IA).

しかし、それはatom_codesのため、単一の単語でのみ機能します。read/2 もスペースについて不平を言うので、これを行う方法はありますか?

ああ、それからカンマで2次元リストに分割し、ドット/感嘆符/疑問符を追加します。例:

[[Example,line],[which,contains,any,ASCII,chars],'.']

ところで:それはSWI-prologです。

編集:解決策を見つけました:

read_line_to_codes(user_input, Input),
string_to_atom(Input,IA),
atomic_list_concat(AlistI,' ',IA),

評判が 100 でないので、自分の質問に答えることができません :-/

4

1 に答える 1

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.

デモ

1 ?- input_to_atom_list(L).
|: Example line, which contains any ASCII chars.
L = [['Example', line], [which, contains, any, 'ASCII', chars], '.'].
于 2011-11-27T16:51:27.227 に答える