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