Существует ли алгоритм / систематическая процедура для проверки того, является ли язык свободным от контекста?
Другими словами, учитывая язык, указанный в алгебраической форме (подумайте о чем-то вроде ), проверьте, является ли язык контекстно-свободным или нет , Представьте, что мы пишем веб-сервис, чтобы помочь студентам со всеми домашними заданиями; Вы указываете язык, и веб-служба выводит «без контекста» или «не контекстно-свободно». Есть ли хороший подход к автоматизации этого?
Конечно, существуют методы для ручного доказательства, такие как лемма прокачки, лемма Огдена, лемма Париха, лемма об обмене и многое другое здесь . Тем не менее, каждый из них требует ручного понимания в какой-то момент, поэтому не ясно, как превратить любой из них в нечто алгоритмическое.
Я вижу, что Каве писал в другом месте, что набор неконтекстно-свободных языков не является рекурсивно перечисляемым, поэтому, похоже, нет надежды на то, что какой-либо алгоритм будет работать на всех возможных языках. Поэтому, я полагаю, что веб-сервис должен был бы иметь возможность выводить «без контекста», «не без контекста» или «я не могу сказать». Есть ли какой-нибудь алгоритм, который часто мог бы дать ответ, отличный от «я не могу сказать», на многих языках, которые можно увидеть в учебниках? Как бы вы создали такой веб-сервис?
Чтобы сделать этот вопрос корректным, нам нужно решить, как пользователь будет указывать язык. Я открыт для предложений, но я думаю что-то вроде этого:
где - это слова-выражения, а - система линейных неравенств по переменным длины со следующими определениями:
Каждое из является словом-выражением. (Они представляют переменные, которые могут содержать любое слово в .)Σ
Каждое из является словом-выражением. (Неявно, , поэтому представляют один символ в основном алфавите.)
Каждое из является выражением слова, если является переменной длины.
Конкатенация слов-выражений является словом-выражением.
Каждый из является переменной длины. (Они представляют переменные, которые могут содержать любое натуральное число.)
Каждый из является переменной длины. (Они представляют длину соответствующего слова.)
Это кажется достаточно широким, чтобы охватить многие случаи, которые мы видим в упражнениях из учебника. Конечно, вы можете заменить любой другой текстовый метод указания языка в алгебраической форме, если хотите.
Ответы:
По теореме Райс увидеть, имеет ли язык, принимаемый машиной Тьюринга, какое-либо нетривиальное свойство (здесь: отсутствие контекста), невозможно. Таким образом, вам придется ограничить силу вашего распознающего механизма (или описания), чтобы он не был полон надежды на ответ.
Для некоторых языковых описаний ответ тривиален: если он с помощью регулярных выражений, то он регулярный, поэтому не зависит от контекста. Если это контекстно-свободные грамматики, то же самое.
источник
Любой язык принимается автоматами Push Down, это CFL. Вот подробная разбивка, чтобы определить, является ли язык CFL или нет. проверьте, является ли язык CFL или нет
источник
Попробуйте программное обеспечение JFLAP, если вы просто хотите проверить CFG. Вы можете даже попросить разработчиков JFLAP предоставить вам код или алгоритм для программного обеспечения. Вы можете получить JFLAP здесь http://www.jflap.org/jflaptmp/, это бесплатно, но для этого требуется JDK или JRE или что-то еще. Или, может быть, вы можете попробовать другие подобные программы и их разработчиков.
источник