我尝试读取文件并使用空格作为分隔符拆分字符。我已经成功地将输入分成了原子列表,但是我一直试图将它们重新组合在一起。到目前为止,这是我的代码:
tokenize_file(Name, Ret) :-
open(Name, read, Str),
read_file(Str, Ret),
close(Str).
read_file(Stream,[]) :-
at_end_of_stream(Stream).
read_file(Stream,[X|L]) :-
\+ at_end_of_stream(Stream),
get0(Stream, Char),
write([X, Code]), nl,
read_file(Stream,L).
这将生成如下所示的输出:
X = [i, n, t, ' ', a, d, d, ' ', '('|...]
我似乎无法弄清楚如何迭代这个列表并将空白之间的每组字符连接到另一个列表中。 我环顾四周,但我很难理解如何操纵prolog中的列表。
答案 0 :(得分:0)
找到解决方案:
tokenize_file(Name, Ret) :-
open(Name, read, Str),
read_file(Str, Lst),
atomic_list_concat(Lst, '', AtmConcat),
split_string(AtmConcat, " ", "", Ret),
close(Str).
原子列表concat重新创建输入字符串(可能更有效地完成逐个字符读取,但它可以工作)。然后,拆分字符串按空格字符拆分字符串。请注意,换行符实际上是以不同方式标记的,因此其余代码也被修改:
read_file(Stream,[X|L]) :-
\+ at_end_of_stream(Stream),
get0(Stream, Code),
set_value(X, Code),
read_file(Stream,L).
set_value(X, 10) :-
char_code(X, 32).
set_value(X, Code) :-
char_code(X, Code).
这将用空格替换所有换行符(ascii字符10代表换行符)