Мне неясно, как используются фразы «бесконечный» язык или «конечный» язык в компьютерной теории.
Я думаю, что корень проблемы в том, что такой язык, как , бесконечен в том смысле, что он может генерировать бесконечное (но счетное) количество строк. Тем не менее, он все еще может быть распознан конечным автоматом.L = { a b }*
Другая проблема заключается в том, что теория формального языка довольно своеобразна тем, как она использует термин «язык».
Для всех в этом мире, кроме людей в теории формального языка, язык - это система высказываний, используемая для общения, поэтому каждое высказывание имеет форму (свой синтаксис ) и своего рода значение (свою семантику ). Теория формального языка, по крайней мере та часть, которая используется в информатике, посвящена проблеме того, как лучше определить формально синтаксис языков. Все дело в связи между синтаксисом языков (как выглядят высказывания) и формализмами (языками!), Такими как регулярные выражения, которые используются для определения синтаксиса языков.
Следовательно, в теории формального языка «язык» определяется просто как «набор строк». Обычно он не присваивает значения строкам в языке.
В то же время формализмы, используемые для описания языков, такие как регулярные выражения, также образуют языки в этом смысле: например, каждое регулярное выражение является строкой, и, следовательно, набор регулярных выражений является языком. Тем не менее, для этих формализмов, строки в языке делают имеет смысл: например, смысл каждого регулярного выражения языка оно обозначает.
а б{ а б }а ба б{ а б }
{ a b }** обозначает функцию, которая отображает языки на языки: она отображает каждый язык L на язык, состоящий из всех строк, которые состоят из строки в Lноль или более раз повторяется. ЕслиL это пустой язык, результат L; во всех остальных случаях результатом является бесконечный язык. Например,{ а б }* это язык { ϵ , a b , a b a b , a b a b a b , a b a b a b a b , … }, Это бесконечно, но с помощью оператора*мы можем описать это конечным образом, как { а б }*,
Кроме того, мы можем использовать регулярное выражение для описания этого языка, а именно ( Б )*, Как и все регулярные выражения, это конечная строка, но, как и большинство регулярных выражений, которые содержат* оператор, он описывает бесконечный язык.
Всякий раз, когда текст на формальных языках использует выражение, такое как ( Б )*это обозначает язык, спросите себя, обсуждает ли оно само регулярное выражение (например, как оно построено, какой язык он обозначает и т. д.) или просто использует регулярное выражение для ссылки на обозначаемый язык.
ab*
(звезда Клини) означает, что вы можете иметь ноль или более комбинаций строкиab
, включая потенциальное бесконечное число строк: {"", ab ^ 1, ab ^ 2, ab ^ 3, ... ., ab ^ n}. Тем не менее, вы все равно можете создать FSM, который распознает этот язык, потому что в действительности нет способа генерировать бесконечную строку, когда при обработке машиной все строки должны быть конечными, но это не делает сам язык конечным. Бесконечность языков является теоретической.