6.1. Связь с файлами
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 (читать и писать). В этом случае информация в файле должна, конечно, по форме соответствовать синтаксису термов.
Очевидно, что выбор формы организации файла зависит от задачи. Всякий раз, когда особенности задачи допускают естественное представление информации в соответствии с синтаксисом термов, следует предпочесть файлы, состоящие из термов. Тогда появится возможность за одно обращение и вводу или выводу пересылать целые осмысленные фрагменты информации. С другой стороны, существуют задачи, природа которых диктует иную организацию файлов. Примером такого рода задачи является обработка предложений естественного языка, скажем, для организации диалога между системой и пользователем на английском языке. В таких случаях файлы следует рассматривать как последовательности символов, которые не укладываются в синтаксис термов.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
13.2 СВЯЗЬ ТИПА NEWCASTLЕ
13.2 СВЯЗЬ ТИПА NEWCASTLЕ В предыдущем разделе мы рассмотрели тип сильносвязанной системы, для которого характерна посылка всех возникающих на периферийном процессоре обращений к функциям подсистемы управления файлами на удаленный (центральный) процессор. Теперь перейдем к
Связь
Связь Выход в Интернет потребует от вас средств коммуникации. В нашем случае наиболее применимы три способа доступа к Сети:– коммутируемый (через модем);– выделенная линия;–
Обратная связь
Обратная связь Отзывы пользователей очень важны для проекта. Нужно вложиться в то, чтобы им было предельно просто отправить нам обратную связь. И не забыть о том, что нам нужно будет обрабатывать данные.— Расширение GoogleFeedback. Чтобы отправить сообщение, пользователи могут
Связь с автором
Связь с автором Если у вас возникнут вопросы в связи с исходным кодом примеров, потребность в дополнительных разъяснениях или просто желание поделиться своими идеями в отношении платформы .NET. без всякого стеснения пишите мне на мой адрес электронной почты
Связь SOAP
Связь SOAP Полный анализ возможностей SOAP выходит за рамки этого текста, однако следует понимать, что SOAP нельзя назвать специальным протоколом, который может использоваться наряду с другими существующими протоколами Интернет (HTTP, SMTP и др.). Общая задача SOAP, тем не менее,
СВЯЗЬ С ФАЙЛАМИ
СВЯЗЬ С ФАЙЛАМИ Часто нам бывает нужна программа получения информации от файла или размещения результатов в файле. Один способ организации связи программы с файлом заключается в использовании операций переключения < и >. Этот метод прост, но ограничен. Например,
1. Иерархическая рекурсивная связь
1. Иерархическая рекурсивная связь Первым видом связи классов сущностей между собой, который мы рассмотрим, является так называемая иерархическая рекурсивная связь.Вообще рекурсия (или рекурсивная связь) – это связь класса сущностей с самим собой.Иногда по аналогии с
2. Сетевая рекурсивная связь
2. Сетевая рекурсивная связь Сетевая рекурсивная связь классов сущностей между собой является как бы многомерным аналогом уже пройденной нами иерархической рекурсивной связи.Только если иерархическая рекурсия определялась как рекурсивная связь типа «не более одного
Глава 12 Связь
Глава 12 Связь Инфракрасное соединение Несмотря на растущую популярность Wi-Fi, Bluetooth и других беспроводных технологий, по-прежнему не сдает своих позиций и передача данных через инфракрасный порт. Например, все мы каждый день применяем инфракрасный порт при использовании
5.2. Связь между задачами
5.2. Связь между задачами Большинство проектов разработки программного обеспечения разделяется на задачи, зачастую выполняемые различными группами.В типовом варианте:специалисты в предметной области начинают проект;аналитики формулируют требования к
Обратная связь
Обратная связь Автор: Родион КудринПопробуйте провести карандашом идеально прямую линию, а потом сделайте то же самое с закрытыми глазами. Наверняка получилось хуже.Связано это с тем, что, закрыв глаза, мы выключаем зрительный контроль результата своих действий, то есть
Обратная связь
Обратная связь Исправленные версии и новые издания книги всегда можно будет найти на сайте http://www.yuzzich.narod.ru.Свои замечания и дополнения можно присылать на email yuzzich@yandex.ru.Еще раз отмечу: это адрес для критики и дополнений. А не для вопросов «как мне сделать то или это».
Защищенная связь
Защищенная связь При передаче данных от отправителя к получателю обеспечивается защищенная связь, если соблюдается одно или более требований безопасности: аутентичность, целостность и конфиденциальность. Сервис защищенной связи строится на основе главных сервисов PKI