2016-03-20 7 views
0

プロローグでトークナイザを使用していますが、ファイルを開いてストリームを述語に渡そうとすると、次のエラーが発生し続けます。エラー:at_end_of_stream/1:stream `(0x7fe83d800090) ' 存在しない。 ?トークナイザ(「ass3IN」、A) - :私は、次のクエリを使用してファイル「ass3IN」を開こうとしています。私はこれをしばらく解決しようとしており、どんな助けでも大歓迎です。前もって感謝します。プロローグストリームが存在しないエラー

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

例を追加し、全く期待される結果は、存在しないように期待される結果 –

+1

コードは、不完全です。私はちょうどファイルを開き、ストリームを使用することに問題があります – hoya

答えて

0

問題はバックトラッキングのために発生します。あなたのストリームが既に閉じられている間、at_end_of_streamはバックトラックされています。今

tokenizer(File,_) :- 
    open(File,read,Str), 
    set_input(Str), 
    getchars(Str,Tokenlist),!, 
    close(Str). 

:(!)私はそうのように、トークナイザでGetCharsはにあなたの呼び出しの後にカットを追加することですこれを解決するための絶対的な最も簡単な方法を推測

?- 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 

:これはあなたのエラーを再現しますバックトラックはもはや発生せず、実行は正常に終了します。

関連する問題