读取和标记文件

时间:2017-03-12 01:39:47

标签: prolog swi-prolog

我尝试读取文件并使用空格作为分隔符拆分字符。我已经成功地将输入分成了原子列表,但是我一直试图将它们重新组合在一起。到目前为止,这是我的代码:

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中的列表。

1 个答案:

答案 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代表换行符)