1. Інтегрованих середовищ мови Turbo Prolog.
2. Структура програми
3. Стандартні типи доменів
4. Прототипи предиката
5. Твердження і цілі
6. Арифметичні вирази.
7. Вбудовані прдікати мови
1. Інтегроване середовище мови Turbo Prolog.
Функціонування Т.Р. вимагає наявність наступних стандартних каталогів:
кореневої Prolog, в якому повинні знаходиться наступні файли:
prolog.exe
prolog.ovl для створення exe файлу
prolog.r тексти повідомлення про помилки
prolog.hlp файл допомоги
prolog.sys конфігурація середовища
prolog.lib бібліотеки
prolog.obj допоміжний файл для створення пользов-їх exe файлів
підкаталог PRO для користувацьких вихідних файлів (розширення. pro)
підкаталог OBJ для користувацьких обьктних і prg файлів
підкаталог EXE для зберігання призначених для користувача exe файлів
підкаталог DOS для команд ОС в тому випадку, якщо передбачається їх використання з користувацьких програм. (Min command.com)
2 Структура програми на TURBO PROLOG
1 Для визначення типів доменів або даних, що використовуються в програмі
2 опис прототипів для користувача предикатів
3 "затвердження" включає опис фактів у вигляді предикатів і правил, тобто декларативних і процедурних знань
4 містить мета вирішення завдань, при його відсутності система запитує мета виконання завдання у вікні діалогу і в цьому-ж вікні отримуємо відповідь, за його присутності в ньому поміщаємо користувальницький інтерфейс.
Місце для друкування
-35 - 36 - 37 -
readint ()
(Integer): (0) - читає ціле число, читання закінчується натисканням
readreal ()
(Real): (0) - вещ.
readchar ()
(Char): (0) - читає одиничний символ
readln () (string): (0) - читає рядок символів
inkey () (char): (0) - закінчується істиною, якщо після попередньої операції була натиснута клавіша, повертається її код. Якщо не була натиснута, то предикат закінчується невдачею
nl - код двох клавіш - перехід на новий рядок
write (x1, x2, ...)
(Змінні і константи): (i, i, ...) - видає на поточний пристрій запису констант і зміст змінних
writef (, x1, x2, ...)
(String,): (i, i, ...)
Структура формату:
"% - M.pw", де% - ознака форматного виведення
якщо заданий "-", то знаки повинні вирівнюватися по лівому краю, якщо не заданий - по правому
m - довжина поля виводу
p - кількість цифр після крапки
w - тип числа, замість w записується f, якщо виводиться число в десятковому вигляді, e - у експотенціальной формі, q - в самому короткому форматі.
Предикати роботи з символьними даними.
str_lon (,)
(String, integer): (i, i) (i, 0)
якщо задано (i, i), перевіряється довжина рядка, якщо (i, 0) - повертається довжина рядка
Перетворення типів
Всі предикатні перетворення діють в обидві сторони. Випадок (i, i) перевіряє істинність для всіх типів, крім real. Перетворення між типами string, symbol і real, integer пр-ся (?) Автоматично.
char_int (,)
(Сhar, integer): (i, 0) (0, i) (i, i)
str_char (,)
(String, сhar): (i, 0) (0, i) (i, i)
str_int (,)
(String, real): (i, 0) (0, i)
і т. д.
Робота з командами операційної системи
Необхідною умовою для роботи з предикатами цієї групи є наявність підкаталогу DOS, в якому б був записаний мінімум command.com
system ()
(String): (i) - передає команду OS
date (,,)
(Integer, integer, integer): (i, i, i) (0, 0, 0) - встановлює, якщо (i, i, i), або повертає, якщо (0, 0, 0) системну дату
time ... - Те ж
dir (,,)
(String, string, string): (i, i, 0) - видаються на екран специфіковані файли з каталогу по маршруту. Можливо вибрати з каталогу ім'я одного файлу за допомогою стрілок керування курсором, при натисканні ім'я цього файлу присвоюється третьому аргументу предиката
Спеціальні предикати мови Turbo Prolog
bouncl () - "істина, якщо змінна є конкретизованої
free () - "істина, якщо змінна не є конкретизованої
fail - завжди помилкові. викликає повернення для перевірки бази в правилах
! - (Cat) - предикат відсікання, обмежує повернення
exit - зупиняє виконання користувацької програми і передає управління меню Turbo Prolog
trace - загальне включення режиму відладки. Вказується на початку вихідної програми
trace ()
(Symbol): (i) (0) - встановлює, якщо i, або повертає, якщо 0, поточний режим відладки. Як статусу можна використовувати on / off. Використання цього предиката припускає наявність trace на початку програми
diagnostics - дозволяє видати аналіз програми в процесі компіляції. Аналіз включає імена використовуваних предикатів. Для кожного імені визначається, чи є аргументи конкретного предиката фактами або вказується конкретність предиката.
nowarnings - відключає попередження в процесі компіляції
project "ім'я файлу" - дана програма є частиною проекту
include "ім'я файлу" - в компіляцію включається файл з вказаним ім'ям
Керування ходом виконання програм на мові ТР.
1. Рекурсія.
У механізм опрацювання програм на мові ТР закладена рекурсія, тобто обчислення значення функції за допомогою тієї ж функції, але зі зміненими параметрами. Рекурсія в ТР реалізується в 2 етапи:
1) вихідна завдання розбивається на більш дрібні приватні задачі і формуються приватні рішення і на основі яких потім буде отримано спільне рішення завдання.
Процес розбиття задачі на підзадачі наз-ся редукцією. Редукція завершується в тому випадку, якщо сформована підзадача, яка може бути вирішена безпосередньо.
2) складання рішення, починаючи від самого (?) Останнього до самого загального. Для використання рекурсії в програмах необхідно використовувати наступний формат правила рекурсії:
if
(1)
(2)
(3)
(4)
(5)
У структурі правила компоненти (1), (3), (5) можуть бути присутніми або бути відсутнім з урахуванням специфіки розв'язуваної задачі. Компоненти (2), (4) обов'язкові, так як вони організовують апарат активізації правила рекурсії. Зазвичай компонента (1) - це предикати, які не впливають на рекурсію. Компонента (3) містить предикати, за допомогою яких формуються нові значення аргументів, які беруть участь у рекурсії, а (5) включає предикати, які формують за допомогою апарату рекурсії шукані значення. (5) - складання рішення. (2) - використовується для зупинки рекурсії, а (4) - реалізує повторний виклик рекурсивного правила для нових значень аргументу. У залежності від заданих граничних умов розрізняють спадну і висхідну рекурсію.
Приклад.
Визначення n-го терма послідовності 1, 1, 2, 6, 24, ...
N 0 1 2 3 4 ...
0 терм = 1 3 терм = 2 * 3
1 терм = 1 * 4 січні терм = 6 * 4
2 терм = 1 * 2 травня терм = 24 * 5
Для позначення того факту, що n-й член послідовності дорівнює V, вводиться предикат наступного виду: posl (N, V)
Фрагмент програми:
domains
N, V = integer
divdicates
posl = (N, V)
clauses
posl (0, 1)
posl (N, V) if
1) N> 0
2) M = N-1
3) posl (M, U)
4) V = U * N
goal
posl (3, x)
Рішення задачі проводиться в 2 етапи:
I етап.
1. Спроба задовольнити запит користувача, використовуючи перше твердження в розділі clauses (posl (3, x) зіставляється з posl (0, 1)). Так як 0 не зіставляється з 3, то спроба завершується невдачею. Після цього posl (3, x) зіставляється із заголовком 2-го затвердження posl (N, V). Звідси N отримує значення 3, а V зв'язується з х і система переходить до доказу підцілі в тілі правила:
1) N> 0 узгоджується при N1 = 3
2) M1 = N1-3 узгоджується при N1 = 3 і M1 = 2
3) posl (2, U1) призводить до другого рекурсивному поводження і так як це звернення не узгоджено з першим, то останнє твердження (V = U * N) відкладається.
2. Узгодження posl (2, U1) з posl (0, 1) призводить до невдачі. Відбувається зіставлення з заголовком 2-го твердження, що закінчується успіхом, при цьому N2 = 2 і V = U1. відбувається доказ за метою цього твердження:
1) узгоджується при N2 = 2
2) узгоджується при N2 = 2 і М2 = 1
3) posl (1, U2) призводить до повторного рекурсивному зверненням
4) відкладається
3. Узгодження posl (1, U2) з posl (0, 1) призводить до невдачі. Зіставлення із заголовком 2-го затвердження закінчується невдачею, при N3 = 1 і V = U2. Відбувається доказ за метою цього твердження:
1) узгоджується при N3 = 1
2) узгоджується при N3 = 1 і М3 = 0
3) posl (0, N3) призводить до повторного рекурсивному зверненням.
Отримане цільове твердження зіставляється з першим цільовим твердженням posl (0, 1), при цьому U3 отримує заначеніямі 1.
На цьому етап розбиття закінчується.
II. Етап складання рішення.
Проводиться спроба узгодження самого останнього з відкладених цільових тверджень, якщо це вдається, то проводиться узгодження передостаннього цільового твердження, і так до самого першого з відкладених, тобто запиту.
1) U2 = U3 * 1, так як U3 = 1 то U2 = 1
2) U1 = U2 * 2 U1 = 2
3) X = U1 * 3 X = 6
2. Повернення і відсікання.
У процесі реалізації запиту інтерпретатору мови необхідно аналізувати безліч фактів і правил, к-які витягуються в процесі декількох переглядів відповідних баз фактів. При цьому в процесі одного перегляду формується часткове вирішення. Процес в PROLOGе виконується автоматично шляхом позначки або заповнення тих модулів, к-які аналізувалися перед поточної метою, з тим, щоб виключити отримане приватне рішення з дальнейнего розгляду. Цей механізм у PROLOGе наз-ся поверненням і реалізується через використання стандартного предиката fail, к-рий завжди має значення "брехня". Цей предикат змушує інтерпретатор проаналізувати ще раз базу фактів, щоб виконати більше цільове твердження для інших значень змінних. Він дозволяє отримати в базі всі можливі рішення.
ПРИКЛАД:
domains
p, T = symbo L
divdicat s
like (P, T)
poleg (T)
dauses
like ("Іванов", "пиво").
like ("Іванов", "сік").
poleg ("cok ")...
otv if
like (P, T) and
poleg (T), nl,
write (P),
fail.
goal
otv.
Для управління процесом виконання програм у PROLOG є вбудований предікей cut, кіт. кодується в turbo-PROLOG як!. Основне призначення - зупинка процесу повернення, тобто припинення вироблення подальших рішень.
Цей процес у Пролозі зв. ВІДСІКАННЯМ. Найчастіше предікей cut використовується спільно з fail.
ПРИКЛАД
.
.
.
goal
like (P, T)
T = "кефір",
nl,
write ("любитель кефіру знайдений")
!.
fail
Відсікання використовується для усунення нескінченних циклів (див. перед. Приклад):
clauses
posl (0,1) if!
posl (N, V) if
M = N-1
posl (M, U)
V = U * N
Відсікання також використовується для пристрої. взаємовиключних тверджень.
ПРИКЛАД
ball (M, 'A ") if M> so,!
ball (M, "B") if M <so an M> 60,!.
so an M>