Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
48
Добавлен:
05.03.2016
Размер:
1.28 Mб
Скачать

3.7 Цілісність і несуперечність баз даних і знань

При виконанні п.4 завдання 2 ми визначили, що в Козлова тільки один колега – Петренко, зв’язаний з ним спільною працею. Разом з тим у Петренка крім Козлова є ще два колеги, що зв'язані з ним спільною працею.

Але з цих двох посилань і наших представлень про поняття колеги стає зрозумілим, що Козлов працює в тому ж відділі, що і Петренко. А якщо це так, то відповідно, має більш одного колеги, на відміну від відповіді системи. Тобто системи самостійно не може дійти такого висновку.

А на запит work(„Козлов”, Оffice) система взагалі дасть негативну відповідь. В наявності суперечливість даних. Частково виправити ситуацію можна, якщо до визначити предикат work у такій редакції

work(Man_1, N):- unite(Man_1, Man_2, labour), work(Man_2, N).

Тоді на запит про номер відділу де працює Козлов і його колег система буде давати більш точні відповіді. Але в базі work() відсутні дані про Козлова у вигляді фактів, тобто в явному виді. Отже після нашого до визначення ця база стала не зовсім явної, тому що частина даних зберігається в явному виді, а частина виведена з інших на основі правил. У першому наближенні – це вже прообраз бази знань. Таким чином повний текст програми матиме вигляд:

/* програма 3.3 */

domains

name,firm=symbol

office=integer

object=labour; hobby(name); project(name,firm)

predicates

work(name, office)

colleague(name, name)

unite(name, name, object)

all_colleague(name, name, object)

clauses

colleague(Man1, Man2) :- work(Man1, X), work( Man2, X), Man1<>Man2.

all_colleague(X, Y, Z):- colleague(X,Y), Z=labour.

all_colleague(X, Y, Z) :- unite(X, Y, Z).

all_colleague(X, Y, Z) :- unite(Y, X, Z).

unite(„Возняк”, „Денега”, labour ).

unite(„Петренко”, „Скрипник”, project("New system",ics)).

unite(„Козлов”, „Петренко”, labour).

unite(„Савюк” , „Петренко”, hobby(sport)).

work(„Грищенко”, 101).

work(„Кардаш”, 111).

work(„Петренко”, 101).

work(„Скрипка”, 101).

work(Man1, N):-unite(Man1, Man2, labour), work(Man2, N).

3.8. Зміст звіту по лабораторній роботі

Звіт по лабораторній роботі повинний містити:

1 Текст програми з набором фактів, що застосовується при запитах.

2 Результати виконання завдання 1 і 2 даної лабораторної роботи.

3. Індивідуальне завдання згідно додатку 3.

4. Визначте склад явних і неявних баз, що використовуються у програмі згідно індивідуального завдання та опишіть їх структуру.

Лабораторна робота №4. Керування ходом виконання програм у системі Турбо-Пролог

Ціль роботи:

1. Познайомитися з процесами уніфікації і пошуку з поверненням.

2. Вивчити правила уніфікації термів.

3. Вивчити роботу системи Турбо-Пролог при виконанні запиту.

4. Ознайомитися з методом відкату після невдачі.

4.1 Робота системи Турбо-Пролог при виконанні запитів

Запит до системи – це завжди послідовність, що складається з однієї або декількох цілей. Для відповіді на запит система намагається досягти всіх цілей, тобто показати, що твердження, що міститься в запиті, істинні в припущенні, що всі відношення в програмі істинні. Іншими словами, досягти мети – це показати, що вона логічно випливає з фактів і правил програми, а якщо в запиті є змінні, то ще і конкретизувати їх, тобто знайти ті конкретні об'єкти, що, якщо їх підставити замість змінних, забезпечать досягнення мети.

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

При поступленні запиту система переглядає всю програму в пошуках першої пропозиції, заголовок якої буде уніфікуватися з запитом. Для того, щоб запит і заголовок пропозиції уніфікувалися між собою, необхідно:

– збіг у них імені предиката;

– збіг кількості аргументів предиката;

– можливість уніфікації всіх аргументів предиката (правила уніфікації термів приведені нижче).

Якщо було виявлено пропозиція, що уніфікується з запитом, то вона починає оброблятися:

– якщо тіло пропозиції є порожнім (тобто це факт), то запит відразу виявляється успішним, змінні запиту конкретизуються об'єктами факту, і це рішення позначається покажчиком повернення.

– якщо тіло пропозиції містить підціли, то, послідовно зліва на право, кожна з них обробляється так само, як вихідний запит.

Якщо система в тексті програми не знаходить пропозиції, що уніфікується з запитом, то вона:

– повернеться до останньої успішно доведеної підцілі;

– ліквідує конкретизацію всіх змінних, що були результатом успішної обробки цієї підцілі, тобто робить змінні знову вільними;

– приступає до пошуку в множині пропозицій поточної програми, заголовка іншої пропозиції, що уніфікується з даної підціллю.

Така процедура обробки запиту одержала назву пошук з поверненням. Застосовуючи її, при успішному виконанні запиту система видає:

– або значення всіх змінних, що входять до складу запиту;

– або слова “так” або “ні”, якщо змінні в запиті були відсутні.

Якщо запит був сформований як зовнішня мета рішення задачі, то система після знайденої першої відповіді повернеться в точку, позначену покажчиком повернення і пробує знайти іншу відповідь.