Prolog流不存在错误

时间:2016-03-20 02:12:32

标签: list io prolog

我正在使用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).

1 个答案:

答案 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).

现在不再发生回溯,您的执行将成功终止。