我找到了以下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行,这样就可以很容易地进行标记化。
答案 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)。