2016-03-20 2 views
0

Я работаю над токенизатором в прологе, и я продолжаю получать следующую ошибку при попытке открыть файл и передать поток в предикат: ERROR: at_end_of_stream/1: stream` (0x7fe83d800090) ' не существует. Я пытаюсь открыть файл «ass3IN» со следующим запросом:? - токенизатор ('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

добавить пример и ожидаемый результат –

+1

код не заполнен, так как ожидаемого результата не ожидается. У меня просто возникают проблемы с открытием файла и использованием потока – hoya

ответ

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 

Я предполагаю абсолютный быстрый способ решить эту проблему можно было бы добавить сокращение после вызова GetChars в Tokenizer, как и (!):

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

Теперь backtracking больше не будет выполняться, и ваше исполнение завершится успешно.