Назад | Содержание| Вперёд Глава 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 | Добавить материал | Нашёл ошибку | Наверх