Prolog структура програми, факти в Пролог, цілі та запити
лабораторні роботи та завдання з програмування та інформатики, еге з інформатики


Prolog урок 2. Бази фактів, цілі та запити
Нормальна форма Бекуса-Наура
Отже,в БНФ прийнято такі позначення:
Символ ::= читаний як«за визначенням» («це», «є»). Зліва від символу розташовується поняття, що пояснюється, справа - конструкція, що роз'яснює. Наприклад,
Частини висловлювання, що використовуються для позначення синтаксичної конструкції мови, беруться до кутових дужок; у прикладі це і .
Символ означаєлогічне «або» і застосовується для поділу різних рівнозначних альтернативних пояснень поняття, що визначається.
Використовуючи цей символ, можна, наприклад, визначити десяткову цифру:
Якщо частина конструкції укладена квадратні дужки [] , це означає, що вона є необов'язковою, тобто. може бути відсутнім.
говорить про те, що ціле число можна пояснити як позитивне ціле число, перед яким може стояти знак мінус (а може не стояти).
Символ * вказує на те, що синтаксична конструкція, що стоїть перед ним, може повторюватися довільну кількість разів (починаючи з нуля і вище). Замість символу * іноді використовуються фігурні дужки ( ), по суті, рівнозначні йому.
Знову визначимо позитивне ціле число, використовуючи нотацію БНФ:
Що означає, що позитивне ціле число складається з однієї чи кількох цифр.
Структура програми мовою Prolog
Стандартна програма мовою Prolog складається знаведених розділів :
-
Constants
Необов'язковий розділ визначення констант.
Domains
Розділ опису доменів (аналогічний описутипів даних).
Розділ опису предикатів (аналогічний розділу опису процедур та функцій); по суті є шаблоном написання фактів у розділі Clauses.
Clauses
Твердження (аналог: тіло основної програми).
Goal
Цільове твердження – «мета».
domains a=symbol predicates likes (a,a) clauses likes (mary,apples).
Перейдіть у вікно Dialog (меню Run) і введіть запит:
В результаті у вікні має з'явитись відповідь true
Факти та правила
Часто програму, написану на Пролозі, називають базою знань.
Пропозиції-правила мають вигляд:
Де A – це заголовок чи голова речення, а B1. Bn – це тіло.
Факт зазвичай стверджує, що між об'єктами виконано деяке відношення іскладається з :
- відносини
- об'єкта або об'єктів, укладених у круглі дужки (аргументи)
- завершується точкою (.)
Приклад факту:
likes (bill, dogs).
де likes - факт bill, dogs - аргументи факту, між якими виконано відношення (likes)
Т.к. Відношення в математичній логіці прийнято називатипредикатами, то й ми іноді використовуватимемо поняття «предикат» замість «факту» або «правила».
Якщо факт складається тільки з заголовка, то можна сказати, що факт - це пропозиція, у якої тіло порожнє.
Аргументом факту чи предикату може бути константа, змінна чи складовий об'єкт; від їхнього числа залежить так звана місцевість (n-місцевість) факту.
Відмінність константи від змінної: константа отримує своє значення розділ описи констант, тоді як змінна ініціалізується у процесі роботи програми.
У наступному прикладі наводьтекурсор на частини конструкцій, і з'явиться підказка:
likes (bill, dogs). - Біл любить собак. bird (vorobej). Птах – горобець.
Таким чином, у прикладі likes це ім'я двоаргументного предикату (факту), у якого рядкова константа bill є першим аргументом, а dogs другим аргументом.
domains a=symbol b=integer predicates age(a,b) clauses age(. ). . (.). . (.).
Наберіть код програми у компіляторі.
Мета - це формулювання завдання, яке програма має вирішити. Ціль також служить «тригером» для запуску програми.
Турбо-Пролог використовує як внутрішні цілі, які у програмі, і зовнішні цілі, які вводяться з клавіатури після запуску програми. Тут є два варіанти:
- Якщо мета єфактом, то Турбо-Пролог відповідає True (істина) або False (брехня):
Мері любить яблука.
- Якщо мета міститьзмінні, то Турбо-Пролог видає ті значення, які призводять до вирішення:
Що любить Мері?
Так, наш приклад може бути як фактом, так і метою:
likes(mary,apples). — Мері любить яблука і чи любить Мері яблука?
Алгоритм складання програми
Програма компілятора TProlog складається з розділів, розглянутих у прикладі:
predicates likes (a,a)
clauses likes (mary,apples). likes(mary,oranges). color(apples,red).
goal likes(mary,X),write("mary lyubit ",X).
Результатом прикладу буде: «mary lyubit apples».
У даному прикладі ціль записана у вигляді розділу GOAL прямо в програмі, але потрібно мати на увазі, що найчастіше цілі, що вимагають логічної відповіді (правда або брехня), записуються у вікні Dialog (goal впрограмі тоді не пишеться)
Безкінечний цикл
У прикладі, описаному вище, в результаті видається значення першого з трьох фактів:
clauses likes (mary,apples). likes(mary,oranges). color(apples,red). goal likes(mary,X),write("mary lyubit ",X).
Результат видає тільки apples. Хоча ще є oranges.
goal likes(mary,X),write("mary lyubit ", X),nl,fail.
nl означає перехід на наступний рядок (кожне значення виводиться з нового рядка).Результат: «mary lyubit apples». «mary lyubit oranges».
Код програми повністю:
domains a=symbol predicates likes (a,a) clauses likes (mary,apples). likes(mary,oranges). color(apples,red). goal likes(mary,X),write("mary lyubit ", X),nl,fail.
Розглянемо ще один приклад.
Код програми без запитів:
domains a=symbol predicates побудував (a,a) зберігається (a,a) краде (a,a) ловить (a,a) трепле (a,a) доїт (a,a) лається (a,a) будять (a a) clauses побудував (джек, будинок). зберігається (пшениця, чулан_дома). краде (птах_синиця, пшениця). ловить (кіт, птах_синиця). трепле (кіт, птах_синиця). трепле (пісок, кіт). доїт (старенька, корова). лається (пастух, старенька). будять (два_півня, пастух).
? - Збудував (Х, будинок). /*Хто збудував будинок?*/
? - ловить (кіт, Y) / * Кого ловить кіт? * /
Відповідь: Y= птица_синиця
? – лається (X,Y). /*Хто з ким лається?*/
Відповідь: X = пастух, Y = старенька
? - Зберігається (X, чулан_дома), краде (X,Y). /*Що зберігається в комірчині вдома і хто краде це */
Відповідь: X = пшениця, Y = птах_синиця
Виконання запитів у розділі Goal:
- Скласти базу даних «Предмети та викладачі», що містить інформацію про назву предмета, посади та прізвищавикладача, номер семестру, звітність.
- Скласти запити до бази даних, виходячи з наведених нижче:
- з яких предметів іспит?
- який предмет та коли читає доцент морозів?
- яка звітність щодо того?
- хто та коли читає ПРЗ?
domains a=symbol b=integer predicates teach(a,a,a,b) znalість(a,a) clauses teach(prz, assistent,ivanova,2 ). teach(toi, docent, morozov,4). teach(mpi, docent, petrova, 5). vedomost(toi, exam). vedomost(prz, zach). vedomost(mpi, exam). Goal /* vedomost(X,exam) ,write("exam po předmětу", X),nl,fail. */ … , write(…), nl, fail.