
- •Логічне програмування
- •Логічне програмування
- •7.080403 - “Програмне забезпечення автоматизованих систем”
- •Лабораторна робота № 1. Пролог - мова логічного програмування.
- •1.1.Загальний огляд мови Пролог.
- •1.2.Переваги і недоліки мови Пролог.
- •1.3.Числення предикатів - математична основа мови.
- •1.4.Побудова теорії деякої області знань.
- •1.5.Від формальної логіки до логічного програмування.
- •1.6.Механізм логічного виведення і керування пошуком.
- •Лабораторна робота №2 основні концепції прологу
- •2.1.Факти та правила.
- •2.2.Як змінні отримують свої значення.
- •2.3.Анонімні змінні.
- •2.4.Складні цілі: кон`юнкція та диз`юнкція.
- •2.5.Способи Співставлення.
- •Лабораторна робота № 3 структура програми pdc прологу
- •3.1.Основні розділи програми.
- •3.2 Стандартні домени.
- •3.3.Синтаксис правила.
- •3.4.Директиви комп`ютеру.
- •3.5.Бектрекінг.
- •3.5.1.Бектрекінг з внутрішньою ціллю.
- •Лабораторна робота № 4 контроль пошуку рішень
- •4.1.Використання предикату fail.
- •4.2.Відміна бектрекінгу.
- •1.Коли ви знаєте попередньо, що певні варіанти ніколи не дадуть поштовху в знаходженні розв'язку, тоді використання cut(зелений cut) відкидає перегляд альтернативних шляхів.
- •2.Коли логіка програми потребує використання cut для відкидання перегляду альтернативних підцілей, тоді його називають червоним відтинанням.
- •4.3.Предикат not - заперечення як неуспіх.
- •4.4.Труднощі у використанні відтинання і заперечення.
- •4.5.Засоби керування.
- •4.6.Узагальнення.
- •Лабораторна робота №5. Прості та складні об'єкти.
- •5.1 Прості дані.
- •5.1.1. Константи як об'єкти даних.
- •5.2.Складні об'єкти даних і функтори.
- •5.2.1.Уніфікація складних об`єктів.
- •5.2.2.Приклад застосування функторів.
- •5.3.Приклад використання складних об'зктів.
- •5.4.Опис доменів складних об'єктів.
- •5.5.Багаторівневі складні об'єкти.
- •5.6.Приклад, який ілюструє задання структури речення англійської мови.
- •5.7.Опис змішаних складних об'єктів.
- •5.7.1.Аргументи, які можуть мати різний тип.
- •5.7.2 Cписковий тип.
- •5.8.Порівняння складних об`єктів.
- •5.9.Узагальнення.
- •Лабораторна робота №6. Ітерація і рекурсія.
- •6.1.Реалізація ітераційного процесу за допомогою бектрекінгу.
- •6.2.Дії типу до і після.
- •6.3.Застосування бектрекінгу для реалізації циклів.
- •6.4.Рекурсивні процедури.
- •6.5.Використання аргументів в якості параметрів циклу.
- •Лабораторна робота №7 рекурсивні структури даних
- •7.1.Структура даних типу дерева.
- •7.2.Обходи дерева.
- •7.3.Створення дерева.
- •7.4.Бінарний пошук на дереві.
- •7.5. Сортування по дереву.
- •7.5.1 Програмна реалізація лексикографічного впорядкування при символьному вхідному потоці.
- •Лабораторна робота № 8 робота з списками в пролозі
- •8.1.Рекурсивна сутність списку.
- •8.2.Обробка списків.
- •8.2.1.Друк списків.
- •8.2.2.Підрахунок кількості елементів.
- •8.2.3.Іще один варіант підрахунку довжини списку.
- •8.2.4.Модифікація списку.
- •8.2.5.Належність елемента списку.
- •8.3.Використання одного й того ж предикату для вирішення різних задач.
- •8.4. Знаходження зразу всіх розв`язків.
- •8.5.Складні списки.
- •8.6.Реалізація синтаксичного аналізу за допомогою списків.
- •Лабораторна робота №9 техніка програмування в пролозі
- •9.1.Принципи побудови експертної системи.
- •9.2. Макетування: задача маршрутизації.
- •9.3.Пригоди в дивних печерах.
- •9.4. Моделювання апаратних засобів.
- •9.5.Задача про ханойські башні.
- •9.6.Ділення слів на склади.
- •9.7. Задача про n королев.
- •Лабораторна робота №10 особливі технічні прийоми для професіоналів
- •10.1.Потоковий аналіз.
- •10.2.Керування потоковим аналізом.
- •10.3. Стиль програмування.
5.4.Опис доменів складних об'єктів.
В цій секції ми покажемо як визначаються домени для складних об'єктів.
Після компілювання програми, яка містить наступні відношення:
owns(john,book('From Here to Eternity','james Jones')).
і
owns(john,horse(blacky)).
ми можемо системі задати запит goal:owns(john,X).
Змінна X після цього може бути зв'язана з різними типами об'єктів: книгою, конем, або ж можливо іншим об'єктом, який ви визначили. Це випливає із нашого визначення предикату owns. Тому нам не бажане старе використання предикату:
owns (symbol,symbol).
Замість нього ми мусимо сформулювати нове визначення предикату, наприклад:
owns(name,articles)
Зараз, ми можемо описати об'єкт articles в секції domains наступним чином:
domains
articles=book(title,author);
horse(name)
title,author,name=symbol
Крапка з комою читається тут як "або". В цьому випадку можливі альтернативи: книга може ідентифікуватись назвою і автором; або ж кінь ідентифікується своєю кличкою. Всі об'єкти title , аuthor, name є стандартними, символьного типу.
До опису об'єктів може бути добавлено і більше альтернатив. Наприклад, articles може бути судновою книгою, або ж банківською книгою. У випадку суднової книги можемо використати функтор без аргументів, банківську книгу можемо описати як bankbook(balance). В цьому випадку об'єкт articles може бути описаний:
articles =book(title,author); horse(name); boat; bankbook(balance)
title,author,name = symbol
balance =real
Далі приведемо повну програму, яка демонструє використання в фактах, що описуються предикатом owns, складного об'єкту типу articles:
domain
articles = book(title, author) ;
horse(name) ;
boat ;
bankbook(balance)
title, author, name = symbol
balance = real
predicates
owns(name,articles)
clauses
owns(john, book("A friend of the family", "Irwin Shaw")).
owns(john, horse(blacky)).
owns(john, boat).
owns(john, bankbook(1000)).
Тепер відкомпілюємо нашу програму. Коли ми задамо системі запит:
goal: owns(john,Thihg).
Вона видасть чотири рішення:
Thing = book('A friend of the family','Irwin Shaw')
Thing = horse(blacky)
Thing = boat
Thing = bankbook(1000')
4Solutions
Таким чином, опис домену складного об'єкту в загальному має такий вигляд:
domain object= alter1(D,D,...);
alter2(D,D,...);
...
де alter1 і alter2 довільні, але різні функтори. Позначення (D,D,...) задає список імен доменів, які або ж описані десь в іншому допустимому місці, або ж мають один із стандартних типів. Відмітимо наступне:
1. Альтернативи розділяються крапкою з комою.
2. Кожна альтернатива має функтор і можливо список доменів для відповідних аргументів.
5.5.Багаторівневі складні об'єкти.
Пролог дозволяє нам конструювати складні об'єкти на декількох рівнях. Наприклад, в предикаті
book('The Ugly Duckling'.'Andersen')
замість використання прізвища автора, ми хочемо використати нову структуру, яка більш детально описує автора, включаючи до попередньої інформації ще й ім'я. Для виклику функтору результуючого нового складного об'єкту, ми повинні змінити базовий опис книги:
book('The Ugly Duckling',author('Hans Christian','Andersen'))
В старому описі об'єкту:
book(title,author)
другий аргумент функтору book є author. Але старий опис
author = symbol
може тільки включати просте ім'я, тому його не можна застосовувати.
Ми повинні зараз специфікувати, що author є складним об'єктом, який включає ім'я та прізвище:
author(first_name,last_name)
Котре вимагає наступний опис:
domains
articles = book(title, author) ;
horse(name) ;
boat ;
bankbook(balance)
author = author(first_name,last_name)
title, author, name = symbol
balance = real
Коли використовуються складні об'єкти різного рівня, їх зручно зображати у вигляді дерева.
book
/ \
title author
/ \
/ \
firstname lastname
Речення домену описує тільки один рівень дерева, а не все дерево. Наприклад, книга з нашого прикладу не може бути описана наступним чином.
book=book(title,author(firstname,lastname))