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

1.3.4 Секція goal

У секції goal задається внутрішня мета програми. Це дозволяє програмі запускатися незалежно від середовища розробки. Якщо внутрішня мета включена в програму, то Пролог виконує пошук тільки одного першого рішення, і зв'язані з змінними значення не виводяться на екран, якщо не передбачити застосування операторів виводу інформації.

У систему Пролог включене більш ніж 200 вбудованих стандартних предикатів і більше дюжини стандартних доменів. У випадку використання цих предикатів і доменів немає необхідності оголошувати їх у програмі.

Розглянемо приклад програми, у якій задана внутрішня мета і використовується звертання до стандартних предикатів:

/* Програма 1.2 */

predicates

hello (string)

goal

hello (_).

clauses

hello (Name):- write("Please, type your name "), readln(Name), nl, write("Welcome ", Name).

У цій програмі запитується Ваше ім'я, а потім воно виводиться на екран.

Перелік і призначення стандартних предикатів наведений у додатку А.

Однак найчастіше метою є складний запит до програми. Для доведення якої-небудь складної мети Пролог повинний довести всі його підцілі, створивши при цьому необхідну множину зв'язаних змінних. Якщо ж одна з підцілей помилкова Пролог повернеться назад і перегляне альтернативні рішення попередніх підцілей, а потім знову піде вперед, але з іншими значеннями змінних. Цей процес називається „пошук з поверненням”.

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 – викликає стан невдачі при доведенні цільового твердження.

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

Застосування предиката fail викликає стан невдачі при доведенні цільового твердження і перехід до повторного його доведення при інших початкових значеннях.

Предикат hello(person) з програми 1.2, можна використовувати для виводу у вікно будь-яких, визначених у ньому термів, що дозволяє використовувати його як інтерфейс для раніше розробленої програми 1.3. Можливо два варіанти спільного використання предикатів з цих двох програм:

– режим переносу у вихідний модуль описів і визначень предиката шляхом копіювання з іншого файлу;

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]