Польська нотаціяПольська нотація (також відома як префіксна нотація, PN)[1] — вид запису алгебраїчних та логічних виразів, при якому група символів операції записується ліворуч від групи операндів. Якщо арність операторів фіксована, то отримуємо синтаксис без використання будь-яких дужок і без двозначності. Польську нотацію запропонував у 1924 році польський логік Ян Лукашевич[2] з метою спрощення логіки висловлень.[3][4] Інколи поняття Польської нотації включає (як протилежність інфіксної нотації) Польську постфіксну нотацію або зворотній Польський запис (англ. Reverse Polish notation, RPN), у якому оператори розташовані після операндів.[5] Коли польська нотація використовується синтаксисом математичних виразів трансляторів мов програмування, вона легко розкладається у абстрактні синтаксичні дерева та фактично має взаємно однозначне відношення з інфіксною нотацією. Тому Лісп та споріднені йому мови програмування визначають їх синтаксис у визначеннях префіксної нотації (тоді як інші використовують постфіксну) Нижче приведена цитата зі статті Яна Лукасевича, Зауваження щодо аксіоми Нікода та про «Узагальнення дедукції», сторінка 180.[6]
Посилання, цитоване Лукасевичем, певно літографічна доповідь польською мовою. Його стаття Зауваження щодо аксіоми Нікода та про «Узагальнення дедукції» була розглянута Ґ. А. Погожельським в Journal of Symbolic Logic у 1965 році.[7] Алонзо Черч згадував цю нотацію у своїй книзі з математичної логіки, як гідну уваги систему нотації й навіть протиставляв логічним нотаціям Альфреда Вайтгеда і Бертрана Рассела в праці «Principia Mathematica».[8] В книзі Лукасевича Силогістика Арістотеля з погляду сучасної формальної логіки, що була опублікована 1951 року, він згадував, що принцип його нотації полягає у запису функторів до аргументів для уникнення дужок та те, що він застосовував цю нотацію у статтях з логіки починаючи з 1929 року.[9] Потім він починає цитувати, як приклад, статтю 1930 року, яку він написав разом з Альфредом Тарським про числення висловлень.[10] Попри те, що польська нотація більше активно не використовується в логіці,[11] вона широко застосовується в інформатиці. АрифметикаУ префіксній нотації додавання чисел 1 і 2 буде записано як «+ 1 2» замість запису «1 + 2». У більш складних виразах оператори передують операндам, але операнди самі можуть бути нетривіальними виразами, що містять свої власні оператори. Наприклад, вираз, який у традиційній інфіксній нотації записується
у префіксній може бути записаний так:
або так:
Через те, що будь-яка проста арифметична операція є бінарною, то її префіксне уявлення не може бути інтерпретовано двояко, тому нема потреби використовувати дужки. У попередньому прикладі у традиційній, інфіксному записі круглі дужки були необхідні, а тепер перемістимо їх:
Або просто видалимо:
Це змінить зміст і результат обчислення всього висловлювання. Відповідний префіксний запис такого виразу буде виглядати наступним чином:
Обчислення вирахування затримується до тих пір поки не будуть прочитані обидва операнди (5 і результат перемноження 6 і 7). Як і в будь-який іншої нотації, вирази, що знаходяться в глибше, обчислюються першими, але в польському записі глибина виразу визначається порядком, а не дужками. При роботі з некомутативними операціями, такими як ділення або віднімання, необхідно узгоджувати послідовне розташування операндів з тим, як оператор приймає свої аргументи, тобто, зліва направо. Наприклад, ÷ 10 5, з 10 ліворуч від 5, має значення 10 ÷ 5 (читається як «ділимо 10 на 5»), або - 7 6, з 7 ліворуч від 6, має значення 7 - 6 (читається як «віднімаємо від 7 операнд 6»). ПрограмуванняПрефіксний запис широко застосовується в s-виразах в мові програмування Лісп (LISP), де дужки необхідні, оскільки арифметичні оператори мають різну арність. Мова програмування Ambi використовує польську нотацію для арифметичних операцій і структури програми. Постфіксний запис використовується в багатьох стекових мовах, як PostScript, так і є основою для багатьох обчислювальних машин (калькуляторів), особливо для обчислювальних машин Hewlett-Packard. Синтаксис мови програмування CoffeeScript дозволяє викликати функції, використовуючи префіксну нотацію, водночас підтримуючи поширений для мов програмування унарний постфіксний синтаксис. Також важливо відзначити, що кількість операндів у виразі має бути на один більше ніж кількість операцій, інакше вираз не має сенсу (враховуючи, що в вираженні використовуються тільки бінарні операції). Цьому можна легко не надавати значення при роботі з довгими, складними виразами, що спричинить помилки. Тому необхідно звертати увагу на кількість операцій і операндів при використанні префіксної нотації. Порядок операційПорядок операцій визначається структурою префіксної нотації й може бути легко визначений. Головне, потрібно пам'ятати, що при обчисленні виразу порядок операндів потрібно зберігати. Це не важливо для операцій, які мають властивість комутативності, але для не комутативних операцій, таких як віднімання і ділення, цей факт є ключовим для аналізу виразу. Наприклад, такий вираз: / 10 5 = 2 (префіксний запис) потрібно прочитати, як «10 ділити на 5». Тому результатом обчислення буде 2, а не ½, що було б результатом неправильного аналізу виразу. Префіксний запис особливо популярний в стекових мовах програмування завдяки властивій їм можливості легко розрізняти порядок операцій без використання дужок. Для виявлення порядку обчислення операторів в префіксній нотації нема потреби запам'ятовувати всю операційну ієрархію, як при інфіксній нотації. Замість того, щоб аналізувати вираз для виявлення оператора, який потрібно обчислити першим, потрібно зчитувати вираз зліва направо, розглядаючи оператор і найближчі до нього два операнди. Якщо серед цих операндів знаходиться ще один оператор, то обчислення першого оператора відкладається, до тих пір, поки не буде обчислений новий оператор. Ітерації цього процесу повторюються до тих пір, поки оператор не буде обчислено, що має кінець кінцем статися, якщо вираз коректний. Як тільки оператор обчислений, він і його два операнди замінюються отриманим значенням (операндом). Оскільки оператор і два операнди замінюються на обчислений операнд, то стає на один оператор і один операнд менше. Після в вираженні цього також залишається N операторів і N + 1 операнд, що дозволяє ітеративно продовжувати процес. У наведеному нижче прикладі можна побачити, що складне, на перший погляд, вираз в префіксній нотації, насправді виявляється не такою вже складною для розуміння (праворуч від знака рівності відповідний вираз в інфіксному записі): - * / 15 - 7 + 1 1 3 + 2 + 1 1 = 15 / (7 - (1 + 1)) * 3 - (2 + (1 + 1)) - * / 15 - 7 2 3 + 2 + 1 1 = 15 / (7 - 2) * 3 - (2 + (1 + 1)) - * / 15 5 3 + 2 + 1 1 = 15 / 5 * 3 - (2 + (1 + 1)) - * 3 3 + 2 + 1 1 = 3 * 3 - (2 + (1 + 1)) - 9 + 2 + 1 1 = 9 - (2 + (1 + 1)) - 9 + 2 2 = 9 - (2 + 2) - 9 4 = 9 - 4 5 = 5 Польська нотація в логіціТаблиця, наведена нижче, демонструє ядро запису запропонованої Яном Лукашевичем для числення висловлень. Деякі букви Польського запису означають конкретні слова на польській мові:
Див. такожПримітки
Література
Посилання
|