- •1. Вступ в логічне програмування
- •1.1. Виникнення логічного програмування
- •1.2. Сучасний стан логічного програмування
- •Опис задачі на пролозі. Факти і правила
- •2.1. Опис задачі на пролозі
- •2.2. Факти
- •Цільове твердження
- •Умовні твердження
- •Приклад програми на пролозі
- •2.6. Виконання програми на пролозі
- •2.7. Статична та динамічна бази даних
- •2.8. Підготовка фактів для внутрішньої бази даних
- •2.9. Опис фактів внутрішньої бази даних
- •2.10. Предикати роботи з внутрішньою базою даних
- •2.11. Приклади використання внутрішньої бази даних
- •3. Основні поняття visual-prolog
- •3.1. Загальні відомості
- •3.3. Домени елементарних об’єктів
- •3.4. Терми
- •3.4.1. Константа
- •Анонімна змінна
- •3.4.3. Структури
- •3.5. Програма на пролозі
- •4. Механізми прологу
- •Механізм узгодження цілі з базою даних
- •4.2. Механізм звороту
- •4.3. Механізм звороту і відсік
- •4.4. Рекурсія
- •4.4.1. Рекурсивний метод розв’язку задач
- •Рекурсивні методи 2-х доменів:
- •Застосуємо висхідний метод рекурсії до розв’язку задачі:
- •Висхідна рекурсія
- •4.4.4. Предикат repeат
- •Міркування про те, як треба писати програму
- •5. Обробка рядків
- •5.1. Загальні відомості
- •1.1 Стандартні предикати обробки рядків
- •5.3. Лексиграфічне порівняння рядків
- •2Низхідна рекурсія
- •6.1. Метод низхідної рекурсії
- •6.2. Загальна характеристика рекурсивних методів
- •6.3. Низхідна та висхідна рекурсії
- •7. Робота зі списками
- •7.1. Списки. Оголошення списків
- •7.2. Увід-вивід списків
- •7.3. Основна операція на списках
- •7.4. Формування списків стандартним предикатом
- •Процедура з’єднує два списки.
- •Процедура розділяє список на два за вказаним елементом.
- •2.1 Сортування списків на пролозі
- •Сортування методом пухирця
- •7.8. Складені списки
- •8. Предикати вводу-вивіду
- •8.1. Предикати вводу
- •8.2. Предикати виводу
- •9. Файли
- •9.1. Символічне ім’я файлу
- •9.2. Вхідний і вихідний потоки
- •9.3. Організація файлу та методи доступу до файлу
- •9.4. Робота з файлами різними методами доступу
- •9.5. Закриття файлу
- •9.6. Предикати роботи з каталогами
- •9.7. Предикати, що працюють з атрибутами файлів
- •Література
9.3. Організація файлу та методи доступу до файлу
Тип предикату вводу, яким вводиться компонента файлу в програму, повинен відповідати типу компоненти файлу. Тобто, для роботи з файлом треба знати його організацію. Наприклад: Файл містить цілі числа. Програма читає компоненту файлу – ціле число предикатом readint. Від організації файлу залежить метод доступу до файлу.
Пролог дозволяє працювати з файлами послідовним методом доступу і прямим методом доступу. Якщо компоненти файлу мають однакову довжину, то з файлом зручно працювати прямим методом доступу.
Кожен з методів вимагає своїх предикатів відкриття файлу.
При послідовному методу доступу до компонент файлу, не можна прочитати другу компоненту раніше ніж буде прочитана перша компонента. Аналогічно не можна записати спочатку другу компоненту, а потім першу.
При відкритті файла для послідовного методу доступу покажчик на компоненту файла встановлюється в нуль. Читання компоненти послідовним методом супроводжується автоматичним нарощуванням покажчика на одну компоненту.
Для прямого доступу покажчик встановлюється на вказаний номер байту. Якщо всі компоненти файлу мають однакову довжину, то можна підрахувати номер байту для роботи з певною компонентою. Робота з файлом прямим методом вимагає знання про структуру файлу.
9.4. Робота з файлами різними методами доступу
Стандартні предикати дозволяють відкрити файли в поточному каталогу для послідовного або прямого методу доступу.
Для читання або запису можна відкрити декілька файлів, але активним в певний момент часу може бути тільки один файл для запису, той що призначено на вихідний потік і один файл для читання, той що призначено для вхідного потоку.
Відкриття файлів для утворення файлу послідовним методом доступу
Предикат openwrite (Симв_ім'я, Ім'я_файлу_в_ОС) використовують для послідовного запису і перезапису файлу.
Покажчик на компоненту файла встановлюється в нульове положення. Якщо файл із таким ім'ям вже існує, то відбувається перезапис цього файлу.
Утворення файлу послідовним методом доступу
Розглянемо на прикладі програми, які дії виконують при утворенні файлу послідовним методом доступу.
Завдання. Ввести компоненти файлу з клавіатури і записати їх у файл (утворення файлу).
Domains
File = f
Predicates
Do
repeat
do1
Goal
openwrite (f, ”F.dat” ), writedevice (f), do, closefile (f).
Clauses
Repeat.
Repeat: - Repeat.
Do: - repeat, readln (Y), do1(Y),Y=””.
Do1(Y):- Y= “”;
Write(Y).
Процедура виконує дії:
відкриває файл для запису послідовним методом доступу;
призначає вихідний потік на файл;
вводить компоненти з клавіатури;
записує компоненти у файл;
По закінченню компонент файл закривається.
Ввід виконується до введення ознаки кінця вводу(порожній рядок).
Відкриття файлів для читання файлу послідовним методом доступу
Предикат Openread (Символічне ім'я, Ім'я_файлу_в_ОС) використовують для послідовного читання існуючого файлу. Покажчик на компоненту файла встановлюється в нульове положення.
Читання файлу послідовним методом доступу
Розглянемо на прикладі програми, які дії виконують при читанні файлу послідовним методом доступу.
При послідовному читанню файлу необхідно перевіряти файл на кінець.
Предикат EOF (Символічне ім'я) перевіряє на досягнення позиції кінця файлу.
Завдання. Прочитати компоненти файлу і вивести їх на екран.
Domains
File = f
Predicates
Do
Goal
openread (f, ”F.dat” ), readdevice (f), do, closefile (f).
Clauses
Do: - eof (f);
readln (Y), write(Y), do.
Процедура виконує дії:
відкриває файл для читання послідовним методом доступу;
призначає вхідний потік на файл;
читає компоненти до введення ознаки кінця файлу;
виводить компоненти на екран;
закриває файл.
Дозапис файлу послідовним методом доступу
Предикат openappend (Символічне ім'я, Ім'я_файлу_в_ОС) – використовують для дозапису файлу послідовним методом доступу. Покажчик в файлі установлюється на кінець файлу (ознаку eof).
Наприклад: openappend (f, ”F.dat” )
Дії, що виконуються при до запису аналогічні діям при запису у файл.
Робота з файлом прямим методом доступу
Відкриття файлу для прямого методу доступу
Предикат openmodify (Символічне ім'я, Ім'я_файлу_в_ОС) використовують для відкриття файлу прямим методом доступу, як для запису, так і для читання.
Файл повинен існувати. Тому, якщо файл не існує, перед відкриттям файлу для прямого методу доступу треба зробити порожній файл. Нижче подано приклад утворення порожнього файлу.
Domains
file = f
Predicates
Do
Goal
Do.
Clauses
do:- openwrite (f, ”F.dat”), closefile(f), openmodify(f, “F.dat”),….
Файл, що існує при відкритті для прямого методу доступу, не перезаписується.
Встановлення покажчика файлу для прямого доступу до компоненти
При прямому методу доступу до компонент файлу використовують стандартний предикат filepos.
Стандартний предикат filepos дозволяє встановити покажчик в певне місце файлу, щоб читати дані з цього місця або писати дані в це місце.
filepos (Символічне ім'я файлу, Покажчик, Точка відліку)
Режими роботи предикату:
( i, i, i) – встановити покажчик
(i, o, i) – одержати поточний покажчик
(symbol, long, integer)
Точка відліку може приймати значення:
0 – точка відліку покажчика початок файлу
1 – точка відліку покажчика поточний покажчик
2 – точка відліку покажчика кінець файлу.
Для режиму 2 покажчик, який не дорівнює 0 вказує на байт поза файлом. Рахунок байтів зліва на право.
Читання компоненти файлу прямим методом доступу
Розглянемо на прикладі програми, які дії виконують при читанні компоненти файлу прямим методом доступу.
Завдання: Прочитати 31 символ файлу прямим методом доступу і вивести його на екран.
Do: - openmodify(f, “F.dat”), readdevice(f),filepos (f, 30, 0), readchar (C),
write(C), closefile(f).
Процедура виконує дії:
відкриває файл для прямого методу доступу;
призначає вхідний потік на файл;
встановлює покажчик у необхідні позицію;
читає символ;
виводить символ не екран;
закриває файл.
Покажчик встановлюється на 31 байт файлу(рахунок ведеться з нуля).
Запис компоненти у файл прямим методом доступу
Розглянемо на прикладі програми, які дії виконують при запису компоненти у файл прямим методом доступу.
Завдання. Записати у 21 байт файлу прямим методом доступу символ ‘Y’. Файл не існує.
Do:- openwrite(f, “F.dat”), closefile(f), openmodify(f, “F.dat”), writedevice(f),filepos (f, 20, 0), write(‘Y’),closefile(f).
Процедура виконує дії:
Процедура утворює порожній файл:
Відкриває файл для запису послідовним методом доступу;
Закриває файл.
Відкриває файл для прямого доступу;
призначає вихідний потік на файл;
Утворює 20 байтів з пропусками і встановлює покажчик після 20 байту для запису;
Записує символ в файл;
Закриває файл.
На файл відкритий для прямого методу доступу можна призначати вхідний і вихідний потоки для читання і запису одночасно.
Предикат filepos можна використати для знаходження довжини файлу в байтах.
Завдання. Визначити довжину файлу в байтах.
do:-openmodify(f,“f.dat”),readdevice(f),
filpos(f,0,2),filpos(f,D,0),write(D),closefile(f).
Процедура виконує дії:
Відкриває файл для прямого доступу;
Призначає вхідний потік для читання;
Перший предикат filepos встановлює покажчик на останній байт файлу включаючи керуючі символи;
Другий предикат filpos визначає на якій відстані в байтах стоїть перший символ файлу відносно початку, тобто довжину файла в байтах;
Виводить довжину на екран;
Закриває файл.