Page 12 - 4800
P. 12
Перелік і призначення стандартних предикатів наведений у додатку А.
Однак найчастіше метою є складний запит до програми. Для доведення якої-
небудь складної мети Пролог повинний довести всі його підцілі, створивши при цьому
необхідну множину зв'язаних змінних. Якщо ж одна з підцілей помилкова Пролог
повернеться назад і перегляне альтернативні рішення попередніх підцілей, а потім
знову піде вперед, але з іншими значеннями змінних. Цей процес називається „пошук з
поверненням”.
1.3.5 Секція database
Ключове слово database вказує на початок послідовності описів предикатів
динамічної бази даних. Динамічна база даних є базою, у яку факти додаються під час
виконання програми. Вимоги до описів предикатів такі ж, як і в секції predicates.
Факти, що належать динамічній базі даних, обробляються відмінним від звичайних
предикатів чином для того, щоб прискорити роботу з БД великого обсягу. Факти
динамічної бази можуть модифікуватися протягом сеансу роботи, завантажуватися з
дискового файлу за допомогою стандартного предиката consult або записуватися в
дисковий файл за допомогою предиката save.
1.4 Розробка найпростішого інтерфейсу програми
Формування внутрішньої мети програми вимагає від користувача не тільки
завдання запиту, але і забезпечення відображення його результатів на екрані. Тому
необхідно змінити мету, додавши ще одну підціль, що забезпечує відображення терму
на екрані дисплея:
goal
likes(Who,"пиво"), write(Who).
Запустимо на виконання програму, у якій мета являє собою вже кон'юнкцію
двох підцілей. У результаті виконання цієї програми у вікні діалогу видається
повідомлення про один розв’язок,
Петро
Зв'язано це з тим, що при значенні Who="Петро" кожна з підцілей приймає
значення “істина” і вся мета стає істинної, що приводить до закінчення процесу
висновку. Таким чином, при використанні внутрішньої мети шукається тільки перша з
правильних відповідей. Для забезпечення пошуку всіх розв’язків слід скористатися ще
одним вбудованим предикатом fail.
Таким чином, з використанням внутрішньої мети, нашу програму можна
представити в такому вигляді:
/* Програма 1.3 */
domains
person,thing = string
predicates
likes(person,thing)
goal
likes(Who,"пиво"), write(Who), nl, fail. /* ціль */
clauses
likes("Іван","Марія").
likes("Петро","пиво").
likes("Іван",X) :- likes("Петро",X).
Мета рішення складається з чотирьох підцілей, з'єднаних між собою комами,
тобто мета рішення задачі представляється кон'юнкцією підцілей. Мета буде досягнута,
тобто матиме значення "істина" (true), якщо кожна з підцілей буде істинною. Підцілі
даної програми містять один визначений користувачем предикат likes і три вбудованих
стандартних предикати Пролога:
– write(term) – виводить терм на дисплей,
– nl – забезпечує перехід на новий рядок,
– fail – викликає стан невдачі при доведенні цільового твердження.
Включення в мету додаткових підцілей зв'язане з тим, що завдання мети вимагає
від користувача не тільки формулювання запиту, але і забезпечення відображення його
12