Io 在prolog中读取文件

Io 在prolog中读取文件,io,prolog,dcg,Io,Prolog,Dcg,可能重复: 我发现下面的prolog代码一次读取一个字符并打印出来 process(File) :- open('C:/Users/BHARAT/Desktop/a.txt', read, In), get_char(In, Char1), process_stream(Char1, In), close(In). process_stream(end_of_file, _) :- !. process_stream(Char,

可能重复:

我发现下面的prolog代码一次读取一个字符并打印出来

process(File) :-
        open('C:/Users/BHARAT/Desktop/a.txt', read, In),
        get_char(In, Char1),
        process_stream(Char1, In),
        close(In).

process_stream(end_of_file, _) :- !.
process_stream(Char, In) :-
        print(Char),
        get_char(In, Char2),
        process_stream(Char2, In).

但是,如果文件有多行,有没有一种方法可以一次读取一整行,这样就很容易进行标记化。

您说要对输入进行标记化-最好的方法是确定子句语法(DCG)。使用SWI中的
库(pio)
,您可以直接使用语法读取文件,如下所示:

?- use_module(library(pio)).
?- phrase_from_file(seq(Xs),f).

seq([]) --> [].
seq([E|Es]) --> [E], seq(Es).

现在将
seq//1
替换为更精细的标记器。

SWI Prolog有一些支持谓词,例如:

..., read_line_to_codes(Stream, Codes), phrase(parse, Codes, []), ...
但我建议您采用_文件/2中的短语_(正如在另一个答案中已经建议的)。有一个支持库可以帮助解析输入,其中包含一些现成的解析器:

:- use_module(library(http/dcg_basics)).
编辑支持库已重命名,有一个向后兼容技巧,允许旧的命名,但现在最好使用library()