|
||||
|
Назад | Содержание| Вперёд Глава 6 ВВОД И ВЫВОД...Назад | Содержание| Вперёд Глава 6 ВВОД И ВЫВОД В этой главе мы рассмотрим некоторыевстроенные средства для записи данных в файл исчитывания их из файла. Такие средства можнотакже применять и для форматирования объектовданных программы, чтобы получить желаемую формуих внешнего представления. Одновременно мырассмотрим и средства синтеза и декомпозицииатомов. 6. 1. Связь с файлами До сих пор мы применяли только один метод связипользователя с программой - пользователь задаетпрограмме вопросы, а программа ему отвечает,конкретизируя переменные. Такой механизм связипрост и практичен и, несмотря на свою простоту,обеспечивает ввод и вывод информации. Однако онобладает слишком малой гибкостью и поэтому частоне совсем удобен. В следующих случаях требуетсярасширение этого основного механизма связи: ввод данных в форме, отличной от вопроса - например, в виде предложений, написанных на английском языке вывод информации в произвольном формате обмен информацией с произвольным файлом, а не только с пользовательским терминалом Встроенные предикаты, предназначенные дляэтого расширения, отличаются в разныхреализациях Пролога. Мы изучим здесь простой иудобный набор таких Рис. 6. 1. Связь между пролог-программой и различнымифайлами. предикатов, применяемый во многих реализациях.Однако за деталями и специфическимиособенностями следует, конечно, обращаться круководствам по конкретным пролог-системам. Рассмотрим вначале вопрос о том, какобмениваться информацией с файлами, а затем - какможно вводить и выводить данные в разныхформатах. На рис. 6.1 показана общая ситуация, в которойпролог-программа взаимодействует с несколькими файлами. Она может, в принципе, считыватьданные из нескольких входных файлов,называемых также входными потоками,и выводить данные в несколько выходных файлов,называемых выходными потоками.Информация, поступающая с пользовательскоготерминала, рассматривается просто как еще одинвходной поток. Аналогично информация, выводимаяна этот терминал, рассматривается как один извыходных потоков. На оба этих"псевдофайла" ссылаются с помощью имени user (пользователь). Имена остальныхфайлов программист должен выбирать всоответствии с правилами именования файлов,принятыми в используемой компьютерной системе. В каждый момент выполнения пролог-программылишь два файла являются "активными": одиндля ввода, другой - для вывода. Эти два файланазываются текущим входным потоком и текущимвыходным потоком соответственно. В начальныймомент эти два потока соответствуют терминалу.Текущий входной поток может быть заменен надругой файл ИмяФайла посредством цели see(ИмяФайла) ( Смотри(ИмяФайла) ) Такая цель всегда успешна (если только с файлом ИмяФайлавсе в порядке), а в качестве побочного эффектапроисходит переключение ввода с предыдущеговходного потока на файл ИмяФайла.Поэтому типичным примером использованияпредиката see является следующаяпоследовательность целей, которая считываетинформацию из файла файл1, а затемпереключается обратно на терминал: . . . see( файл1), читать_из_файла(Информация), see( user), ( user - пользователь) . . . Текущий выходной поток может быть изменен припомощи цели вида tell(ИмяФайла) ( сообщить( ИмяФайла) ) Следующая последовательность целей выводитнекоторую информацию в файл3, а послеэтого перенаправляет последующий вывод обратнона терминал: . . . tell( файл3), записать_в_файл(Информация), tell( user), . . . Цель seen ( конец чтения) закрывает текущий входной файл. Цель told ( конец записи) закрывает текущий выходной файл. Файлы могут обрабатываться толькопоследовательно. В этом смысле все файлы ведутсебя так же, как терминал. Каждый запрос на чтениеиз входного файла приводит к чтению в текущейпозиции текущего входного потока. После этогочтения текущая позиция, естественно, будетперемещена на следующий, еще не прочитанныйэлемент данных. Следующий запрос на чтениеприведет к считыванию, начиная с этой новойтекущей позиции. Если запрос на чтение делается вконце файла, то в качестве ответа на такой запросвыдается атом end_of_file (конец файла).Считанную один раз информацию считать вторичноневозможно. Запись производится точно так же, каждый запросна вывод информации приведет к тому, что онабудет присоединена в концу текущего выходногопотока. Невозможно сдвинуться назад и переписатьчасть файла. Все файлы являются "текстовыми", т. е.файлами, состоящими из символов. Символы - этобуквы, цифры и специальные знаки. О некоторых изних говорят, что они непечатаемые, поскольку,будучи выведенными на терминал, они непоявляются на экране. Однако их присутствиеможет сказаться каким-либо другим образом,например появятся пробелы или пустые строки. Существуют два основных способа, с помощьюкоторых файлы рассматриваются в Прологе взависимости от формы записанной в нихинформации. Один способ - рассматривать символкак основной элемент файла. Соответственно одинзапрос на ввод или вывод приведет к чтению или записи одного символа. Для этойцели предназначены встроенные предикаты get, get0 и put(получить, получить0 и выдать). Другой способ рассматривать файл -считать, что в качестве основных элементовпостроения файла используются более крупныеединицы текста. Такой естественной более крупнойединицей является прологовский терм. Поэтомукаждый запрос на ввод/вывод такого типа приведетк переносу целого терма из текущего входногопотока или в текущий выходной потоксоответственно. Предикатами для переноса термовявляются предикаты read и write(читать и писать). В этом случае информация вфайле должна, конечно, по форме соответствоватьсинтаксису термов. Очевидно, что выбор формы организации файлазависит от задачи. Всякий раз, когда особенностизадачи допускают естественное представлениеинформации в соответствии с синтаксисом термов,следует предпочесть файлы, состоящие из термов.Тогда появится возможность за одно обращение ивводу или выводу пересылать целые осмысленныефрагменты информации. С другой стороны,существуют задачи, природа которых диктует инуюорганизацию файлов. Примером такого рода задачиявляется обработка предложений естественногоязыка, скажем, для организации диалога междусистемой и пользователем на английском языке. Втаких случаях файлы следует рассматривать какпоследовательности символов, которые неукладываются в синтаксис термов. Назад | Содержание| Вперёд |
|
||
Главная | В избранное | Наш E-MAIL | Добавить материал | Нашёл ошибку | Наверх |
||||
|