- •Лабораторна робота 1
- •1 План виконання лабораторної роботи
- •2 Основні теоретичні відомості
- •2 Контрольні питання
- •4 Індивідуальні контрольні завдання
- •Лабораторна робота 2
- •2.2. Інструментальне середовище розробника мови Пролог
- •2.2.1. Особливості реалізацій мови Пролог
- •2.2.2. Типові програми для опановування інструментального середовища розробника мови Пролог
- •4. Контрольні питання
- •5. Контрольні завдання
- •5.1. Загальні контрольні завдання
- •5.2. Індивідуальні контрольні завдання
- •Лабораторна робота 3
- •1 План виконання лабораторної роботи
- •2 Основні теоретичні відомості
- •2.1. Основи логічного програмування мовою Пролог
- •2.2. Використання правил у запитах до Пролог-програм
- •2.3. Розміщення предикату not у конструкціях правил Пролог-програм
- •2.4. Робота зі складеними об'єктами у Пролог-програмах
- •2.5. Методичні рекомендації до опрацьовування контрольних питань і виконання контрольних завдань лабораторної роботи
- •3. Контрольні питання
- •4. Завдання для самоперевірки
- •5. Контрольні завдання
- •5.1. Контрольне завдання 1
- •5.2. Контрольне завдання 2
- •6. Література
- •Вимоги до оформлення, захисту та оцінювання лабораторних робіт
- •Зразок оформлення титульного аркуша звіту про виконання лабораторної роботи
2.2. Використання правил у запитах до Пролог-програм
У попередніх прикладах Пролог-програм ви використовували цілі, що містили твердження, подібні до тих, які зустрічалися в програмі.
Але зазначені цільові твердження забепечують тільки одну з багатьох можливостей здійснення запитів до програми. Зокрема:
– оскільки запити будуються з предикатів, які містять умови для обмеження шляхів пошуку бажаних результатів, і найчастіше виникає необхідність повторювати запити декілька разів, то розумно передбачити можливість не задавати кожного разу одні й ті ж умови, що є втомлюючим;
– у процесі отримання відповідей на запити до бази даних, вважається за доцільне не використовувати фактів із цієї бази даних для формування запитів.
У Пролозі поставлена вище задача розв`язується конструюванням правил, які не містять у собі даних (правил нульової арності), тобто зводиться до написання скороченого варіанту запиту.
Розглянемо програму "Родичі" (лістинг 3) в якості прикладу, що наявно демонструє доцільність застосування правил, які не містять у собі даних.
Ціллю програми "Родичі" є предикат who_is_the_sister.
Оскільки ціль who_is_the_sister задаєтся у вигляді правила, то точка входу розділу goal являє собою єдине цільове твердження без підцілей.
Для підтримки реалізації цілі, програма "Родичі" містить правило, що задає предикат who_is_the_sister. Указане правило визначається в розділі тверджень (тобто в розділі clauses) програми.
Тіло правила who_is_the_sister складається з двох частин: 1) першою частиною є правило sister; 2) другою частиною (передпосилкою) є предикат write, що виводить результати, отримані правилом sister.
Трьох предикатів передпосилки правила sister повністю достатньо для отримання потрібного результату: наявність предикату female дозволяє вибрати дитину жіночої статі; подвійне використання предикату parents встанавлює логічний зв`язок між змінними Sister і Brother, які є аргументами двох різних реалізацій даного предикату.
/* Лістинг 3 */
/* Програма: “Родичі” */
domains /* ДОМЕНИ (ОПИСИ ТИПІВ ОБ`ЄКТІВ) */
person = symbol
predicates /* ПРЕДИКАТИ (ОГОЛОШЕННЯ ВІДНОСИН МІЖ ОБ`ЄКТАМИ) */
male(person)
female(person)
parents(person, person, person)
sister(person, person)
who_is_the_sister
goal /* ЦІЛЬ – ФОРМУЛЮВАННЯ ЗАДАЧІ */
/* НА ОТРИМАННЯ ІНФОРМАЦІЇ З БАЗИ ЗНАНЬ, */
/* ЯКУ ПОВИННА РОЗВ`ЯЗАТИ ПРОЛОГ-ПРОГРАМА */
who_is_the_sister.
clauses /* ТВЕРДЖЕННЯ (ФАКТИ ТА ПРАВИЛА) */
/* ФАКТИ */
male("Frank"). /* Френк – чоловічої статі */
male("Sam"). /* Сем – чоловічої статі */
female("Mary"). /* Мері – жіночої статі */
female("Debbie"). /* Дебі – жіночої статі */
parents("Sam", "Frank", "Mary"). /* Батьками Сема є Френк і Мері */
parents("Debbie", "Frank", "Mary"). /* Батьками Дебі є Френк і Мері */
/* ПРАВИЛА */
/* правило, що задає предикат who_is_the_sister */
who_is_the_sister if
sister(Sister, Brother),
write(Sister, " is the sister of ", Brother, "."),
nl.
/* правило, що задає відносину «брат-сестра» */
/* (у формулюванні правила нема жодних даних про конкретну сім`ю: */
/* об`єкти Sister, Brother, Father і Mother є змінними) */
sister(Sister,Brother) if
female(Sister),
parents(Sister, Father, Mother),
parents(Brother, Father, Mother).
/***** кінець програми *****/