lect 5 prolog
TRANSCRIPT
![Page 1: Lect 5 prolog](https://reader034.vdocuments.net/reader034/viewer/2022052401/55c75093bb61ebf36f8b45b9/html5/thumbnails/1.jpg)
ФАЙЛИ: ЗАПИС ТА ЧИТАННЯ
Лекція 5
![Page 2: Lect 5 prolog](https://reader034.vdocuments.net/reader034/viewer/2022052401/55c75093bb61ebf36f8b45b9/html5/thumbnails/2.jpg)
1. ФАЙЛОВА СИСТЕМА В PROLOG
Файл може бути відкритий:
для читання;
для запису;
для додавання;
для модифікації.
Файл, відкритий для будь-якої дії, відмінної від читання, повинен бути закритий після завершення операції. В іншому випадку внесені до файлу зміни можуть бути після завершення операції. В іншому випадку внесені до файлу зміни можуть бути втрачені. Можна відкрити кілька файлів одночасно. При цьому введення і виведення можуть бути швидко перепризначені між відкритими файлами.
Вбудовані альтернативи домену file:keyboard Читання з клавіатури (за замовчуванням)screen Запис в моніторstdin Читання зі стандартного вводуstdout Запис в стандартне виведенняstderr Запис на стандартний пристрій для виведення помилок
![Page 3: Lect 5 prolog](https://reader034.vdocuments.net/reader034/viewer/2022052401/55c75093bb61ebf36f8b45b9/html5/thumbnails/3.jpg)
1. ВІДКРИТТЯ ТА ЗАКРИТТЯ ФАЙЛІВ
Предикат openread / 2
відкриває файл OSFileName для читання, використовуючи формат:
openread (SymbolicFileName, OSFileName) % (i, i)
Prolog звертається до відкритого файлу по символічному імені SymbolicFileName, оголошеному в домені file. Якщо файл не може бути відкритий, Prolog видасть повідомлення про помилку.
Предикат openwrite / 2
відкриває файл OSFileName для запису, використовуючи формат:відкриває файл OSFileName для запису, використовуючи формат:
openwritе (SymbolicFileName, OSFileName) % (i, i)
Якщо файл вже існує, то він знищується. В іншому випадку Prolog створює новий файл і поміщає його у відповідному каталозі. Якщо файл не може бути створений, Prolog видасть повідомлення про помилку.
Предикат openappend / 2
відкриває файл OSFileName для запису в кінець файлу. При цьому використовується формат:
openappend (SymbolicFileName, OSFileName) % (i, i)
Якщо файл не може бути відкритий для запису, Prolog повідомить про помилку.
![Page 4: Lect 5 prolog](https://reader034.vdocuments.net/reader034/viewer/2022052401/55c75093bb61ebf36f8b45b9/html5/thumbnails/4.jpg)
1. ВІДКРИТТЯ ТА ЗАКРИТТЯ ФАЙЛІВПредикат openmodify / 2
відкриває файл OSFileName і для запису, і для читання; якщо файл вже існує, він не буде перезаписаний, openmodify має формат:
openmodify (SymbolicFileName, OSFileName) % (i, i)
Якщо система не може відкрити OSFileName, Prolog повідомить про помилку. Для заповнення файлу з довільним доступом предикат openmodify може використовуватися разом зі стандартним предикатом filepos.
Предикат filemode / 2
При відкритті файлу в текстовому режимі предикат filemode встановлює вказаний При відкритті файлу в текстовому режимі предикат filemode встановлює вказаний файл в текстовий або двійковий режим, використовуючи формат:
filemode (SymbolicFileName, FileMode) % (i, i)
Якщо FileMode = 0, файл SymbolicFileName встановлюється в двійковий режим; якщо FileMode = 1, то він встановлюється в текстовий режим. У текстовому режимі при запису до нових рядків додаються символи "повернення каретки "/" переведення рядка ", а при читанні ця пара символів інтерпретується як новий рядок.
Carriage return (повернення каретки) = ASCII 13
Line feed (переклад рядка) = ASCII 10
У двійковому режимі ніяких перетворень не проводиться. Для читання двійкового файлу можна використовувати тільки предикат readchar або предикати для доступу до двійковим файлів,
![Page 5: Lect 5 prolog](https://reader034.vdocuments.net/reader034/viewer/2022052401/55c75093bb61ebf36f8b45b9/html5/thumbnails/5.jpg)
1. ВІДКРИТТЯ ТА ЗАКРИТТЯ ФАЙЛІВ
Предикат closefile / 1
закриває вказаний файл; він використовує формат: closefile (SymbolicFileName)% (i)
Цей предикат завжди завершується успішно, навіть якщо файл не був відкритим.
Предикат readdevice / 1
перевизначає current_read_device (поточний пристрій читання) або повертає його ім'я. Предикат має формат:
readdevice (SymbolicFileName) % (i), (о)readdevice (SymbolicFileName) % (i), (о)
Предикат readdevice перевизначає поточний пристрій читання, якщо змінна SymbolicFileName визначена, і файл відкритий для читання. Якщо SymbolicFileNameє вільною змінною, то readdevice присвоїть їй ім'я поточного активного пристрою читання.
Предикат writedevice / 1
або призначає, або дозволяє отримати ім'я current_write_device (поточного пристрою запису). Він має формат:
writedevice (SymbolicFileName) % (i), (о)
Предикат writedevice перевизначить пристрій запису, якщо зазначений файл відкритий для запису або додавання. Якщо змінна SymbolicFileName вільна, writedevice присвоїть їй ім'я поточного активного пристрою запису.
![Page 6: Lect 5 prolog](https://reader034.vdocuments.net/reader034/viewer/2022052401/55c75093bb61ebf36f8b45b9/html5/thumbnails/6.jpg)
1. ВІДКРИТТЯ ТА ЗАКРИТТЯ ФАЙЛІВ
![Page 7: Lect 5 prolog](https://reader034.vdocuments.net/reader034/viewer/2022052401/55c75093bb61ebf36f8b45b9/html5/thumbnails/7.jpg)
2. РОБОТА З ФАЙЛАМИПредикат filepos / 3
може керувати позицією, де проводиться читання або запис. Має формат:
filepos (SymbolicFileName, FilePosition, Mode) % (i, i, i), (i, o, i)
Якщо FilePosition - пов'язана змінна, предикат може змінити позицію читання і запису для файлу з ім'ям SymbolicFileName. Якщо при виклику FilePosition є вільною змінною, то SymbolicFileName повертає поточну позицію у файлі. Значення SymbolicFileName належить типу long.
Mode FilePosition
Mode є цілою величиною і вказує, як має інтерпретуватися значення FilePosition:
0 Щодо початку файлу
1 Щодо поточної позиції
2 Щодо кінця файлу (кінець файлу
відповідає позиції 0)
Коли повертається FilePosition, то fileposповертає позицію щодо початку файлу незалежно від значення Mode.
![Page 8: Lect 5 prolog](https://reader034.vdocuments.net/reader034/viewer/2022052401/55c75093bb61ebf36f8b45b9/html5/thumbnails/8.jpg)
2. РОБОТА З ФАЙЛАМИ
![Page 9: Lect 5 prolog](https://reader034.vdocuments.net/reader034/viewer/2022052401/55c75093bb61ebf36f8b45b9/html5/thumbnails/9.jpg)
2. РОБОТА З ФАЙЛАМИ
Предикат eof / 1перевіряє, чи є позиція, отримана в процесі читання, кінцем файлу. У цьому випадку
eof успішний. В іншому випадку - неуспіх.Предикат eof має вигляд:
eof (SymbolicFileName)% (i)eof видає помилку під час виконання, якщо файл був відкритий з правами тільки на
запис. Зверніть увагу, що предикат не надає особливого значення символу кінця файла
DOS (комбінація клавіш <Ctrl> + <Z>).DOS (комбінація клавіш <Ctrl> + <Z>).Приклад, як предикат eof можна використовувати для визначення
предиката repfile, який корисний при роботі з файлами, repfile генерує точку овернення до тих пір, поки не буде досягнуто кінець файлу.
![Page 10: Lect 5 prolog](https://reader034.vdocuments.net/reader034/viewer/2022052401/55c75093bb61ebf36f8b45b9/html5/thumbnails/10.jpg)
2. РОБОТА З ФАЙЛАМИ
![Page 11: Lect 5 prolog](https://reader034.vdocuments.net/reader034/viewer/2022052401/55c75093bb61ebf36f8b45b9/html5/thumbnails/11.jpg)
2. РОБОТА З ФАЙЛАМИ
Предикат flush / 1записує вміст внутрішнього буфера в іменований файл. Має формат:
flush (SymbolicFileName)% (i)Він же запитує систему "скинути всі буфери".
Предикат existfile / 1виконується успішно, якщо файл ОSFileName буде знайдений. Формат його наступний:
existfile (OSFileName)% (i)
Предикат OSFileName може містити каталог, а саме ім'я може містити знаки Предикат OSFileName може містити каталог, а саме ім'я може містити знаки підстановки, як c: \ psys \ *. cfg. Предикат existfile завершується неуспішно, якщо ім'я файлу не знайдено в позначеному шляху каталогу. Проте, незважаючи на те, що existfileзнаходить всі файли, включаючи файли з встановленими атрибутами "system“ і "hidden“, він не знаходить каталоги. Це може бути виконано використанням предикатів пошуку каталогів.
Для перевірки того, що файл присутній на диску (перш ніж відкривати його), ви можете скористатися:
![Page 12: Lect 5 prolog](https://reader034.vdocuments.net/reader034/viewer/2022052401/55c75093bb61ebf36f8b45b9/html5/thumbnails/12.jpg)
2. РОБОТА З ФАЙЛАМИ
Предикат search file / 3
використовується для знаходження файлу в списку шляхів. Він приймає три аргументи:
searchfile (PathList, Name, FoundName)% (i, i, o)
де PathList - це рядок, що містить один або більше шляхів, розділених «;», Name - ім'я шуканого файлу. Якщо файл знайдений, FoundName буде пов'язана з повним його ім'ям, інакше searchfile завершиться неуспішно. Наприклад:
SearchFile (".; ..; С: \ \", "autoexec.bat", FoundName),SearchFile (".; ..; С: \ \", "autoexec.bat", FoundName),
якщо autoexec.bat розташований в корені диска С:, FoundName встановиться рівним C: \ AUTOEXEC.BAT.
Файл може містити символи підстановки. У цьому випадку FoundName буде пов'язана з повним ім'ям файлу, що містить символи підстановки, і далі може бути використана як аргумент для предикатів пошуку каталогів. Наприклад, якщо ім'я файлу в попередньому прикладі задано як *. bat замість autoexec.bat, FoundNameвиявиться пов'язаним з С: \ *. ВАТ.
Предикат deletefile / 1
знищує файл, заданий його аргументом, і має формат:
deletefile (OSFileName)% (i)
Предикат deletefile дасть помилку, якщо не зможе видалити файл. OSFileName
![Page 13: Lect 5 prolog](https://reader034.vdocuments.net/reader034/viewer/2022052401/55c75093bb61ebf36f8b45b9/html5/thumbnails/13.jpg)
3. УПРАВЛІННЯ ТЕРМАМИПредикат readterm дозволяє отримати доступ до фактів у файлі. Він може зчитати будь-
які об'єкти, записані предикатом write, і має вигляд: readterm (<name>, TermParam), де <name> - ім'я домену.
![Page 14: Lect 5 prolog](https://reader034.vdocuments.net/reader034/viewer/2022052401/55c75093bb61ebf36f8b45b9/html5/thumbnails/14.jpg)
3. УПРАВЛІННЯ ТЕРМАМИVisual Prolog створює одну доменну альтернативу для кожного предиката з розділу facts. Пролог
описує кожен предикат бази фактів за допомогою функтора і доменів аргументів цього предиката. Наприклад, для такого оголошення розділу facts:
Visual Prolog
згенерує: