Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Логическое программирование1 / 1-3_ЛР_4КСМ_Логічне_прогр._2014-15.doc
Скачиваний:
20
Добавлен:
07.02.2016
Размер:
396.8 Кб
Скачать

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).

/***** кінець програми *****/