Синтаксис та семантика мови програмування Пролог є множиною правил, що визначає, як пишеться програма мовою Пролог, і як вона інтерпретується. Ці правила викладено у стандарті ISO/IEC (13211), хоча в [en] є відмінності.
Типи даних
Пролог є динамічно типізованою мовою. Вона має єдиний тип даних, терм, що має декілька підтипів: атоми, числа, змінні та складені терми.
Атом це загальна назва без притаманного значення. Він складається з послідовності символів, що аналізується читачем Прологу як єдине ціле. Як правило, атоми є простими словами у коді Прологу, написаними без спеціального синтаксису. Однак, атоми, що містять пропуски, або певні інші спеціальні символи, мають братися в одинарні лапки. Атоми, що починаються з великої літери, також повинні братися в лапки, щоби їх можна було відрізнити від змінних. Порожній список, що пишеться як []
, також є атомом. Інші приклади атомів: x
, синій
, 'Пиріжок'
, 'якийсь атом'
.
Числа можуть бути з рухомою комою, або цілими. Багато реалізацій Прологу пропонують також необмежені цілі та дійсні числа.
Змінні позначаються стрічками, що складаються з літер, цифр та символів підкреслення, і починаються з великої літери або символу підкреслення. Змінні дуже подібні до змінних в логіці в тім, що вони є позначками-заповнювачами для довільних термів. Змінну може бути конкретизовано (зв'язано дорівнюванням певному термові) через уніфікацію. Поодиноке підкреслення (_
) позначає анонімну змінну і значить «будь-який терм». На відміну від інших змінних, підкреслення не представляє однакове значення всюди, де воно зустрічається у визначенні предикату.
Складений терм складається з атому, що зветься функтор, та певної кількості «аргументів», що в свою чергу теж є термами. Складені терми зазвичай записуються у вигляді функтора, за яким у дужках слідує перелік термів-аргументів через кому. Кількість аргументів називається арністю терму. Атом може розглядатися як складений терм нульової арності.
Прикладами складених термів є рік_машини('Таврія', 1988)
та 'Друзі_Особи'(грай,[око,тур])
. Складені терми із функторами, що оголошено як оператори, можуть записуватися префіксним або інфіксним записом. Наприклад, теми -(z)
, +(a,b)
та =(X,Y)
може також бути записано як -z
, a+b
та X=Y
відповідно. Користувачі можуть оголошувати довільні функтори як оператори з різними пріоритетами для забезпечення предметно-орієнтованих записів. Запис f/n зазвичай використовується для позначення терму з функтором f та арністю n.
Особливі випадки складених термів:
- Списки визначаються індуктивно: Атом
[]
є списком. Складений терм з функтором.
(крапка) та арністю 2, чиїм другим аргументом є список, і сам є списком. Існує спеціальний синтаксис для позначення списків:.(A, B)
еквівалентне[A|B]
. Наприклад, список.(1, .(2, .(3, [])))
може також бути записано як[1 | [2 | [3 | []]]]
, або, навіть ще компактніше, як[1,2,3]
. - Стрічки: послідовність символів у лапках, еквівалентна спискові (числових) кодів символів, зазвичай у місцевому кодуванні, або в Юнікоді, якщо система підтримує Юнікод. Наприклад,
"бути чи не бути"
.
Прологові програми
Прологові програми описують відношення, визначені твердженнями. Чиста Пролог обмежена диз'юнктами Горна, повною за Тюрингом підмножиною логіки предикатів першого порядку. Є два типи тверджень: факти та правила. Правило має вигляд
Голова :- Тіло.
і читається як «голова істинна, якщо тіло істинне». Тіло правила складається з викликів предикатів, що називаються цілями правила. Вбудований предикат ,/2
(що значить двоарний оператор з ім’ям ,
) позначає кон’юнкцію цілей, а ;/2
— диз’юнкцію. Кон’юнкції та диз’юнкції можуть бути присутні лише в тілі, але не в голові правила.
Твердження з порожніми тілами називаються фактами. Наприклад:
кіт(базиліо).
що рівноцінне правилу:
кіт(базиліо) :- true.
інший приклад:
X is 3+2.
і коли ви запустите його, результатом буде
X=5 Yes.
Вбудований предикат true/0
є завжди істинним.
Виконання
Виконання прологової програми починається задаванням користувачем єдиної цілі, що зветься запитом. З точки зору логіки, рушій Прологу намагається знайти спростування резолюції заперечення цього запиту. Метод резолюції, що використовується у Пролозі, називається ВЛВ-резолюцією. Якщо заперечення запиту може бути спростовано, з цього випливає, що запит, з відповідними зв’язуваннями змінних, є логічним висновком програми. У такому разі всі створені зв’язування змінних повідомляються користувачеві, і про запит повідомляється, що він досяг успіху. З практичної точки зору, стратегію виконання Прологу можна уявити як узагальнення викликів функцій в інших мовах, з тією різницею, що заданому запитові можуть відповідати голови кількох тверджень. В такому випадку система створює точку вибору, об’єднує ціль з головою твердження першої альтернативи, і продовжує цілями цієї першої альтернативи. Якщо у напрямку виконання програми будь-яка ціль зазнає невдачі, всі зв’язування змінних, що було зроблено від останньої на той момент точки вибору, скасовуються, і виконання продовжується з наступною альтернативою цієї точки вибору. Ця стратегія виконання називається хронологічним пошуком з вертанням. Наприклад:
мати_дитини(ірина, святослав). батько_дитини(ярослав, святослав). батько_дитини(ярослав, анна). батько_дитини(володимир, ярослав). брат_або_сестра(X, Y) :- батько_або_мати_дитини(Z, X), батько_або_мати_дитини(Z, Y). батько_або_мати_дитини(X, Y) :- батько_дитини(X, Y). батько_або_мати_дитини(X, Y) :- мати_дитини(X, Y).
Виходячи з цього, наступний запит оцінюється як істинний:
?- брат_або_сестра(святослав, анна). Yes
Це отримується наступним чином: Спочатку єдиною відповідною головою твердження до запиту брат_або_сестра(святослав, анна)
є перша, тому надавання запиту є рівноцінним надаванню тіла того твердження з відповідними зв’язуваннями змінних, тобто, кон’юнкція (батько_або_мати_дитини(Z,святослав), батько_або_мати_дитини(Z,анна))
. Наступною ціллю для доведення є крайня зліва з цієї кон’юнкції, тобто, батько_або_мати_дитини(Z,святослав)
. Цій цілі відповідають голови двох правил. Система створює точку вибору, і пробує перший вибір, чиїм тілом є батько_дитини(Z, святослав)
. Цю ціль може бути доведено з використанням факту батько_дитини(ярослав, святослав)
, тому створюється зв’язування Z = ярослав
, і наступною ціллю для доведення стає друга частина наведеної вище кон’юнкції: батько_або_мати_дитини(ярослав, анна)
. І знову, це може бути доведено відповідним фактом. Оскільки всі цілі доведено, запит досягає успіху. Оскільки запит не містить жодних змінних, користувачеві не повідомляються жодні зв’язування. Запит зі змінними, як-то:
?- батько_дитини(Батько, Дитина).
перелічує всі дійсні відповіді пошуку з вертанням.
Зверніть увагу, що з наведеним вище кодом запит ?- брат_або_сестра(святослав, святослав).
також досягає успіху. Якщо потрібно, можна додати додаткові цілі для опису відповідних обмежень.
Цикли та рекурсія
Ітеративні алгоритми може бути реалізовано засобами рекурсивних предикатів. Для детермінованих предикатів, що демонструють хвостову рекурсію, або, загальніше, хвостові виклики, прологові системи зазвичай реалізують добре відомий метод оптимізації, що зветься оптимізацією хвостового виклику (англ. Tail Call Optimization, TCO): Перед виконанням виклику у хвостовій позиції кадр стеку твердження скасовується. Отже, детерміновані предикати з хвостовою рекурсією виконуються з незмінним простором стеку, як цикли в інших мовах.
Відсікання
Відсікання !
всередині правила втримає Пролог від пошуку з вертанням далі нього:
предикат(X) :- один(X), !, два(X).
зазнає невдачі, якщо перше знайдене значення X
, для якого один(X)
є істинним, веде до того, що два(X)
є хибним.
Анонімні змінні
Анонімні змінні _
ніколи не зв'язуються зі значенням, і можуть використовуватися у предикаті багато разів.
Приклад пошуку заданого значення у списках:
містить(Ш, []) :- false. містить(Ш, [Ш|_]) :- true. містить(Ш, [_|Т]) :- містить(Ш, Т).
Заперечення
Вбудований предикат Прологу \+/1
забезпечує заперечення як відмову, що уможливлює немонотонну аргументацію. Ціль \+ легальне(X)
у правилі
нелегальне(X) :- \+ легальне(X).
обчислюється наступним чином. Пролог намагається довести легальне(X)
. Якщо доведення цієї цілі знайдено, то початкова ціль (тобто, \+ легальне(X)
) зазнає невдачі. Якщо доведення не може бути знайдено, то початкова ціль досягає успіху. Отже, префіксний оператор \+/1
називається оператором «недовідне», оскільки запит ?- \+ Ціль.
досягає успіху, якщо Ціль не є довідною. Цей вид заперечення є правильним, якщо його аргумент є замкненим (тобто, не містить змінних). Правильність втрачається, якщо аргумент містить змінні. Зокрема, запит ?- нелегальне(X).
тепер вже не може бути використано для перелічення усіх речей, що є нелегальними.
Семантики
При декларативному прочитанні, порядок правил, та цілей в межах правил, не має значення, оскільки логічна кон’юнкція та диз’юнкція є комутативними. Процедурно, однак, часто важливо враховувати стратегію виконання Прологу, чи то з міркувань ефективності, чи то з причини семантик нечистих вбудованих предикатів, для яких порядок виконання має значення. Також, оскільки інтерпретатори Прологу намагаються уніфікувати твердження в порядку їх представлення, неспроможність надати правильного порядку може призводити до нескінченної рекурсії, як у:
предикат1(X) :- предикат2(X,X). предикат2(X,Y) :- предикат1(X), X \= Y.
За цього порядку будь-який запит вигляду
?- предикат1(атом).
рекуруватиме до вичерпання стеку. Проте, якщо хоча б останні три рядки було змінено на:
предикат2(X,Y) :- X \= Y, предикат1(X).
той самий запит призводив би до результату No.
за дуже короткий час.
Граматики визначених тверджень
Існує спеціальний запис, що називається граматиками визначених тверджень. Правило, визначене через -->/2
замість :-/2
, розкривається препроцесором (expand_term/2
, засіб, аналогічний макросам в інших мовах) відповідно до кількох прямих правил переписування, маючи результатом звичайні твердження Прологу. Найважливіше, що переписування споряджає предикат двома додатковими аргументами, що можуть використовуватися для неявного прокручування стану через них, аналогічно до монад в інших мовах. Граматики визначених тверджень часто використовуються для написання синтаксичних аналізаторів або генераторів списків, оскільки вони надають зручний інтерфейс до списків відмінностей.
Приклад синтаксичного аналізатора
Більший приклад покаже потенціал використання Прологу в синтаксичному аналізі.
Дано твердження, представлене у нотації Бекуса — Наура:
<sentence> ::= <stat_part> <stat_part> ::= <statement> | <stat_part> <statement> <statement> ::= <id> = <expression> ; <expression> ::= <operand> | <expression> <operator> <operand> <operand> ::= <id> | <digit> <id> ::= a | b <digit> ::= 0..9 <operator> ::= + | - | *
Це можна записати Прологом з використанням граматик визначених тверджень, що відповідають синтаксичному аналізаторові з передбаченням, що зазирає на одну лексему вперед:
sentence(S) --> statement(S0), sentence_r(S0, S). sentence_r(S, S) --> []. sentence_r(S0, seq(S0, S)) --> statement(S1), sentence_r(S1, S). statement(assign(Id,E)) --> id(Id), [=], expression(E), [;]. expression(E) --> term(T), expression_r(T, E). expression_r(E, E) --> []. expression_r(E0, E) --> [+], term(T), expression_r(plus(E0,T), E). expression_r(E0, E) --> [-], term(T), expression_r(minus(E0, T), E). term(T) --> factor(F), term_r(F, T). term_r(T, T) --> []. term_r(T0, T) --> [*], factor(F), term_r(times(T0, F), T). factor(id(ID)) --> id(ID). factor(digit(D)) --> [D], { (number(D) ; var(D)), between(0, 9, D)}. id(a) --> [a]. id(b) --> [b].
Цей код визначає відношення між виразом (заданим як перелік лексем) та його абстрактним синтаксичним деревом (АСД). Приклад запиту:
?- phrase(sentence(AST), [a,=,1,+,3,*,b,;,b,=,0,;]). AST = seq(assign(a, plus(digit(1), times(digit(3), id(b)))), assign(b, digit(0))) ;
Це АСД представлено з використанням термів Прологу, і може бути використано для застосування оптимізацій, для компіляції таких виразів до машинного коду, або для інтерпретації їх напряму. Як є типовим для відносної природи предикатів, ці визначення можуть використовуватися як для синтаксичного розбору, так і для генерації виразів, а також для перевірки, чи відповідає задане дерево заданому перелікові лексем. Використовуючи ітеративне заглиблення для послідовного переліку, буде зрештою згенеровано кожен довільний, але фіксований вираз, та його АСД:
?- length(Tokens, _), phrase(sentence(AST), Tokens). Tokens = [a, =, a, (;)], AST = assign(a, id(a)) ; Tokens = [a, =, b, (;)], AST = assign(a, id(b)) тощо.
Див. також
- [en]
Примітки
- ISO/IEC 13211: Information technology — Programming languages — Prolog. International Organization for Standardization, Geneva.
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Dokladnishe Prolog mova programuvannya Sintaksis ta semantika movi programuvannya Prolog ye mnozhinoyu pravil sho viznachaye yak pishetsya programa movoyu Prolog i yak vona interpretuyetsya Ci pravila vikladeno u standarti ISO IEC 13211 hocha v en ye vidminnosti Tipi danihProlog ye dinamichno tipizovanoyu movoyu Vona maye yedinij tip danih term sho maye dekilka pidtipiv atomi chisla zminni ta skladeni termi Atom ce zagalna nazva bez pritamannogo znachennya Vin skladayetsya z poslidovnosti simvoliv sho analizuyetsya chitachem Prologu yak yedine cile Yak pravilo atomi ye prostimi slovami u kodi Prologu napisanimi bez specialnogo sintaksisu Odnak atomi sho mistyat propuski abo pevni inshi specialni simvoli mayut bratisya v odinarni lapki Atomi sho pochinayutsya z velikoyi literi takozh povinni bratisya v lapki shobi yih mozhna bulo vidrizniti vid zminnih Porozhnij spisok sho pishetsya yak takozh ye atomom Inshi prikladi atomiv x sinij Pirizhok yakijs atom Chisla mozhut buti z ruhomoyu komoyu abo cilimi Bagato realizacij Prologu proponuyut takozh neobmezheni cili ta dijsni chisla Zminni poznachayutsya strichkami sho skladayutsya z liter cifr ta simvoliv pidkreslennya i pochinayutsya z velikoyi literi abo simvolu pidkreslennya Zminni duzhe podibni do zminnih v logici v tim sho voni ye poznachkami zapovnyuvachami dlya dovilnih termiv Zminnu mozhe buti konkretizovano zv yazano dorivnyuvannyam pevnomu termovi cherez unifikaciyu Poodinoke pidkreslennya poznachaye anonimnu zminnu i znachit bud yakij term Na vidminu vid inshih zminnih pidkreslennya ne predstavlyaye odnakove znachennya vsyudi de vono zustrichayetsya u viznachenni predikatu Skladenij term skladayetsya z atomu sho zvetsya funktor ta pevnoyi kilkosti argumentiv sho v svoyu chergu tezh ye termami Skladeni termi zazvichaj zapisuyutsya u viglyadi funktora za yakim u duzhkah sliduye perelik termiv argumentiv cherez komu Kilkist argumentiv nazivayetsya arnistyu termu Atom mozhe rozglyadatisya yak skladenij term nulovoyi arnosti Prikladami skladenih termiv ye rik mashini Tavriya 1988 ta Druzi Osobi graj oko tur Skladeni termi iz funktorami sho ogolosheno yak operatori mozhut zapisuvatisya prefiksnim abo infiksnim zapisom Napriklad temi z a b ta X Y mozhe takozh buti zapisano yak z a b ta X Y vidpovidno Koristuvachi mozhut ogoloshuvati dovilni funktori yak operatori z riznimi prioritetami dlya zabezpechennya predmetno oriyentovanih zapisiv Zapis f n zazvichaj vikoristovuyetsya dlya poznachennya termu z funktorom f ta arnistyu n Osoblivi vipadki skladenih termiv Spiski viznachayutsya induktivno Atom ye spiskom Skladenij term z funktorom krapka ta arnistyu 2 chiyim drugim argumentom ye spisok i sam ye spiskom Isnuye specialnij sintaksis dlya poznachennya spiskiv A B ekvivalentne A B Napriklad spisok 1 2 3 mozhe takozh buti zapisano yak 1 2 3 abo navit she kompaktnishe yak 1 2 3 Strichki poslidovnist simvoliv u lapkah ekvivalentna spiskovi chislovih kodiv simvoliv zazvichaj u miscevomu koduvanni abo v Yunikodi yaksho sistema pidtrimuye Yunikod Napriklad buti chi ne buti Prologovi programiPrologovi programi opisuyut vidnoshennya viznacheni tverdzhennyami Chista Prolog obmezhena diz yunktami Gorna povnoyu za Tyuringom pidmnozhinoyu logiki predikativ pershogo poryadku Ye dva tipi tverdzhen fakti ta pravila Pravilo maye viglyad Golova Tilo i chitayetsya yak golova istinna yaksho tilo istinne Tilo pravila skladayetsya z viklikiv predikativ sho nazivayutsya cilyami pravila Vbudovanij predikat 2 sho znachit dvoarnij operator z im yam poznachaye kon yunkciyu cilej a 2 diz yunkciyu Kon yunkciyi ta diz yunkciyi mozhut buti prisutni lishe v tili ale ne v golovi pravila Tverdzhennya z porozhnimi tilami nazivayutsya faktami Napriklad kit bazilio sho rivnocinne pravilu kit bazilio true inshij priklad X is 3 2 i koli vi zapustite jogo rezultatom bude X 5 Yes Vbudovanij predikat true 0 ye zavzhdi istinnim VikonannyaVikonannya prologovoyi programi pochinayetsya zadavannyam koristuvachem yedinoyi cili sho zvetsya zapitom Z tochki zoru logiki rushij Prologu namagayetsya znajti sprostuvannya rezolyuciyi zaperechennya cogo zapitu Metod rezolyuciyi sho vikoristovuyetsya u Prolozi nazivayetsya VLV rezolyuciyeyu Yaksho zaperechennya zapitu mozhe buti sprostovano z cogo viplivaye sho zapit z vidpovidnimi zv yazuvannyami zminnih ye logichnim visnovkom programi U takomu razi vsi stvoreni zv yazuvannya zminnih povidomlyayutsya koristuvachevi i pro zapit povidomlyayetsya sho vin dosyag uspihu Z praktichnoyi tochki zoru strategiyu vikonannya Prologu mozhna uyaviti yak uzagalnennya viklikiv funkcij v inshih movah z tiyeyu rizniceyu sho zadanomu zapitovi mozhut vidpovidati golovi kilkoh tverdzhen V takomu vipadku sistema stvoryuye tochku viboru ob yednuye cil z golovoyu tverdzhennya pershoyi alternativi i prodovzhuye cilyami ciyeyi pershoyi alternativi Yaksho u napryamku vikonannya programi bud yaka cil zaznaye nevdachi vsi zv yazuvannya zminnih sho bulo zrobleno vid ostannoyi na toj moment tochki viboru skasovuyutsya i vikonannya prodovzhuyetsya z nastupnoyu alternativoyu ciyeyi tochki viboru Cya strategiya vikonannya nazivayetsya hronologichnim poshukom z vertannyam Napriklad mati ditini irina svyatoslav batko ditini yaroslav svyatoslav batko ditini yaroslav anna batko ditini volodimir yaroslav brat abo sestra X Y batko abo mati ditini Z X batko abo mati ditini Z Y batko abo mati ditini X Y batko ditini X Y batko abo mati ditini X Y mati ditini X Y Vihodyachi z cogo nastupnij zapit ocinyuyetsya yak istinnij brat abo sestra svyatoslav anna Yes Ce otrimuyetsya nastupnim chinom Spochatku yedinoyu vidpovidnoyu golovoyu tverdzhennya do zapitu brat abo sestra svyatoslav anna ye persha tomu nadavannya zapitu ye rivnocinnim nadavannyu tila togo tverdzhennya z vidpovidnimi zv yazuvannyami zminnih tobto kon yunkciya batko abo mati ditini Z svyatoslav batko abo mati ditini Z anna Nastupnoyu cillyu dlya dovedennya ye krajnya zliva z ciyeyi kon yunkciyi tobto batko abo mati ditini Z svyatoslav Cij cili vidpovidayut golovi dvoh pravil Sistema stvoryuye tochku viboru i probuye pershij vibir chiyim tilom ye batko ditini Z svyatoslav Cyu cil mozhe buti dovedeno z vikoristannyam faktu batko ditini yaroslav svyatoslav tomu stvoryuyetsya zv yazuvannya Z yaroslav i nastupnoyu cillyu dlya dovedennya staye druga chastina navedenoyi vishe kon yunkciyi batko abo mati ditini yaroslav anna I znovu ce mozhe buti dovedeno vidpovidnim faktom Oskilki vsi cili dovedeno zapit dosyagaye uspihu Oskilki zapit ne mistit zhodnih zminnih koristuvachevi ne povidomlyayutsya zhodni zv yazuvannya Zapit zi zminnimi yak to batko ditini Batko Ditina perelichuye vsi dijsni vidpovidi poshuku z vertannyam Zvernit uvagu sho z navedenim vishe kodom zapit brat abo sestra svyatoslav svyatoslav takozh dosyagaye uspihu Yaksho potribno mozhna dodati dodatkovi cili dlya opisu vidpovidnih obmezhen Cikli ta rekursiyaIterativni algoritmi mozhe buti realizovano zasobami rekursivnih predikativ Dlya determinovanih predikativ sho demonstruyut hvostovu rekursiyu abo zagalnishe hvostovi vikliki prologovi sistemi zazvichaj realizuyut dobre vidomij metod optimizaciyi sho zvetsya optimizaciyeyu hvostovogo vikliku angl Tail Call Optimization TCO Pered vikonannyam vikliku u hvostovij poziciyi kadr steku tverdzhennya skasovuyetsya Otzhe determinovani predikati z hvostovoyu rekursiyeyu vikonuyutsya z nezminnim prostorom steku yak cikli v inshih movah VidsikannyaVidsikannya vseredini pravila vtrimaye Prolog vid poshuku z vertannyam dali nogo predikat X odin X dva X zaznaye nevdachi yaksho pershe znajdene znachennya X dlya yakogo odin X ye istinnim vede do togo sho dva X ye hibnim Anonimni zminniAnonimni zminni nikoli ne zv yazuyutsya zi znachennyam i mozhut vikoristovuvatisya u predikati bagato raziv Priklad poshuku zadanogo znachennya u spiskah mistit Sh false mistit Sh Sh true mistit Sh T mistit Sh T ZaperechennyaVbudovanij predikat Prologu 1 zabezpechuye zaperechennya yak vidmovu sho umozhlivlyuye nemonotonnu argumentaciyu Cil legalne X u pravili nelegalne X legalne X obchislyuyetsya nastupnim chinom Prolog namagayetsya dovesti legalne X Yaksho dovedennya ciyeyi cili znajdeno to pochatkova cil tobto legalne X zaznaye nevdachi Yaksho dovedennya ne mozhe buti znajdeno to pochatkova cil dosyagaye uspihu Otzhe prefiksnij operator 1 nazivayetsya operatorom nedovidne oskilki zapit Cil dosyagaye uspihu yaksho Cil ne ye dovidnoyu Cej vid zaperechennya ye pravilnim yaksho jogo argument ye zamknenim tobto ne mistit zminnih Pravilnist vtrachayetsya yaksho argument mistit zminni Zokrema zapit nelegalne X teper vzhe ne mozhe buti vikoristano dlya perelichennya usih rechej sho ye nelegalnimi SemantikiPri deklarativnomu prochitanni poryadok pravil ta cilej v mezhah pravil ne maye znachennya oskilki logichna kon yunkciya ta diz yunkciya ye komutativnimi Procedurno odnak chasto vazhlivo vrahovuvati strategiyu vikonannya Prologu chi to z mirkuvan efektivnosti chi to z prichini semantik nechistih vbudovanih predikativ dlya yakih poryadok vikonannya maye znachennya Takozh oskilki interpretatori Prologu namagayutsya unifikuvati tverdzhennya v poryadku yih predstavlennya nespromozhnist nadati pravilnogo poryadku mozhe prizvoditi do neskinchennoyi rekursiyi yak u predikat1 X predikat2 X X predikat2 X Y predikat1 X X Y Za cogo poryadku bud yakij zapit viglyadu predikat1 atom rekuruvatime do vicherpannya steku Prote yaksho hocha b ostanni tri ryadki bulo zmineno na predikat2 X Y X Y predikat1 X toj samij zapit prizvodiv bi do rezultatu No za duzhe korotkij chas Gramatiki viznachenih tverdzhenIsnuye specialnij zapis sho nazivayetsya gramatikami viznachenih tverdzhen Pravilo viznachene cherez gt 2 zamist 2 rozkrivayetsya preprocesorom expand term 2 zasib analogichnij makrosam v inshih movah vidpovidno do kilkoh pryamih pravil perepisuvannya mayuchi rezultatom zvichajni tverdzhennya Prologu Najvazhlivishe sho perepisuvannya sporyadzhaye predikat dvoma dodatkovimi argumentami sho mozhut vikoristovuvatisya dlya neyavnogo prokruchuvannya stanu cherez nih analogichno do monad v inshih movah Gramatiki viznachenih tverdzhen chasto vikoristovuyutsya dlya napisannya sintaksichnih analizatoriv abo generatoriv spiskiv oskilki voni nadayut zruchnij interfejs do spiskiv vidminnostej Priklad sintaksichnogo analizatora Bilshij priklad pokazhe potencial vikoristannya Prologu v sintaksichnomu analizi Dano tverdzhennya predstavlene u notaciyi Bekusa Naura lt sentence gt lt stat part gt lt stat part gt lt statement gt lt stat part gt lt statement gt lt statement gt lt id gt lt expression gt lt expression gt lt operand gt lt expression gt lt operator gt lt operand gt lt operand gt lt id gt lt digit gt lt id gt a b lt digit gt 0 9 lt operator gt Ce mozhna zapisati Prologom z vikoristannyam gramatik viznachenih tverdzhen sho vidpovidayut sintaksichnomu analizatorovi z peredbachennyam sho zaziraye na odnu leksemu vpered sentence S gt statement S0 sentence r S0 S sentence r S S gt sentence r S0 seq S0 S gt statement S1 sentence r S1 S statement assign Id E gt id Id expression E expression E gt term T expression r T E expression r E E gt expression r E0 E gt term T expression r plus E0 T E expression r E0 E gt term T expression r minus E0 T E term T gt factor F term r F T term r T T gt term r T0 T gt factor F term r times T0 F T factor id ID gt id ID factor digit D gt D number D var D between 0 9 D id a gt a id b gt b Cej kod viznachaye vidnoshennya mizh virazom zadanim yak perelik leksem ta jogo abstraktnim sintaksichnim derevom ASD Priklad zapitu phrase sentence AST a 1 3 b b 0 AST seq assign a plus digit 1 times digit 3 id b assign b digit 0 Ce ASD predstavleno z vikoristannyam termiv Prologu i mozhe buti vikoristano dlya zastosuvannya optimizacij dlya kompilyaciyi takih viraziv do mashinnogo kodu abo dlya interpretaciyi yih napryamu Yak ye tipovim dlya vidnosnoyi prirodi predikativ ci viznachennya mozhut vikoristovuvatisya yak dlya sintaksichnogo rozboru tak i dlya generaciyi viraziv a takozh dlya perevirki chi vidpovidaye zadane derevo zadanomu perelikovi leksem Vikoristovuyuchi iterativne zagliblennya dlya poslidovnogo pereliku bude zreshtoyu zgenerovano kozhen dovilnij ale fiksovanij viraz ta jogo ASD length Tokens phrase sentence AST Tokens Tokens a a AST assign a id a Tokens a b AST assign a id b tosho Div takozh en PrimitkiISO IEC 13211 Information technology Programming languages Prolog International Organization for Standardization Geneva