В логике , математике , информатике и лингвистике формальный язык состоит из слов , буквы которых взяты из алфавита и правильно сформированы в соответствии с определенным набором правил, называемым формальной грамматикой .
Алфавит формального языка состоит из символов, букв или токенов , которые объединяются в строки, называемые словами. [1] Слова, принадлежащие определенному формальному языку, иногда называются правильно сформированными словами или правильно сформированными формулами . Формальный язык часто определяется посредством формальной грамматики, такой как регулярная грамматика или контекстно-свободная грамматика , которая состоит из правил ее формирования .
В информатике формальные языки используются, среди прочего, в качестве основы для определения грамматики языков программирования и формализованных версий подмножеств естественных языков, в которых слова языка представляют концепции, связанные со значениями или семантикой . В теории вычислительной сложности задачи принятия решений обычно определяются как формальные языки, а классы сложности определяются как наборы формальных языков, которые могут быть проанализированы машинами с ограниченной вычислительной мощностью. В логике и основаниях математики формальные языки используются для представления синтаксиса аксиоматических систем , а математический формализм — это философия, согласно которой вся математика может быть сведена к синтаксической манипуляции формальными языками таким образом.
Область формальной теории языка изучает в первую очередь чисто синтаксические аспекты таких языков, то есть их внутренние структурные модели. Формальная теория языка возникла из лингвистики как способ понимания синтаксических закономерностей естественных языков .
В 17 веке Готфрид Лейбниц придумал и описал characteristicsa universalis , универсальный и формальный язык, который использовал пиктограммы . Позже Карл Фридрих Гаусс исследовал проблему кодов Гаусса . [2]
Готтлоб Фреге попытался реализовать идеи Лейбница с помощью системы обозначений, впервые изложенной в Begriffsschrift (1879) и более полно разработанной в его двухтомном труде Grundgesetze der Arithmetik (1893/1903). [3] В нем описывался «формальный язык чистого языка». [4]
В первой половине 20-го века было сделано несколько разработок, имеющих отношение к формальным языкам. Аксель Туэ опубликовал четыре статьи, касающиеся слов и языка, между 1906 и 1914 годами. Последняя из них представила то, что Эмиль Пост позже назвал «Системами Туэ», и привела ранний пример неразрешимой проблемы . [5] Позже Пост использовал эту статью в качестве основы для доказательства 1947 года, «что проблема слов для полугрупп была рекурсивно неразрешима», [6] и позже разработал каноническую систему для создания формальных языков.
В 1907 году Леонардо Торрес Кеведо ввел формальный язык для описания механических чертежей (механических устройств) в Вене . Он опубликовал "Sobre un sistema de notaciones y símbolos destinados a facilitar la descripción de las máquinas" ("О системе обозначений и символов, предназначенных для облегчения описания машин"). [7] Хайнц Земанек оценил его как эквивалент языка программирования для числового управления станками. [8]
Ноам Хомский разработал абстрактное представление формальных и естественных языков, известное как иерархия Хомского . [9] В 1959 году Джон Бэкус разработал форму Бэкуса-Наура для описания синтаксиса языка программирования высокого уровня, следуя своей работе по созданию FORTRAN . [10] Питер Наур был секретарем/редактором отчета ALGOL60, в котором он использовал форму Бэкуса-Наура для описания формальной части ALGOL60.
Алфавитом в контексте формальных языков может быть любой набор ; его элементы называются буквами . Алфавит может содержать бесконечное число элементов; [примечание 1] однако большинство определений в теории формального языка указывают алфавиты с конечным числом элементов, и многие результаты применимы только к ним. Часто имеет смысл использовать алфавит в обычном смысле этого слова или, в более общем смысле, любую конечную кодировку символов , такую как ASCII или Unicode .
Слово в алфавите может быть любой конечной последовательностью (т. е. строкой ) букв. Множество всех слов в алфавите Σ обычно обозначается как Σ * (используя звезду Клини ). Длина слова — это количество букв, из которых оно состоит. Для любого алфавита существует только одно слово длины 0, пустое слово , которое часто обозначается как e, ε, λ или даже Λ. С помощью конкатенации можно объединить два слова, чтобы сформировать новое слово, длина которого равна сумме длин исходных слов. Результатом конкатенации слова с пустым словом является исходное слово.
В некоторых приложениях, особенно в логике , алфавит также известен как словарь , а слова известны как формулы или предложения ; это разрушает метафору буква/слово и заменяет ее метафорой слово/предложение.
Формальный язык L над алфавитом Σ является подмножеством Σ * , то есть набором слов над этим алфавитом. Иногда наборы слов группируются в выражения, тогда как правила и ограничения могут быть сформулированы для создания «правильно сформированных выражений».
В информатике и математике, которые обычно не имеют дела с естественными языками , прилагательное «формальный» часто опускается как избыточное.
В то время как формальная теория языка обычно занимается формальными языками, которые описываются некоторыми синтаксическими правилами, фактическое определение понятия «формальный язык» только как указано выше: (возможно, бесконечное) множество строк конечной длины, составленных из заданного алфавита, не больше и не меньше. На практике существует множество языков, которые можно описать правилами, например, регулярные языки или контекстно-свободные языки . Понятие формальной грамматики может быть ближе к интуитивному понятию «языка», описываемого синтаксическими правилами. Из-за злоупотребления определением часто считается, что конкретный формальный язык сопровождается формальной грамматикой, которая его описывает.
Следующие правила описывают формальный язык L над алфавитом Σ = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, +, =}:
Согласно этим правилам, строка "23+4=555" находится в L , а строка "=234=+" - нет. Этот формальный язык выражает натуральные числа , правильно сформированные сложения и правильно сформированные равенства сложения, но он выражает только то, как они выглядят (их синтаксис ), а не то, что они означают ( семантика ). Например, нигде в этих правилах нет никаких указаний на то, что "0" означает число ноль, "+" означает сложение, "23+4=555" ложно и т. д.
Для конечных языков можно явно перечислить все правильно сформированные слова. Например, мы можем описать язык L как L = {a, b, ab, cba}. Вырожденный случай этой конструкции — пустой язык , который вообще не содержит слов ( L = ∅ ).
Однако даже над конечным (непустым) алфавитом, таким как Σ = {a, b}, существует бесконечное число слов конечной длины, которые потенциально могут быть выражены: "a", "abb", "ababba", "aaababbbbaab", .... Поэтому формальные языки, как правило, бесконечны, и описание бесконечного формального языка не так просто, как написание L = {a, b, ab, cba}. Вот несколько примеров формальных языков:
Формальные языки используются в качестве инструментов во многих дисциплинах. Однако формальная теория языка редко занимается конкретными языками (за исключением примеров), а в основном занимается изучением различных типов формализмов для описания языков. Например, язык может быть задан как
Типичные вопросы, задаваемые о подобных формализмах, включают в себя:
Удивительно часто ответом на эти проблемы принятия решений является «это вообще невозможно сделать» или «это чрезвычайно дорого» (с характеристикой того, насколько дорого). Таким образом, формальная теория языка является основной областью применения теории вычислимости и теории сложности . Формальные языки могут быть классифицированы в иерархии Хомского на основе выразительной силы их порождающей грамматики, а также сложности их распознающего автомата . Контекстно-свободные грамматики и регулярные грамматики обеспечивают хороший компромисс между выразительностью и простотой синтаксического анализа и широко используются в практических приложениях.
Некоторые операции над языками являются общими. Сюда входят стандартные операции над множествами, такие как объединение, пересечение и дополнение. Другой класс операций — поэлементное применение строковых операций.
Примеры: предположим, что и — это языки с некоторым общим алфавитом .
Такие строковые операции используются для исследования свойств замыкания классов языков. Класс языков замкнут относительно определенной операции, когда операция, примененная к языкам в классе, всегда снова производит язык в том же классе. Например, известно, что контекстно-свободные языки замкнуты относительно объединения, конкатенации и пересечения с обычными языками , но не замкнуты относительно пересечения или дополнения. Теория трио и абстрактных семейств языков изучает наиболее общие свойства замыкания языковых семейств по их собственному праву. [11]
Компилятор обычно состоит из двух отдельных компонентов. Лексический анализатор , иногда генерируемый таким инструментом, как lex, идентифицирует токены грамматики языка программирования, например идентификаторы или ключевые слова , числовые и строковые литералы, знаки препинания и символы операторов, которые сами по себе задаются более простым формальным языком, обычно с помощью регулярных выражений . На самом базовом концептуальном уровне парсер , иногда генерируемый генератором парсеров , таким как yacc
, пытается решить, является ли исходная программа синтаксически допустимой, то есть правильно ли она сформирована по отношению к грамматике языка программирования, для которой был построен компилятор.
Конечно, компиляторы делают больше, чем просто анализируют исходный код — они обычно переводят его в некий исполняемый формат. Из-за этого синтаксический анализатор обычно выводит больше, чем ответ «да/нет», обычно абстрактное синтаксическое дерево . Это используется последующими этапами компилятора, чтобы в конечном итоге сгенерировать исполняемый файл, содержащий машинный код , который выполняется непосредственно на оборудовании, или некоторый промежуточный код , который требует виртуальной машины для выполнения.
В математической логике формальная теория — это набор предложений, выраженных на формальном языке.
Формальная система (также называемая логическим исчислением или логической системой ) состоит из формального языка вместе с дедуктивным аппаратом (также называемым дедуктивной системой ). Дедуктивный аппарат может состоять из набора правил преобразования , которые могут интерпретироваться как допустимые правила вывода, или набора аксиом , или иметь и то, и другое. Формальная система используется для вывода одного выражения из одного или нескольких других выражений. Хотя формальный язык можно идентифицировать по его формулам, формальная система не может быть также идентифицирована по ее теоремам. Две формальные системы и могут иметь все те же теоремы и все же отличаться некоторым существенным теоретическим способом доказательства (например, формула A может быть синтаксическим следствием формулы B в одном, но не в другом).
Формальное доказательство или вывод — это конечная последовательность правильно сформированных формул (которые могут быть интерпретированы как предложения или суждения ), каждое из которых является аксиомой или следует из предыдущих формул в последовательности по правилу вывода . Последнее предложение в последовательности — теорема формальной системы. Формальные доказательства полезны, потому что их теоремы могут быть интерпретированы как истинные суждения.
Формальные языки по своей природе полностью синтаксичны, но могут быть наделены семантикой , которая придает значение элементам языка. Например, в математической логике набор возможных формул конкретной логики является формальным языком, а интерпретация присваивает значение каждой из формул — обычно, значение истинности .
Изучение интерпретаций формальных языков называется формальной семантикой . В математической логике это часто делается в терминах теории моделей . В теории моделей термины, которые встречаются в формуле, интерпретируются как объекты внутри математических структур , а фиксированные правила композиционной интерпретации определяют, как истинностное значение формулы может быть получено из интерпретации ее терминов; модель для формулы — это интерпретация терминов, при которой формула становится истинной.
Алфавит — это конечное множество