Данная лекция посвящена работе с
Для начала вспомним, что пользовательские
file = <символическое имя файла1>;...; <символическое имя файлаN>
file располагается слева от равенства, а символические имена
Кроме пользовательских файлов, имеются стандартные
stdin (стандартное устройство ввода);stdout (стандартное устройство вывода);stderror (стандартное устройство вывода сообщений об ошибках);keyboard (клавиатура);screen (монитор);printer (параллельный порт принтера);coml (последовательный порт).По умолчанию стандартным устройством ввода является клавиатура, а стандартным устройством вывода — монитор. Чтобы начать работу с пользовательским
Далее мы познакомимся со встроенными предикатами Турбо Пролога, с помощью которых можно осуществлять операции открытия и закрытия
Начнем наше знакомство со встроенных предикатов, предназначенных для открытия
Предикат openread открывает
Предикат openwrite открывает
Предикат openappend открывает
Предикат openmodify открывает
Для того чтобы проверить, существует ли existfile. Этот предикат имеет один аргумент. Предикат истинен, если
Обратите внимание на то, что эти предикаты, связывают
Поскольку символ " \ ", обычно используемый для разделения имен каталогов, применяется в Турбо Прологе для записи кодов символов, требуется использовать вместо одного обратного слэша два (" \\ "). Например, чтобы указать путь " C:\Prolog\BIN ", нужно записать строку " C:\\Prolog\\BIN ".
Пример. Напишем замену для стандартного предиката openread. Предикат, который будет открывать openread, будет иметь два аргумента. Первым аргументом будет
При реализации этого предиката воспользуемся встроенными предикатами: existfile для проверки существования; предикатом openread для открытия существующего write для вывода сообщения.
openFile(F,N):–
existfile(N),!, /* проверяем существование
файла с именем N */
openread(F,N). /* связываем внешний файл
с именем N с файловой
переменной F и открываем
его на чтение */
openFile(_,N):–
write("Файл с именем ",N," не найден!").
/* выдаем сообщение, если предикат
existfile потерпел неудачу */
Аналогичным образом можно модифицировать предикаты openappend и openmodify. Предикат openwrite можно модифицировать таким образом, чтобы при попытке открыть существующий
Для того чтобы корректно закрыть открытый closefile. В качестве его единственного параметра указывается
С закрытым renamefile и deletefile.
Предикат deletefile удаляет
Предикат renamefile изменяет имя
Предикат disk позволяет задать или узнать текущий диск и/или каталог, в зависимости от того, связан его единственный аргумент или свободен.
Кроме того, имеется предикат dir, который позволяет выбрать из списка Enter имя попадает в переменную, чье имя указано в качестве третьего параметра этого предиката.
Есть еще вариант этого предиката, имеющий три дополнительных входных параметра: четвертый — включает/отключает отображение подкаталогов; пятый — разрешает/запрещает изменять нажатием клавиши F4 шаблон, в соответствии с которым отображаются
Предикат eof (сокращение от End Of File — "конец файла") успешен, если достигнут конец
Содержимое filepos.
У него три аргумента. Первый аргумент — это
Номер режима может принимать одно из трех значений: ноль, единица или двойка.
Если он равен нулю, то позиция считается от начала
Предикат может быть использован двояко. Если все три его аргумента связаны, то позиция, из которой осуществляется чтение или в которую производится запись, будет изменена в соответствии с числом, которым означен второй аргумент. Если его второй аргумент свободен, а первый и третий связаны, то второй аргумент будет означен текущей позицией чтения или записи.
Опишем ниже два предиката, служащие для
Для переопределения текущего устройства ввода или для того, чтобы узнать, какое устройства ввода является текущим, служит предикат readdevice. Этот предикат имеет один параметр, в качестве которого указывается readdevice используется с несвязанным параметром, то он возвращает в него имя устройства, которое в настоящий момент является активным устройством чтения информации. Если его параметр означен именем открытого для чтения устройства, то этот предикат переопределит активное устройство ввода информации.
Предикат writedevice подобен предикату readdevice, однако используется для переопределения текущего устройства вывода или для получения имени текущего устройства вывода. Он также имеет один параметр, который может быть использован либо как входной, либо как выходной. В первом случае будет переопределено текущее устройство записи информации (должно быть открыто на запись или дозапись), во втором — параметр будет связан с именем активного устройства вывода.
Для записи данных в текущее устройство записи служит уже знакомый нам предикат write, который до этого мы использовали для вывода информации на монитор. Для чтения информации из активного устройства вывода — также уже знакомые нам предикаты readln (читает строку), readint (читает целое), readreal (читает вещественное число), readchar (читает символ), readterm (читает терм).
Имеется также предикат file_str, который целиком читает символы
Предикат flush используется для принудительной записи в
И, наконец, последний встроенный предикат, о котором будет упомянуто в этой лекции, это предикат filemode. Он позволяет узнать или задать режим доступа к
Рассмотрим на примерах, как можно использовать описанные предикаты.
Пример. Начнем с предиката, выводящего содержимое произвольного
При реализации этого предиката воспользуемся встроенными предикатами: existfile для проверки наличия openread для открытия существующего readdevice для перенаправления ввода; eof для проверки, не исчерпали ли мы содержимое readchar для чтения символов из write для вывода прочитанного символа на экран.
Сначала напишем вспомогательный предикат, который будет читать символы из
Основной предикат будет проверять существование openread и определим его в качестве текущего устройства ввода информации, используя предикат readdevice. Далее воспользуемся нашим вспомогательным предикатом для вывода содержимого closefile. Сделаем текущим устройством чтения клавиатуру, воспользовавшись предикатом readdevice. В принципе, можно на этом остановиться, а можно организовать паузу до нажатия любой клавиши предикатом readchar(_). До этого неплохо бы вывести сообщение о том, что работа будет продолжена после нажатия любой клавиши.
Так как это — наш первый опыт работы с
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).
Попробуйте изменить эту программу так, чтобы в nl или сцепив записываемую строку с двумя символами с кодами 13 и 10.
Пример. Запишем предикат, который будет выводить содержимое
Напишем только этот предикат, оставив "за кадром" проверку на существование внешнего readchar. Выводим его на экран посредством предиката write, перенаправляем вывод на принтер предикатом writedevice, выводим символ на принтер, заставляем принтер немедленно напечатать символ, используя предикат flush, устанавливаем для последующего вывода символа текущим устройством записи информации экран. Повторяем этот процесс, пока не будут исчерпаны все символы исходного
writeFile_to_scr_and_pr(f):–
not(eof(f)),!, /* если файл f еще
не закончился */
readchar(C), /* читаем из файла f
символ в переменную C */
write(C), /* выводим символ C на экран */
writedevice(printer),
/* устанавливаем текущим
устройством записи
принтер*/
write(C), /* выводим символ C на экран */
flush(printer),
/* сбрасываем данные из буфера
на принтер */
writedevice(screen),
/* перенаправляем вывод
на экран*/
writeFile_to_scr_and_pr(f).
/* продолжаем */
writeFile_to_scr_and_pr:–
closefile(f). /* закрываем файл f */
Обратите внимание на использование стандартного предиката flush. Как правило, принтер выводит данные на печать только тогда, когда будет заполнен его внутренний буфер. Предикат flush позволяет осуществить немедленный вывод на печатающее устройство накопленной в буфере информации.
Попробуйте изменить этот предикат так, чтобы чтение из readchar на предикат readln, а также не забудьте добавить символы конца строки и перевода каретки при выводе.
Пример. Напишем предикат, который будет переписывать компоненты одного
Начнем с создания вспомогательного предиката, который будет читать из первого upper_lower, а полученные строки записывать во второй
Основной предикат будет проверять существование исходного
Запишем эти два предиката. Надеюсь, что недостающие разделы описаний читатели уже в состоянии дописать самостоятельно.
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 был неуспешен */
openwrite, который будет открывать файл на запись, если файл существует, и выводить соответствующее сообщение, если он отсутствует.openmodify, который будет открывать файл на чтение и запись, если файл существует, и выводить соответствующее сообщение, если файл отсутствует.openappend, который будет открывать файл на дозапись, если файл существует, и выводить соответствующее сообщение, если он отсутствует.Данная лекция посвящена работе с
Для начала вспомним, что пользовательские
file = <символическое имя файла1>;...; <символическое имя файлаN>
file располагается слева от равенства, а символические имена
Кроме пользовательских файлов, имеются стандартные
stdin (стандартное устройство ввода);stdout (стандартное устройство вывода);stderror (стандартное устройство вывода сообщений об ошибках);keyboard (клавиатура);screen (монитор);printer (параллельный порт принтера);coml (последовательный порт).По умолчанию стандартным устройством ввода является клавиатура, а стандартным устройством вывода — монитор. Чтобы начать работу с пользовательским
Далее мы познакомимся со встроенными предикатами Турбо Пролога, с помощью которых можно осуществлять операции открытия и закрытия
Начнем наше знакомство со встроенных предикатов, предназначенных для открытия
Предикат openread открывает
Предикат openwrite открывает
Предикат openappend открывает
Предикат openmodify открывает
Для того чтобы проверить, существует ли existfile. Этот предикат имеет один аргумент. Предикат истинен, если
Обратите внимание на то, что эти предикаты, связывают
Поскольку символ " \ ", обычно используемый для разделения имен каталогов, применяется в Турбо Прологе для записи кодов символов, требуется использовать вместо одного обратного слэша два (" \\ "). Например, чтобы указать путь " C:\Prolog\BIN ", нужно записать строку " C:\\Prolog\\BIN ".
Пример. Напишем замену для стандартного предиката openread. Предикат, который будет открывать openread, будет иметь два аргумента. Первым аргументом будет
При реализации этого предиката воспользуемся встроенными предикатами: existfile для проверки существования; предикатом openread для открытия существующего write для вывода сообщения.
openFile(F,N):–
existfile(N),!, /* проверяем существование
файла с именем N */
openread(F,N). /* связываем внешний файл
с именем N с файловой
переменной F и открываем
его на чтение */
openFile(_,N):–
write("Файл с именем ",N," не найден!").
/* выдаем сообщение, если предикат
existfile потерпел неудачу */
Аналогичным образом можно модифицировать предикаты openappend и openmodify. Предикат openwrite можно модифицировать таким образом, чтобы при попытке открыть существующий
Для того чтобы корректно закрыть открытый closefile. В качестве его единственного параметра указывается
С закрытым renamefile и deletefile.
Предикат deletefile удаляет
Предикат renamefile изменяет имя
Предикат disk позволяет задать или узнать текущий диск и/или каталог, в зависимости от того, связан его единственный аргумент или свободен.
Кроме того, имеется предикат dir, который позволяет выбрать из списка Enter имя попадает в переменную, чье имя указано в качестве третьего параметра этого предиката.
Есть еще вариант этого предиката, имеющий три дополнительных входных параметра: четвертый — включает/отключает отображение подкаталогов; пятый — разрешает/запрещает изменять нажатием клавиши F4 шаблон, в соответствии с которым отображаются
Предикат eof (сокращение от End Of File — "конец файла") успешен, если достигнут конец
Содержимое filepos.
У него три аргумента. Первый аргумент — это
Номер режима может принимать одно из трех значений: ноль, единица или двойка.
Если он равен нулю, то позиция считается от начала
Предикат может быть использован двояко. Если все три его аргумента связаны, то позиция, из которой осуществляется чтение или в которую производится запись, будет изменена в соответствии с числом, которым означен второй аргумент. Если его второй аргумент свободен, а первый и третий связаны, то второй аргумент будет означен текущей позицией чтения или записи.
Опишем ниже два предиката, служащие для
Для переопределения текущего устройства ввода или для того, чтобы узнать, какое устройства ввода является текущим, служит предикат readdevice. Этот предикат имеет один параметр, в качестве которого указывается readdevice используется с несвязанным параметром, то он возвращает в него имя устройства, которое в настоящий момент является активным устройством чтения информации. Если его параметр означен именем открытого для чтения устройства, то этот предикат переопределит активное устройство ввода информации.
Предикат writedevice подобен предикату readdevice, однако используется для переопределения текущего устройства вывода или для получения имени текущего устройства вывода. Он также имеет один параметр, который может быть использован либо как входной, либо как выходной. В первом случае будет переопределено текущее устройство записи информации (должно быть открыто на запись или дозапись), во втором — параметр будет связан с именем активного устройства вывода.
Для записи данных в текущее устройство записи служит уже знакомый нам предикат write, который до этого мы использовали для вывода информации на монитор. Для чтения информации из активного устройства вывода — также уже знакомые нам предикаты readln (читает строку), readint (читает целое), readreal (читает вещественное число), readchar (читает символ), readterm (читает терм).
Имеется также предикат file_str, который целиком читает символы
Предикат flush используется для принудительной записи в
И, наконец, последний встроенный предикат, о котором будет упомянуто в этой лекции, это предикат filemode. Он позволяет узнать или задать режим доступа к
Рассмотрим на примерах, как можно использовать описанные предикаты.
Пример. Начнем с предиката, выводящего содержимое произвольного
При реализации этого предиката воспользуемся встроенными предикатами: existfile для проверки наличия openread для открытия существующего readdevice для перенаправления ввода; eof для проверки, не исчерпали ли мы содержимое readchar для чтения символов из write для вывода прочитанного символа на экран.
Сначала напишем вспомогательный предикат, который будет читать символы из
Основной предикат будет проверять существование openread и определим его в качестве текущего устройства ввода информации, используя предикат readdevice. Далее воспользуемся нашим вспомогательным предикатом для вывода содержимого closefile. Сделаем текущим устройством чтения клавиатуру, воспользовавшись предикатом readdevice. В принципе, можно на этом остановиться, а можно организовать паузу до нажатия любой клавиши предикатом readchar(_). До этого неплохо бы вывести сообщение о том, что работа будет продолжена после нажатия любой клавиши.
Так как это — наш первый опыт работы с
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).
Попробуйте изменить эту программу так, чтобы в nl или сцепив записываемую строку с двумя символами с кодами 13 и 10.
Пример. Запишем предикат, который будет выводить содержимое
Напишем только этот предикат, оставив "за кадром" проверку на существование внешнего readchar. Выводим его на экран посредством предиката write, перенаправляем вывод на принтер предикатом writedevice, выводим символ на принтер, заставляем принтер немедленно напечатать символ, используя предикат flush, устанавливаем для последующего вывода символа текущим устройством записи информации экран. Повторяем этот процесс, пока не будут исчерпаны все символы исходного
writeFile_to_scr_and_pr(f):–
not(eof(f)),!, /* если файл f еще
не закончился */
readchar(C), /* читаем из файла f
символ в переменную C */
write(C), /* выводим символ C на экран */
writedevice(printer),
/* устанавливаем текущим
устройством записи
принтер*/
write(C), /* выводим символ C на экран */
flush(printer),
/* сбрасываем данные из буфера
на принтер */
writedevice(screen),
/* перенаправляем вывод
на экран*/
writeFile_to_scr_and_pr(f).
/* продолжаем */
writeFile_to_scr_and_pr:–
closefile(f). /* закрываем файл f */
Обратите внимание на использование стандартного предиката flush. Как правило, принтер выводит данные на печать только тогда, когда будет заполнен его внутренний буфер. Предикат flush позволяет осуществить немедленный вывод на печатающее устройство накопленной в буфере информации.
Попробуйте изменить этот предикат так, чтобы чтение из readchar на предикат readln, а также не забудьте добавить символы конца строки и перевода каретки при выводе.
Пример. Напишем предикат, который будет переписывать компоненты одного
Начнем с создания вспомогательного предиката, который будет читать из первого upper_lower, а полученные строки записывать во второй
Основной предикат будет проверять существование исходного
Запишем эти два предиката. Надеюсь, что недостающие разделы описаний читатели уже в состоянии дописать самостоятельно.
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 был неуспешен */
openwrite, который будет открывать файл на запись, если файл существует, и выводить соответствующее сообщение, если он отсутствует.openmodify, который будет открывать файл на чтение и запись, если файл существует, и выводить соответствующее сообщение, если файл отсутствует.openappend, который будет открывать файл на дозапись, если файл существует, и выводить соответствующее сообщение, если он отсутствует.Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.