Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекц по Visual Prolog.doc
Скачиваний:
4
Добавлен:
02.05.2019
Размер:
937.47 Кб
Скачать

2.7. Статична та динамічна бази даних

Факти і правила, які описано в секції Predicates, називають статичною базою даних. Такі твердження компілюються в бінарний код і їх не можна змінювати під час роботи програми.

Visual Prolog дозволяє також завантажувати факти з текстового файлу, додавати або вилучати їх під час роботи програми. Для зміни факту внутрішньої бази даних його вилучають і замінюють іншим. Такі факти називають внутрішньою базою даних або динамічною базою даних.

Факти внутрішньої бази даних описують в секції Facts. Ці факти використовуються так само, як факти статичної бази даних.

Завантаження фактів під час роботи програми дозволяє економити оперативну пам’ять і прискорювати роботу програми, тому що можна завантажувати тільки ті факти, що необхідні в певний час. Завантаженою внутрішньою базою даних можуть користуватися всі програми, що виконуються під час одного сеансу Visual Prolog.

2.8. Підготовка фактів для внутрішньої бази даних

Внутрішня база даних Visual Prolog повинна містити тільки факти. Факти можна розташувати в секції Clauses або підготовити текстовим редактором у файлі, окремо від програми. Їх утворюють за наступними правилами:

  • Кожний факт розташовується в окремому рядку. Факти повинні відображуватися тільки в тому форматі, в якому записує в файл предикат Save.

  • Факти, що утворені одним предикатом, повинні розміщатися підряд.

  • Факти можуть мати великі букви тільки усередині рядкових даних.

  • Факти можуть мати пропуски тільки усередині рядкових даних.

  • Факти не можуть мати константи типу symbol.

  • В файлі не можна розміщувати коментарії.

  • Файл не може мати порожніх рядків.

Наприкінці факту крапка не обов’язкова.

2.9. Опис фактів внутрішньої бази даних

Факти, що завантажуються динамічно, описуються в секціях Facts. У програмі на Visual Prolog може бути одна неіменована секція Facts і декілька іменованих секцій Facts. Ідентифікатори іменованих секцій обирає програміст. По замовчанню ім’я неіменованої секції Facts dbasedom.

Опис фактів в секції Facts має такий же синтаксис як в секції Predicates. Секції Facts розташовують за принципом: опис об’єкту записується перед застосуванням об’єкту.

Розглянемо приклади опису фактів.

Приклад неіменованої секції Facts:

Domains

nazva = char

koord_x, koord_y = integer

Facts

koord(nazva, koord_x, koord_y)

rast(real)

Приклад іменованої секції Facts:

Facts – figura

Krug(integer, real)

Kvadrat(integer)

Ім’я іменованої секції записується за правилом ідентифікатору.

В одній і тій же секції Facts може бути об’явлено скільки завгодно предикатів. Факти, що об’явлені в секції Facts, можуть розміщуватися в одному файлі або різних файлах.

На роботу стандартних предикатів, які працюють з динамічною базою даних впливають ключеві слова nondeterm, determ, single.

Кожний предикат, який описано в секції Facts, по замовчанню вважається nondeterm (не детермінованим), тобто за допомогою предикату можна записати більше одного факту. Для таких предикатів компілятор вказує, що предикат може бути декілька розв’язків. Ця інформація використовують при роботі механізмів Прологу.

Якщо користувач бажає вказати, що для предикату буде існувати не більше одного факту (0 або 1), то вказують:

Facts

determ sum (real)

Пролог контролює такі факти і не дозволяє заносити другий такий факт.

Для вказівки, що з предикатом буде існувати один і тільки один факт, то вказують:

Facts

single dobutok (real)

Факт з ознакою singl не можна вилучати. Пролог контролює цю помилку на етапі компіляції, тому факт розташовують в секції Clauses при написанні програми(ініціалізація факту). Виклик такого факту завжди істинний, якщо його аргументи вільні змінні. Такий факт можна змінювати за допомогою предикатів assert, assertz, asserta, consult. Вказані предикати вилучають предикат і вставляють новий.

Функтори предикатів в межах одного модуля не повинні повторюватися. Тобто, в двох різних секціях Facts не можна вказувати один функтор. Не можна також вказувати один функтор в секціях Predicates i Facts.

Якщо програма складається з декількох модулів, то неіменована секція Facts повинна бути глобальною: Global Facts. Ця вимога не потрібна при застосовуванні під час компіляції утиліти Test Goal.