Экспериментальная площадка для изучения формальных языков
Описание грамматики:
Категория = '{ Стрелки '} ; Стрелка = Слово | Область Слово Кообласть | Слово Кообласть | Область Слово ; Стрелки = Стрелка ', Стрелки | Стрелка ; Область = Ноль | '{ Стрелки '} ; Кообласть = Ноль | '{ Стрелки '} ; Слова = Слово ', Слова | Слово ; Слово = '[ Слова '] | Символы ; Символы = Символ Символы | Символ ; Символ = Буква | Цифра | Знак ; Буква = 'a|'b|'c|'d|'e|'f|'g|'h|'i|'j|'k|'l|'m|'n|'o|'p|'q|'r|'s|'t|'u|'v|'w|'x|'y|'z|'A|'B|'C|'D|'E|'F|'G|'H|'I|'J|'K|'L|'M|'N|'O|'P|'Q|'R|'S|'T|'U|'V|'W|'X|'Y|'Z| 'а|'б|'в|'г|'д|'е|'ё|'ж|'з|'и|'й|'к|'л|'м|'н|'о|'п|'р|'с|'т|'у|'ф|'х|'ц|'ч|'ш|'щ|'ь|'ы|'ъ|'э|'ю|'я|'А|'Б|'В|'Г|'Д|'Е|'Ё|'Ж|'З|'И|'Й|'К|'Л|'М|'Н|'О|'П|'Р|'С|'Т|'У|'Ф|'Х|'Ц|'Ч|'Ш|'Ь|'Щ|'Ъ|'Ы|'Э|'Ю|'Я ; Цифра = '0|'1|'2|'3|'4|'5|'6|'7|'8|'9 ; Знак = '< | '> | '* | '+ | '- | '~: | '~ | 'id | '_ | '>: | '<: ; Ноль = '{ '} ;
//Программа начинается и заканчивается фигурной скобкой, содержание в фигурных скобках - описание Категории //1. Ключевым понятием для всех объявлений программы является Слово. Слово - это любой идентификатор (упорядоченный набор символов и цифр) //или упорядоченный набор Слов. Упорядоченный набор Слов задается квадратными скобками, внутри которых через запятую перечисляются Слова. //Примеры Слов, состоящих из одно идентификатора: 0,1,А,Б,ЭтоСлово,Банан //Примеры составных Слов: [0,1],[Б,А,Н,А,Н] //При этом Слово "Банан" принципиально отличается от слова "[Б,А,Н,А,Н]", т.к. "Банан" - это один идентификатор, атом в понятиях теории категорий, //а "[Б,А,Н,А,Н]" - это составное Слово, состоящее из пяти атомов. // //2. Второе ключевое понятие Языка - Стрелка. Стрелка задаётся 4-мя способами: // 1) просто Словом - тогда у Стрелки есть только имя, // но Область и Кообласть пустые; // 2) Словом и Областью - задано имя и Область; // 3) Словом и Кообластью - задано имя и Кообласть; // 4) Словом и Областью и Кообластью - задано имя Область и Кообласть; --------------------------------------------------------------------------------------------------------------------------------------------- { А{Б}, Б{А}, В{Г}, Д, Е, Ж, З, Показать { [А,<:], [Б,<:], [Г,<:], [В,<:], [А,Б,*], //Произведение А на Б - стрелка [А,Б] [А,Б,+], //Сумма - сумма кообластей [А,Б,*,<:], //Кообласть [А,Б] - произведение кообластей А и Б [[А,Б,*],<:], //То же, что и строкой выше [А,Б,*,<:,[_,Б],~], //Отбор по шаблону из кообласти произведения [А,Б,*,<:,[_,А],~], //Тоже отбор, но по другому шаблону [В,Г,*,<:], //Без цикла, но с петлей на Г [В,Г,*,В,*,<:], //Результат В*Г домножаем на В (в состав которого входит Г) [Д,Е,*,<:], //произведение Д на Е. Д и Е не имеют кообластей [Д,Е,*,З,*,<:] //произведение [Д,Е] на З } } //Результат: //[А,<:]{А,Б} //[Б,<:]{Б,А} //[Г,<:]{Г} //[В,<:]{В,Г} //[А,Б,*]{[А,Б]} //[А,Б,+]{А,Б} //[А,Б,*,<:]{[А,Б],[А,А],[Б,Б],[Б,А]} //[[А,Б,*],<:]{[А,Б],[А,А],[Б,Б],[Б,А]} //[А,Б,*,<:,[_,Б],~]{[А,Б],[Б,Б]} //[А,Б,*,<:,[_,А],~]{[А,А],[Б,А]} //[В,Г,*,<:]{[В,Г],[Г,Г]} //[В,Г,*,В,*,<:]{[[В,Г],В],[[В,Г],Г],[[Г,Г],В],[[Г,Г],Г]} //[Д,Е,*,<:]{[Д,Е]} //[Д,Е,*,З,*,<:]{[[Д,Е],З]} --------------------------------------------------------------------------------------------------------------------------------------------- { A {1, 2}, B {3, 4}, Показать { [A,B,*,<] } } //Результат: //[A,B,*,<]{[A,B],[A,3],[A,4],[1,B],[1,3],[1,4],[2,B],[2,3],[2,4]} --------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------- { Вход Ядра { А, Б }, // Определим структурные элементы Ядра Выход Ядра { В, Г }, Ядро { [Вход Ядра, Выход Ядра,*] }, // Определим Ядро A, как декартово произведения Входа на Выход Первый Слой //Слои сети определяются через операции над ядрами - произведение, сумма { [ [ [Ядро,1], // Добавим ядру номер 1, [Ядро,2] // Добавим ядру номер 1, и получим два разных слова ],1 ] }, Второй Слой { [Ядро,2] }, Сеть { [ Первый Слой,Второй Слой,* //Сеть - декартово произведение первого слоя на второй ] }, Показать { [Сеть,<,<] } } //Результат: //{Сеть,[ПервыйСлой,ВторойСлой,*],[ПервыйСлой,ВторойСлой],[ПервыйСлой,[Ядро,2],*],[[[[Ядро,1],[Ядро,2]],1],ВторойСлой,*],[[[[Ядро,1],[Ядро,2]],1],[Ядро,2],*]}