- Фантастика и фэнтези
- Ироническое фэнтези
- Стимпанк
- Детективная фантастика
- Киберпанк
- Попаданцы
- LitRPG
- Космоопера
- Технофэнтези
- Городская фантастика
- Русское фэнтези
- Юмористическая фантастика
- Космическая фантастика
- Боевое фэнтези
- Эпическая фантастика
- Зарубежная фантастика
- Книги магов
- Мистика
- Разная фантастика
- Разное фэнтези
- Любовное фэнтези
- Романтическая фантастика
- Городское фентези
- Историческая фантастика
- Историческое фэнтези
- Социально-философская фантастика
- Сказочная фантастика
- Иностранное фэнтези
- Романтическое фэнтези
- Ироническая фантастика
- Ужасы и Мистика
- Постапокалипсис
- Героическая фантастика
- Фэнтези
- Научная Фантастика
- Социально-психологическая
- Альтернативная история
- Боевая фантастика
- Разная литература
- Пословицы, поговорки
- Шахматы
- Визуальные искусства
- Фанфик
- Авто и ПДД
- Военное
- Отраслевые издания
- Гиды, путеводители
- Зарубежная образовательная литература
- Военная история
- Цитаты из афоризмов
- Современная литература
- Великолепные истории
- Начинающие авторы
- Современная зарубежная литература
- Боевые искусства
- Изобразительное искусство, фотография
- Кино
- Литература 19 века
- Недвижимость
- Музыка, музыканты
- Готические новеллы
- Истории из жизни
- Культура и искусство
- Спецслужбы
- Зарубежная прикладная литература
- Музыка, танцы
- Подростковая литература
- Прочее
- Военная техника, оружие
- Газеты и журналы
- Периодические издания
- Домоводство, Дом и семья
- Любовные романы
- Экономическая литература
- Научные и научно-популярные книги
- О животных
- Биохимия
- Культурология
- Юриспруденция
- Политика
- Психотерапия
- Языкознание
- Научпоп
- Медицина
- Психология, личное
- Радиотехника
- Филология
- Педагогика
- Образовательная литература
- Деловая литература
- Физика
- Науки: разное
- Химия
- Воспитание детей, педагогика
- Детская психология
- Зарубежная публицистика
- Биология
- Архитектура
- Зарубежная психология
- Науки о космосе
- Социология
- Математика
- География
- Беременность, ожидание детей
- Литературоведение
- Транспорт, военная техника
- Обществознание
- Зоология
- География
- Альтернативная медицина
- Иностранные языки
- Ветеринария
- Рефераты
- Астрология
- Биофизика
- Экология
- История Европы
- Учебники
- Шпаргалки
- Государство и право
- Ботаника
- Религиоведение
- История
- Техническая литература
- Прочая научная литература
- Психология
- Детективы и Триллеры
- Справочная литература
- Проза
- Новелла
- Юмор
- Проза
- Историческая проза
- Русская современная проза
- Советская классическая проза
- Повести
- Очерки
- Эссе
- Рассказы
- Зарубежная современная проза
- Сентиментальная проза
- Зарубежная классика
- Афоризмы
- Эпистолярная проза
- Феерия
- Семейный роман/Семейная сага
- Разное
- Антисоветская литература
- Магический реализм
- Русская классическая проза
- Современная проза
- О войне
- Контркультура
- Классическая проза
- Поэзия, Драматургия
- Детская литература
- Детская фантастика
- Детские остросюжетные
- Детские стихи
- Детские приключения
- Внеклассное чтение
- Учебная литература
- Зарубежные детские книги
- Бизнес
- Загадки
- Книги для подростков
- Школьные учебники
- Детский фольклор
- Книги для дошкольников
- Детские детективы
- Детская познавательная и развивающая литература
- Буквари
- Прочая детская литература
- Сказка
- Детская проза
- Детская образовательная литература
- Юмор
- Документальные книги
- Бизнес
- Внешнеэкономическая деятельность
- Тайм-менеджмент
- Кадровый менеджмент
- О бизнесе популярно
- Управление, подбор персонала
- Бизнес
- Менеджмент и кадры
- Продажи
- Экономика
- Ценные бумаги и инвестиции
- Малый бизнес
- Делопроизводство, офис
- Корпоративная культура, бизнес
- Банковское дело
- Финансы
- Зарубежная деловая литература
- Ораторское искусство / риторика
- Личные финансы
- Интернет-бизнес
- Поиск работы
- Государственное и муниципальное управление
- Бухучет и аудит
- Работа с клиентами
- Менеджмент
- Краткое содержание
- Личная эффективность
- Переговоры
- Приключения
- Старинная литература
- Религия и духовность
- Компьютеры и Интернет
- Блог
Читаем без скачивания ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ ПРОЛОГ - У Клоксин
Шрифт:
Интервал:
Закладка:
Как же программа ввести преодолеет проблемы возврата при вводе? Ответ заключается в том, что программа конструируется таким образом, что она вводит литеры с опережением на одну литеру, а проверки литеры выполняются правилом, отличным от правила, в котором эта литера была прочитана. Если литера введена в каком-то месте программы и не может быть здесь же использована, то она возвращается обратно для возможного использования другими правилами. В соответствии со сказанным предикат для ввода одного слова читать_слово в действительности имеет три аргумента. Первый предназначен для литеры, которая была получена при последнем выполнении get0 где-либо в программе, но которую оказалось невозможным использовать в месте ее получения. Второй предназначен для атома, который будет создан для прочитанного слова. Последний аргумент предназначен для литеры, следующей во вводимом предложении сразу за прочитанным словом. Для того чтобы определить, где кончается слово, необходимо ввести литеру, следующую непосредственно за словом. Эта литера должна быть сохранена, потому что она может оказаться первой литерой другого слова.
Здесь приведен текст программы:
/* Прочитать предложение */
ввести([Сл|Слс]):- get0(C), читать_слово(С,Сл,С1), остаток_предложения(Сл, С1, Слс).
/* Дано слово и литера после него, ввести остаток предложения */
остаток_предложения (Сл,_,П):- последнее_слово (Сл),!.
остаток_предложения(Сл,С,[Сл1|Слс]):- читать_слово(С, Сл, С1), остаток_предложения(Сл1,С1,Слс).
/* Ввести одно слово, имея начальную литеру и запомнив, какая литера идет после слова */
читать_слово(С,Сл,С1):- литера(С),!, name(Сл,С), get0(C1).
читать_слово(С,Сл,С2):- слово(С, Нс),!,get0(Cl),
остаток_слова(С1,Сс,С2),name(Сл,[Нс|Сс]).
читать_слово(С,Сл,С2):-get0(Cl), читать_слово (С1, Сл,С2).
остаток_слова(С,[Нс|Сс],С2):-слово(С,Нс),!,get0(Cl),остаток_слова (С1, Сс, С2). остаток_слова(С, [],С).
/* Эти литеры образуют отдельные слова */
литера(44) /*, */
литера(59) /*; */
литера(58) /*: */
литера(63) /*? */
литера(ЗЗ) /*! */
литера(46) /*. */
/* Следующие литеры могут встретиться внутри слова */
/* Второй факт для предиката слово преобразует прописные литеры в строчные
слово(С,С):- С › 96, С ‹ 123. /* a b… */
слово(С,М):- С › 64, С ‹ 91, M is С+ 32. /*А В… */
слово(С,С):- С › 47, С ‹ 58 /* 1 2… 9*/
слово(39,39). /* ' */
слово(45,45) /* – */
/* Следующие слова заканчивают предложение */
последнее_слово('.').
последнее_слово('!').
последнее_слово('?').
Упражнение 5.1. Объясните, для чего используется каждая переменная в приведенной программе.
Упражнение 5.2. Напишите программу, которая читает неограниченную последовательность литер и печатает ее, предварительно заменяя вхождения литеры а литерой b.
5.4. Чтение файлов и запись в файлы
Предикаты, обсуждавшиеся в этой главе ранее, использовались для ввода (чтения) и вывода (записи) данных при обмене лишь с терминалом, но они могут быть использованы и в более общих ситуациях. В Пролог-системе определяется текущий входной поток данных, из которого производится чтение всех вводимых данных. Все выводимые данные записываются в текущий выходной поток данных. В обычном состоянии текущий входной поток данных поступает с клавиатуры терминала, а текущий выходной поток данных направляется на дисплей терминала. Часто оказывается удобно выполнять операции чтения и записи данных над файлами, которые представляют последовательность литер во вторичной внешней памяти. Конкретный вид этой памяти зависит от используемой ЭВМ, но сейчас файлы обычно хранятся на магнитных дисках. Предполагается, что каждый файл имеет собственное имя(имя файла), используемое для идентификации файла. Для того чтобы содержание этой главы было понятно, читателю следует познакомиться с правилами организации и способом задания имен файлов в той операционной обстановке, в которой он работает. В Прологе имена файлов представляются атомами, но мы не можем исключить возможность каких-либо ограничений на синтаксис имен файлов, накладываемых конкретной обстановкой, в которой работает Пролог-система.
Файлы имеют определенную длину. Это означает, что они содержат определенное количество литер. В конце файла имеется специальный маркер, называемый маркером конца файла. Мы не обсуждали маркер конца файла до сих пор, так как выход на конец файла является более обычным делом для файлов, расположенных во внешней памяти, чем при обмене с терминалом. Если программа производит чтение файла, то маркер конца файла может быть обнаружен и в случае, когда программа читает термы и когда читаются отдельные литеры. Если при выполнении get0(X) встречается конец файла, то X будет конкретизирована некоторой управляющей литерой, обычно имеющей код 26 в таблице кодов ASCII. Если конец файла встречается при выполнении read(X), то X будет конкретизирована некоторым специальным термом, значение которого зависит от конкретной Пролог-системы. При попытке прочитать файл далее маркера конца возникает ошибка.
Имеется встроенный (стандартный) файл, называемый user. Чтение этого файла вызывает ввод данных с клавиатуры терминала, а запись в этот файл приводит к тому, что литеры печатаются на дисплее. Такой режим работы считается стандартным. При вводе с клавиатуры терминала признак конца файла генерируется при вводе управляющей литеры с кодом ASCII 26. Это окажет на выполнение get0 и read такое же воздействие, как если бы встретился конец файла.
5.4.1. Запись в файлы
Для записи в файлы термов и литер могут быть использованы в точности те же самые предикаты, что обсуждались ранее Единственное различие состоит в том, что когда мы хотим записать данные в файл, то нам надо сменить текущий выходной поток данных так, чтобы им являлся файл, в который мы будем записывать данные, а не дисплей терминала. Текущий выходной поток данных изменяется с помощью предиката tell. Если X конкретизирована именем файла, которое должно быть атомом, то целевое утверждение tell(X) переключает текущий выходной поток данных таким образом, что любая операция записи (выполняемая с помощью write, put и других подобных предикатов) будет производиться в этот файл, а не на дисплей терминала. Целевое утверждение tell(X) можно согласовать лишь один раз. Точно так же при выполнении Прологом возврата за целевое утверждение tell не происходит восстановления прежнего текущего выходного потока данных. Наряду со сменой текущего выходного потока данных предикат tell в зависимости от ситуации выполняет также другие операции. В первый раз, когда программа обращается к tell с конкретным именем файла X, Пролог считает, что необходимо завести новый файл с этим именем. Поэтому если X конкретизирована некоторым именем файла и файл с таким именем уже существует, то все литеры, уже содержащиеся в этом файле, удаляются. Напротив, если файла с именем, являющимся значением X, не существует, то файл с таким именем будет создан. В обоих случаях файл считается открытым (для записи в него). Это значит, что каждая последующая запись в этот файл будет добавлять литеры в конец файла до тех пор, пока не появится явное указание, что запись в файл полностью завершена (пока файл не будет закрыт). С данного момента если будет сделана новая попытка записи в этот файл, то Пролог, как и прежде, будет считать, что необходимо писать новую версию этого файла. При попытке выполнить tell(X), когда переменная X не имеет конкретного значения или ее значение не является именем файла, возникает ошибка. Реакция Пролог-системы на возникающие ошибки зависит от конкретной реализации.
Предикат telling используется для определения имени файла, служащего текущим выходным потоком данных. Целевое утверждение telling(X) считается согласованным, если X имеет своим значением имя файла текущего выходного потока данных. Как вы, наверное, догадываетесь, если X неконкретизировано, то telling конкретизирует X атомом (именем файла), делающим это целевое утверждение верным.
Когда запись в файл полностью завершена, то выполнение предиката told оформит конец файла и закроет его (для вывода). Кроме того, в результате его выполнения текущим выходным потоком данных снова станет дисплей терминала. Таким образом, типичная последовательность целевых утверждений для записи в файл некоторой совокупности литер имеет вид
… tеll(фред), write(X), told,…
Если текущий выходной поток данных переключается на другой файл без использования told, то прежний файл не будет закрыт и останется доступным для записи в него. Это позволяет делать записи в файл с перерывами, как в следующем примере;