2010-12-31 3 views
2

Я пытаюсь сделать калькулятор слов .. читать слова из файла .. перевести их в числа, а затем вычислить результат .. мне удалось сделать все это, но я думаю, что у меня есть две ошибки в моей программе ..Prolog Backtracking

я в основном две функции ...

экстракт (слова), Calculate (Слова, 0).

экстракт будет читать из файла .. а затем возвращает список слов .. например: [один, плюс три] .. Вычислим теперь переведет значение этих слов в числа и вычислить .. I удалось сделать это тоже .. теперь ошибки: я должен прекратить чтение и завершение, если я столкнулся с остановкой в ​​файле. так, если бы слова были [остановлены] Конец. я попытался следующие ...

execute :- 
extract(Words), 
Words = [stop],nl,print('Terminating ...'),!. 
execute :- 
extract(Words), 
calculate(Words,0). 

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

execute :- 
extract(Words), 
Words \= [stop],execute(Words). 
execute(Words) :- 
calculate(Words,0). 

если слова не останавливается .. затем перейдите и вычислите .. но его не работает !!

я ценю помощь .. Спасибо

ответ

3

побочных эффектов (здесь: чтение из файла и перейти к следующему термину) не отменена на возвратах. Вы можете прочитать один раз, а затем сделать выбор, основанный на термине чтения с, если/то/другое или вспомогательный предикат, например:

execute :- 
     extract(Words), 
     ( Words == [stop] -> nl, write('Terminating ...') 
     ; calculate(Words, 0) 
     ). 

В SWI-Prolog, рассмотреть возможность использования library(pio) для чистого чтения файла описывается с помощью , который обрабатывает откат, как ожидалось.

+0

Спасибо за ответ .. я попытался сделать это .. он ловит остановку .. печать .. но она продолжает читать .. я хочу, чтобы она перестала разбирать файл, и вот оно .. я не могу просто скажем, видел, сказал, после этого, чтобы прекратить читать .. Большое спасибо .. Я ценю вашу помощь – AhmadAssaf

+1

s (X) для ссылки на 'pio'. – repeat