我正在使用prolog中的tokenizer,在尝试打开文件并将流传递给谓词时,我不断收到以下错误:ERROR:at_end_of_stream / 1:stream`(0x7fe83d800090)'不存在。我正在尝试打开一个文件" ass3IN"使用以下查询:? - tokenizer(' ass3IN',A)。我一直试图解决这个问题,任何帮助将不胜感激。提前谢谢。
1 tokenizer(File,_) :-
2 open(File,read,Str),
3 getchars(Str,Tokenlist),
4 close(Str),
5 unifywhitespace(Tokenlist,Newlist),
6 rem_consec_white(_,Newlist,No2white).
7
8 getchars(Stream,_) :-
9 at_end_of_stream(Stream).
10
11 getchars(Stream,List) :-
12 \+ at_end_of_stream(Stream),
13 get0(Stream,C),
14 append(List,[C],List1),
15 getchars(Stream,List1).
答案 0 :(得分:0)
问题出现是因为回溯。当您的流已经关闭时,at_end_of_stream正在回溯到。这会再现您的错误:
?- open('/home/some/file',read,S), \+ at_end_of_stream(S), close(S),
at_end_of_stream(S).
<stream>(0x2412e50)
ERROR: at_end_of_stream/1: stream `<stream>(0x2412e50)' does not exist
我想解决这个问题的绝对最快的方法是在你在tokenizer中调用getChars之后添加一个cut(!),如下所示:
tokenizer(File,_) :-
open(File,read,Str),
set_input(Str),
getchars(Str,Tokenlist),!,
close(Str).
现在不再发生回溯,您的执行将成功终止。