Вопрос
Я пытаюсь сделать калькулятор слов..прочитать слова из файла..переведи их в цифры и потом посчитай результат..мне удалось сделать все это, но я думаю, что в моей программе есть две ошибки..
У меня в основном две функции...
экстракт(Слова), вычислить(Слова,0).
экстракт будет читаться из файла..а затем вернуть список слов..бывший:[один, плюс, три] ..теперь расчет переведет значение этих слов в числа и посчитает..мне тоже удалось это сделать..теперь ошибки:я должен прекратить чтение и завершить его, если встречу остановку в файле..так что, если бы Words был [стоп] Конец.я попробовал следующее...
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).
если Слова не стоп..тогда иди посчитай..но он не работает!!
я ценю помощь..Спасибо
Решение
Побочные эффекты (здесь:чтение из файла и переход к следующему термину) не отменяются при возврате.Вы можете прочитать один раз, а затем сделать выбор на основе прочитанного термина с помощью if/then/else или вспомогательного предиката, например:
execute :-
extract(Words),
( Words == [stop] -> nl, write('Terminating ...')
; calculate(Words, 0)
).
В SWI-Prolog рассмотрите возможность использования library(pio)
для чистого чтения файлов, описанного через DCG, который обрабатывает возврат, как и ожидалось.