- •«Рекурсивно-логическое программирование»
- •Содержание
- •1 Введение в язык Пролог
- •2 Логические основы Пролога
- •3 Основные понятия Пролога
- •4 Рекурсия
- •5 Структура программы на Турбо Прологе
- •6 Управление выполнением программы на Прологе
- •7 Списки
- •8 Сортировка списков
- •9 Множества и деревья
- •10 Строки
- •11 Файлы
- •12 Внутренние (динамические) базы данных
- •13 Пролог и искусственный интеллект
11 Файлы
Файлом называют именованную совокупность данных, записанных на диске. Файл состоит из компонентов. При чтении или записи файловая переменная перемещается по очередному компоненту и делает его доступным для обработки. В Прологе пользовательские файлы описываются в разделе описания доменов следующим образом:
file = <символическое имя файла1>;...;
<символическое имя файлаN>
Символические имена файлов называют внутренними или логическими именами в отличие от внешних или физических имен файлов. Символическое имя файла должно начинаться со строчной буквы. Кроме пользовательских файлов имеются стандартные файлы, которые не нужно описывать в разделе описания доменов.
Это:
stdin(стандартное устройство ввода);
stdout(стандартное устройство вывода);
stderror(стандартное устройство вывода сообщений об ошибках);
keyboard(клавиатура);
screen(монитор);
printer(параллельный порт принтера);
coml(последовательный порт).
По умолчанию стандартным устройством ввода является клавиатура, а вывода – монитор. Чтобы начать работу с пользовательским файлом, его нужно открыть, а по завершении работы закрыть. Стандартное устройство открывать и закрывать не нужно. Встроенные предикаты для работы с файлами:
openread – открывает только для чтения. openwrite – только для записи. openappend – запись в конец файла openmodify – чтение и запись одновременно existfile – истинен если файл с указанным именем существует
“C:\\Prolog\\BIN”
closefile – закрытие файла renamefile – переименовать файл deletefile – удалить файл disk – задает текущий диск или каталог dir – выбор из списка файлов eof – истинен если достигнут конец файла filepos – текущая позиция чтения или записи в файле или изменить её. Первый аргумент символическое имя, второй – позиция внутри файла, третий - номер режима, который задает откуда отсчитывается позиция (0 – начало, 1 – текущая, 3 - конец) readdevice – используется для переопределения текущего устройства ввода или чтобы узнать, какое устройство является текущим. writedevice – используется для переопределения текущего устройства вывода или для получения имени текущего устройства вывода. write – предикат для записи данных в текущее устройство readln – чтение строки и з текущего устройства readint – читает целое число
readreal - читает вещественное число
readchar – читает символ
readterm – читает терм file_str – читает символы файла в строку или, наоборот, записывает содержимое строки в файл, в зависимости от того, свободен ли второй параметр этого предиката flush – используется для принудительной записи в файл содержимого внутреннего буфера, выделенного для файла, указанного в его единственном параметре filemode – задает режим доступа к файлу(0 – бинарный режим, 1 - текстовый)
Пример. Предикат, выводящий содержимое произвольного файла на экран. Параметр – внешнее дисковое имя файла.
DOMAINS /* раздел описания доменов */
file = f /* f — внутреннее имя файла */
PREDICATES /* раздел описания предикатов */
write_file(file)
writeFile(string)
CLAUSES /* раздел описания предложений */
write_file(f):–
not(eof(f)),!, /* если файл f еще
не закончился */
readchar(C), /* читаем из него символ */
write(C," "), /* выводим символ на экран*/
write_file(f). /* продолжаем процесс */
write_file(_). /* это предложение нужно, чтобы предикат
не потерпел неудачу в случае, когда
будет достигнут конец файла */
writeFile(F_N):–
existfile(F_N),!, /* убеждаемся в существовании
файла с именем F_N */
openread(f,F_N), /* связываем внешний файл F_N
с внутренним файлом f
и открываем его на чтение */
readdevice(f), /* устанавливаем в качестве
устройства чтения файл f */
write_file(f), /* вызываем предикат, выводящий
на экран все символы
файла f */
closefile(f), /* закрываем файл */
readdevice(keyboard), /* перенаправляем ввод
на клавиатуру */
nl,nl, /* пропускаем строку */
write("Нажмите любую клавишу"),
/* выводим сообщение на экран */
readchar(_)./* ждем нажатия любой клавиши */
writeFile(F_N):–
write("Файл с именем ",F_N," не наден!").
/* выдаем сообщение, если предикат
existfile потерпел неудачу */
GOAL /* раздел описания внутренней цели*/
write("Введите имя файла: "),
readln(F_N), /* читаем название файла в переменную F_N */
writeFile(F_N).
Пример. Формирование файла из символов с клавиатуры.
DOMAINS
file=f
PREDICATES
Readfile
CLAUSES
readfile:–
writedevice(screen), /* назначаем текущим
устройством записи
экран */
write("Введите символ (# — конец ввода)"), nl,
/* выводим сообщение */
readchar(C), /* читаем символ с клавиатуры */
write(C), /* дублируем символ на экран */
C<>'#',!, /* если это не #*/
writedevice(f), /* , то перенаправляем вывод
в файл */
write(C), /* записываем символ в файл */
readfile.
readfile:–
closefile(f). /* если введенный символ оказался
равен символу '#', то закрываем файл */
GOAL
write("Введите имя файла: "),
readln(F_N),
/* читаем название файла в переменную F_N */
openwrite(f,F_N), /* связываем внешний файл F_N
с внутренним файлом f и открываем
его на запись */
readfile(f).
Пример. Предикат, который переписывает один файл в другой так, чтобы в другом файле все английские буквы были большими.
transform:–
not(eof(f)),!, /* если файл f еще
не закончился */
readln(S), /* читаем из файла f строку
в переменную S */
upper_lower(S_U,S),
/* S_U — результат преобразования
всех символов строки S в верхний
егистр */
write(S_U),nl, /* записываем строку S_U
в файл f_o */
transform. /* продолжаем процесс */
transform:–
closefile(f), /* закрываем файл f */
closefile(f_o). /* закрываем файл f_o */
upper_file(N_F,N_o_F):–
existfile(N_F),!, /* проверяем существование
файла с именем N_F */
openread(f,N_F), /* связываем внешний файл
с именем N_F с внутренним
файлом f и открываем его
на чтение */
readdevice(f), /* устанавливаем в качестве
текущего устройства чтения
файл f */
openwrite(f_o,N_o_F),
/* связываем внешний файл с именем
N_o_F с внутренним файлом f
и открываем его на запись */
writedevice(f_o), /* устанавливаем в качестве
текущего устройства записи
файл f_o */
transform. /* вызываем вспомогательный
предикат */
upper_file(N_F,_):–
write("Файл с именем ",N_F," не найден!").
/* выдаем сообщение, если предикат
existfile был неуспешен */
