在prolog中读取文件

时间:2011-11-22 18:22:55

标签: io prolog dcg

  

可能重复:
  Read a file line by line in Prolog

我找到了以下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).

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

2 个答案:

答案 0 :(得分:4)

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

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

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

现在用一些更精细的标记器替换seq//1

答案 1 :(得分:2)

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

..., read_line_to_codes(Stream, Codes), phrase(parse, Codes, []), ...

但是我建议你采用phrase_from_file / 2(正如另一个答案中已经建议的那样)。有一个支持库来帮助解析输入,有一些随时可用的解析器:

:- use_module(library(http/dcg_basics)).

编辑支持库已重命名,有一个后兼容技巧,允许旧命名,但现在最好使用库(dcg/basics)。