Ввод программ

Чтение файлов

Предикаты, которые предоставляет Пролог для переключения текущего входного потока данных, аналогичны предикатам, обсуждавшимся выше. Целевое утверждение see(X)переключает текущий входной поток данных на файл с указанным именем. Так же как и tell,это целевое утверждение не может быть доказано вновь, и выполненное предикатом изменение входного потока не переделывается при возврате. При первом выполнении see(X)для некоторого файла Xэтот файл становится открытым (для чтения), при этом чтение начинается с начала файла. Последующая операция чтения продолжает читать данные с того места, где закончила предыдущая операция. И так до тех пор, пока не будет сделано явного закрытия файла. С этого момента новая попытка читать из файла приведет к тому, что файл будет открыт и чтение начнется с начала файла, как и прежде. Текущий входной поток данных может быть определен в результате выполнения seeing(X),и текущий входной поток данных может быть переключен обратно на ввод с терминала в результате выполнения целевого утверждения seen, которое также закрывает файл.

Чтение данных из файлов и запись данных в файлы наиболее полезны тогда, когда объем данных, с которыми работает наша программа и которые мы хотим поместить в базу данных, превосходит тот объем, который мы можем вводить вручную при каждом сеансе работы с ЭВМ. В Прологе файлы используются главным образом для хранения программ. Если текст Пролог-программы содержится в некотором файле, то мы можем прочитать все утверждения, содержащиеся в файле, и поместить их в базу данных, воспользовавшись для этого предикатом consult.Если значением X является имя файла, то цель consult(X)прочитает утверждения (факты и правила) и целевые утверждения из этого файла. Большинство реализаций Пролога имеют специальную форму записи для предиката consult,позволяющую прочитать последовательно один за другим список файлов. Если вопрос к Пролог-системе имеет вид списка атомов, то Пролог-система прочитает каждый файл из этого списка. В качестве примера использования такой формы записи приведем следующий вопрос:

 

?- файл1, отображение, эксперт.

 

Этот вопрос обрабатывается таким образом, как если бы Пролог выполнял целевое утверждение consultall(X),где X- это список, заданный в вопросе, а предикат consultallопределен следующим образом:

 

consultall([]).

consultall(H|T]):- consult(H), consultall(T).

 

Однако короткая списковая запись более экономична, а это особенно важно, если принять во внимание, что самое первое действие, которое выполняет работающий с Прологом программист,- это чтение из файлов своих предикатов. Предикат consultавтоматически прекращает чтение утверждений, когда встречается конец файла. В разд. 6.1 предикат consultописывается более подробно.