\documentclass[a4paper, final]{article}
%\usepackage{literat} % Нормальные шрифты
\usepackage[14pt]{extsizes} % для того чтобы задать нестандартный 14-ый размер шрифта
\usepackage{tabularx}
\usepackage[T2A]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[russian]{babel}
\usepackage{amsmath}
\usepackage[left=25mm, top=20mm, right=20mm, bottom=20mm, footskip=10mm]{geometry}
\usepackage{ragged2e} %для растягивания по ширине
\usepackage{setspace} %для межстрочно   го интервала
\usepackage{moreverb} %для работы с листингами
\usepackage{indentfirst} % для абзацного отступа
\usepackage{moreverb} %для печати в листинге исходного кода программ
\usepackage{pdfpages} %для вставки других pdf файлов
\usepackage{tikz}
\usepackage{graphicx}
\usepackage{afterpage}
\usepackage{longtable}
\usepackage{float}



% \usepackage[paper=A4,DIV=12]{typearea}
\usepackage{pdflscape}
% \usepackage{lscape}

\usepackage{array}
\usepackage{multirow}

\renewcommand\verbatimtabsize{4\relax}
\renewcommand\listingoffset{0.2em} %отступ от номеров строк в листинге
\renewcommand{\arraystretch}{1.4} % изменяю высоту строки в таблице
\usepackage[font=small, singlelinecheck=false, justification=centering, format=plain, labelsep=period]{caption} %для настройки заголовка таблицы
\usepackage{listings} %листинги
\usepackage{xcolor} % цвета
\usepackage{hyperref}% для гиперссылок
\usepackage{enumitem} %для перечислений

\newcommand{\specialcell}[2][l]{\begin{tabular}[#1]{@{}l@{}}#2\end{tabular}}


\setlist[enumerate,itemize]{leftmargin=1.2cm} %отступ в перечислениях

\hypersetup{colorlinks,
    allcolors=[RGB]{010 090 200}} %красивые гиперссылки (не красные)

% подгружаемые языки — подробнее в документации listings (это всё для листингов)
\lstloadlanguages{ SQL}
% включаем кириллицу и добавляем кое−какие опции
\lstset{tabsize=2,
    breaklines,
    basicstyle=\footnotesize,
    columns=fullflexible,
    flexiblecolumns,
    numbers=left,
    numberstyle={\footnotesize},
    keywordstyle=\color{blue},
    inputencoding=cp1251,
    extendedchars=true
}
\lstdefinelanguage{MyC}{
    language=SQL,
%    ndkeywordstyle=\color{darkgray}\bfseries,
%    identifierstyle=\color{black},
%    morecomment=[n]{/**}{*/},
%    commentstyle=\color{blue}\ttfamily,
%    stringstyle=\color{red}\ttfamily,
%    morestring=[b]",
%    showstringspaces=false,
%    morecomment=[l][\color{gray}]{//},
    keepspaces=true,
    escapechar=\%,
    texcl=true
}

\textheight=24cm % высота текста
\textwidth=16cm % ширина текста
\oddsidemargin=0pt % отступ от левого края
\topmargin=-1.5cm % отступ от верхнего края
\parindent=24pt % абзацный отступ
\parskip=5pt % интервал между абзацами
\tolerance=2000 % терпимость к "жидким" строкам
\flushbottom % выравнивание высоты страниц


% Настройка листингов
\lstset{
    language=python,
    extendedchars=\true,
    inputencoding=utf8,
    keepspaces=true,
    % captionpos=b, % подписи листингов снизу
}

\begin{document} % начало документа
    


    % НАЧАЛО ТИТУЛЬНОГО ЛИСТА
    \begin{center}
        \hfill \break
        \hfill \break
        \normalsize{МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ\\
            федеральное государственное автономное образовательное учреждение высшего образования «Санкт-Петербургский политехнический университет Петра Великого»\\[10pt]}
        \normalsize{Институт компьютерных наук и кибербезопасности}\\[10pt] 
        \normalsize{Высшая школа технологий искусственного интеллекта}\\[10pt] 
        \normalsize{Направление: 02.03.01 <<Математика и компьютерные науки>>}\\
        
        \hfill \break
        \hfill \break
        \hfill \break
        \hfill \break
        \large{Лабораторная работа №3}\\
        \large{<<Грамматика простого прошедшего времени}\\
        \large{немецкого языка>>}\\
        \large{по дисциплине}\\
        \large{<<Математическая логика и теория автоматов>>}\\
        \large{Вариант 15}\\
        
        % \hfill \break
        \hfill \break
    \end{center}
    
    \small{ 
        \begin{tabular}{lrrl}
            \!\!\!Студент, & \hspace{2cm} & & \\
            \!\!\!группы 5130201/20102 & \hspace{2cm} & \underline{\hspace{3cm}} &Тищенко А. А. \\\\
            \!\!\!Преподаватель & \hspace{2cm} &  \underline{\hspace{3cm}} &  Востров А. В. \\\\
            &&\hspace{4cm}
        \end{tabular}
        \begin{flushright}
            <<\underline{\hspace{1cm}}>>\underline{\hspace{2.5cm}} 2025г.
        \end{flushright}
    }
    
    \hfill \break
    % \hfill \break
    \begin{center} \small{Санкт-Петербург, 2025} \end{center}
    \thispagestyle{empty} % выключаем отображение номера для этой страницы
    
    % КОНЕЦ ТИТУЛЬНОГО ЛИСТА
    \newpage
    
    \tableofcontents


    \newpage
    
    \section*{Введение}
    \addcontentsline{toc}{section}{Введение}
    Лабораторная №3 по дисциплине <<Математическая логика>> заключается в построении контексно-свободной грамматики подмножества естественного языка. В данном варианте рассматривается грамматика простого прошедшего времени немецкого языка. 
    
    Простое прошедшее время в немецком языке называется \textit{Претерит} или \textit{Претеритум} (нем. \textit{Präteritum} или нем. \textit{Imperfekt}). \textit{Претеритум} служит для передачи действия в прошлом. Это время не требует образования сложных конструкций, что позволяет относить его к простым формам.



    \newpage
    \section {Математическое описание}
    \subsection{КС-грамматика}

    \begin{verbatim}
    Предложение -> ПрямойПорядок | Инверсия
    ПрямойПорядок -> Подлежащее ДополнениеКПодлежащему Глагол  
                     ВторостепенныеЧлены Отрицание
    Инверсия -> Обстоятельство Глагол Подлежащее 
                ВторостепенныеЧлены Отрицание
    Подлежащее -> ИменнаяГруппа ПридаточноеПредложение | Местоимение
    ПридаточноеПредложение -> ", " Союз Подлежащее Глагол 
                              ВторостепенныеЧлены Отрицание ", " |
                              epsilon
    ВторостепенныеЧлены -> ВторостепенныйЧлен ВторостепенныеЧлены |
                           epsilon
    ВторостепенныйЧлен -> Обстоятельство | Дополнение
    Обстоятельство -> ОбстоятельствоВремени | ОбстоятельствоМеста |
                      ОбстоятельствоОбразаДействия
    ИменнаяГруппа -> АртикльЛибоМестоимение Прилагательные 
                     Существительное
    АртикльЛибоМестоимение -> Артикль | ПритяжательноеМестоимение |
                              epsilon
    Прилагательные -> Прилагательное Прилагательные | epsilon
    ДополнениеКПодлежащему -> Предлог Существительное | epsilon
    Дополнение -> АртикльЛибоМестоимение Прилагательные Существительное
    ОбстоятельствоМеста -> Предлог АртикльЛибоМестоимение Существительное
    Союз -> "welcher" | "welche" | "welches"
    Отрицание -> "nicht" | epsilon
    Местоимение -> "ich" | "du" | "er" | "sie" | "es" | "wir" |
                   "ihr" | "Sie"
    ПритяжательноеМестоимение -> "mein" | "dein" | "sein" |
                                 "unser" | "euer" | "ihre"
    Артикль -> "der" | "die" | "das" |  "ein" |  "eine" | "einen" | 
               "einem" | "einer"
    Прилагательное -> "alt" | "jung" | "groß" | "klein" | "schön" | 
                      "freundlich" | "süß" | "ruhig"
    Существительное -> "Mann" | "Frau" | "Kind" | "Buch" | "Brief" |
                       "Freund" | "Abendessen" | "Suppe"
    Предлог -> "in" | "auf" | "unter" | "aus" | "mit" | "für" | 
               "zu" | "am"
    ОбстоятельствоВремени -> "gestern" | "heute" | "morgen" | "damals" |
                             "jetzt" | "früh" | "spät" | "immer"
    ОбстоятельствоОбразаДействия -> "schnell" | "langsam" | "gut" | 
                                    "schlecht" | "laut" | "leise" | 
                                    "gern" | "fleißig"
    Глагол -> "las" | "schrieb" | "kochte" | "aß" | "ging" |
              "kam" | "sagte" | "machte"
    \end{verbatim}

    \subsection{БНФ-нотация}

    % \begin{verbatim}
    % Предложение ::= ПрямойПорядок | Инверсия
    
    % ПрямойПорядок ::= Подлежащее [ПридаточноеПредложение] 
    %             Глагол {ВторостепенныйЧлен} [Отрицание]

    % ПридаточноеПредложение ::= ", " Союз Подлежащее [ПридаточноеПредложение]
    %                      Глагол [Отрицание] ", "
    
    % Инверсия ::= Обстоятельство Глагол Подлежащее 
    %             [ПридаточноеПредложение] {ВторостепенныйЧлен} [Отрицание]

    % Обстоятельство ::= ОбстоятельствоВремени |
    %                    ОбстоятельствоМеста |
    %                    ОбстоятельствоОбразаДействия
    
    % ВторостепенныйЧлен ::= Обстоятельство |
    %                         КосвенноеДополнение |
    %                         ПрямоеДополнение

    % Подлежащее ::= Местоимение | ИменнаяГруппа

    % ИменнаяГруппа ::= [Артикль | ПритяжательноеМестоимение] 
    %                   {Прилагательное} Существительное 
    %                   [ДополнениеКПодлежащему]

    % ДополнениеКПодлежащему ::= Предлог Существительное
    
    % КосвенноеДополнение ::= Предлог ИменнаяГруппа

    % ПрямоеДополнение ::= [Артикль | ПритяжательноеМестоимение] 
    %                      {Прилагательное} Существительное

    % ОбстоятельствоМеста ::= Предлог [Артикль | ПритяжательноеМестоимение] 
    %                         Существительное

    % Союз ::= "welcher" (которого) | "welche" (которую)
    %          | "welches" (которого, ср. р)

    % Отрицание ::= "nicht"
    
    % Местоимение ::= "ich" (я) | "du" (ты) | "er" (он) | "sie" (она/они) |
    %                 "es" (оно) | "wir" (мы) | "ihr" (вы) | "Sie" (Вы)
    
    % ПритяжательноеМестоимение ::= "mein" (мой) | "dein" (твой) | 
    %                 "sein" (его) | "ihr" (её) | "unser" (наш) |
    %                 "euer" (ваш) | "ihre" (их)
    
    % Артикль ::= "der" | "die" | "das" |  "ein" | 
    %             "eine" | "einen" | "einem" | "einer"
    
    % Прилагательное ::= "alt" (старый) | "jung" (молодой) | 
    %     "groß" (большой) | "klein" (маленький) | "gut" (хороший) | 
    %     "schlecht" (плохой) | "schnell" (быстрый) | "langsam" (медленный)
    
    % Существительное ::= "Mann" (мужчина) | "Frau" (женщина) | 
    %             "Kind" (ребёнок) | "Buch" (книга) | "Brief" (письмо) | 
    %             "Freund" (друг) | "Abendessen" (ужин) | "Suppe" (суп)
    
    % Предлог ::= "in" (в) | "auf" (на) | "unter" (под) | "aus" (из) | 
    %            "mit" (с) | "für" (для) | "zu" (к) | "am" (на/в)
    
    % ОбстоятельствоВремени ::= "gestern" (вчера) | "heute" (сегодня) | 
    %                   "morgen" (завтра) | "damals" (тогда) | 
    %                   "jetzt" (сейчас) | "früh" (рано) | 
    %                   "spät" (поздно) | "immer" (всегда)
    
    % ОбстоятельствоОбразаДействия ::= "schnell" (быстро) | 
    %                          "langsam" (медленно) | 
    %                          "gut" (хорошо) | "schlecht" (плохо) | 
    %                          "laut" (громко) | "leise" (тихо) | 
    %                          "gern" (охотно) | "fleißig" (прилежно)
    
    % Глагол ::= "las" (читал) | "schrieb" (писал) | 
    %                           "kochte" (готовил) | "aß" (ел) | 
    %                           "ging" (шёл) | "kam" (пришёл) | 
    %                           "sagte" (сказал) | "machte" (делал)

    % Инфинитив ::= "lesen" (читать) | "schreiben" (писать) | 
    %              "kochen" (готовить) | "essen" (есть) |
    %              "gehen" (идти) | "kommen" (приходить) | 
    %              "sagen" (говорить) | "machen" (делать)
                 
    % Причастие ::= "gelesen" (прочитанный) | "geschrieben" (написанный) | 
    %                "gekocht" (приготовленный) | "gegessen" (съеденный) |
    %                "gegangen" (ушедший) | "gekommen" (пришедший) | 
    %                "gesagt" (сказанный) | "gemacht" (сделанный)
    
    % \end{verbatim}
    
    \subsection{Примеры предложений}

    Ich las gestern ein altes Buch

    Der alte Mann las ein Buch

    



    \subsection{Примеры предложений}
    
    \textbf{Пример 1: Der alte Mann las ein Buch.} (Старый мужчина читал книгу.)
    
    \begin{tabularx}{\textwidth}{|l|l|l|X|}
    \hline
    Позиция & Компонент & Элемент & Разбор по БНФ \\
    \hline
    1 & Подлежащее & der alte Mann & ИменнаяГруппа → Артикль + Прилагательное + Существительное \\
    \hline
    2 & Сказуемое & las & Глагол \\
    \hline
    3 & Второстепенные члены & ein Buch & ПрямоеДополнение → Артикль + Существительное \\
    \hline
    \end{tabularx}
    
    \vspace{0.5cm}
    
    \textbf{Пример 2: Gestern las der alte Mann ein Buch.} (Вчера старый мужчина читал книгу.)
    
    \begin{tabularx}{\textwidth}{|l|l|l|X|}
    \hline
    Позиция & Компонент & Элемент & Разбор по БНФ \\
    \hline
    1 & Обстоятельство & Gestern & ОбстоятельствоВремени → НаречиеВремени \\
    \hline
    2 & Сказуемое & las & Глагол \\
    \hline
    3 & Подлежащее & der alte Mann & ИменнаяГруппа → Артикль + Прилагательное + Существительное \\
    \hline
    4 & Второстепенные члены & ein Buch & ПрямоеДополнение → Артикль + Существительное \\
    \hline
    \end{tabularx}
    
    \vspace{0.5cm}
    
    \textbf{Пример 3: Mein Freund aus Berlin schrieb mir gestern einen Brief.} 
    
    (Мой друг из Берлина написал мне вчера письмо.)
    
    \begin{tabularx}{\textwidth}{|l|l|l|X|}
    \hline
    Позиция & Компонент & Элемент & Разбор по БНФ \\
    \hline
    1 & Подлежащее & Mein Freund aus Berlin & ИменнаяГруппа → ПритяжательноеМестоимение + Существительное + ДополнениеКПодлежащему (Предлог + Существительное) \\
    \hline
    2 & Сказуемое & schrieb & ПростойГлагол ВПретерите \\
    \hline
    3 & Второстепенные члены & mir & Косвенное Дополнение → Местоимение \\
    \hline
    4 & Второстепенные члены & gestern & Обстоятельство Времени → НаречиеВремени \\
    \hline
    5 & Второстепенные члены & einen Brief & ПрямоеДополнение → Артикль + Существительное \\
    \hline
    \end{tabularx}
    
    \vspace{0.5cm}
    
    \textbf{Пример 4: Am Abend kochte sie schnell das Abendessen in der Küche.}
    
    (Вечером она быстро приготовила ужин на кухне.)
    
    \begin{tabularx}{\textwidth}{|l|l|l|X|}
    \hline
    Позиция & Компонент & Элемент & Разбор по БНФ \\
    \hline
    1 & Обстоятельство & Am Abend & ОбстоятельствоВремени → Предлог + Существительное \\
    \hline
    2 & Сказуемое & kochte & Глагол \\
    \hline
    3 & Подлежащее & sie & Местоимение \\
    \hline
    4 & Второстепенные члены & schnell & ОбстоятельствоОбразаДействия \\
    \hline
    5 & Второстепенные члены & das Abendessen & ПрямоеДополнение → Артикль + Существительное \\
    \hline
    6 & Второстепенные члены & in der Küche & ОбстоятельствоМеста → Предлог + Артикль + Существительное \\
    \hline
    \end{tabularx}
    
    \vspace{0.5cm}
    
    \textbf{Пример 5: Er wollte ein Buch lesen.} (Он хотел прочитать книгу.)
    
    \begin{tabularx}{\textwidth}{|l|l|l|X|}
    \hline
    Позиция & Компонент & Элемент & Разбор по БНФ \\
    \hline
    1 & Подлежащее & Er & Местоимение \\
    \hline
    2 & Сказуемое & wollte lesen & СоставноеСказуемое → МодальныйГлаголВПретерите + Инфинитив \\
    \hline
    3 & Второстепенные члены & ein Buch & ПрямоеДополнение → Артикль + Существительное \\
    \hline
    \end{tabularx}


    \newpage
    \section{Особенности реализации}

    
    \newpage
    \section{Результаты работы программы}
    % Результаты работы программы представлены на Рис.~\ref{fig:result1}.

    % \begin{figure}[h!]
    %    \centering
    %    \includegraphics[width=1\linewidth]{img/result1.png}
    %    \caption{Результаты работы программы.}
    %    \label{fig:result1}
    % \end{figure}

    % \newpage

    % \begin{figure}[h!]
    %    \centering
    %    \includegraphics[width=0.8\linewidth]{img/wrong.png}
    %    \caption{Реакция программы на некорректный пользовательский ввод.}
    %    \label{fig:wrong}
    % \end{figure}

    % На Рис.~\ref{fig:wrong} представлена реакция программы на некорректный пользовательский ввод.


    \newpage
    \section*{Заключение}
    \addcontentsline{toc}{section}{Заключение}
    В ходе выполнения лабораторной работы было построено регулярное выражение для распознавания различных форматов вещественных чисел. В соответствии с теоремой Клини по заданному регулярному выражению, задающему регулярный
    язык, был построен недетерминированный конечный автомат-распознаватель. Затем полученный конечный автомат был детерминирован. На основе разработанного автомата была реализована программа, которая проверяет соответствие входной строки заданному формату и генерирует случайные корректные строки.

    Из достоинств выполнения лабораторной работы можно выделить структурирование кода за счёт использования ООП. Вся логика работы с конечными автоматами вынесена в отдельный класс \texttt{FiniteAutomaton} с четко разделенными методами для проверки строк и генерации случайных строк. Создана удобная интерактивная консольная оболочка для взаимодействия с пользователем, позволяющая выполнять различные команды.

    К недостаткам текущей реализации можно отнести следующие аспекты. Во-первых, переходы в автомате представлены в виде строк, содержащих допустимые символы, такой способ представления переходов не является самым оптимальным с точки зрения производительности. Во-вторых, в реализации генерации случайных строк вероятность остановки одинакова для всех финальных состояний, что может приводить к неравномерному распределению различных форматов чисел в генерируемых строках.

    Функционал программы несложно масштабировать. Класс \texttt{FiniteAutomaton} может быть использован для работы с различными конечными автоматами-распознавателями. Для изменения распознаваемого языка достаточно задать новые параметры для автомата, не меняя базовую логику программы. Однако, текущая реализация работает только с символьными переходами, поэтому задать строчные переходы в виде, например, регулярных выражений не представляется возможным. Однако подобный функционал также несложно реализовать, взяв за основу существующий код.

    На выполнение лабораторной работы ушло около 10 часов. Работа была выполнена в среде разработки Visual Studio Code. Программа написана на Python версии 3.10.

\newpage
\section*{Список литературы}
\addcontentsline{toc}{section}{Список литературы}

\vspace{-1.5cm}
\begin{thebibliography}{0}
    \bibitem{vostrov}
    Востров, А.В. Курс лекций по дисциплине <<Математическая логика>>. URL \url{https://tema.spbstu.ru/compiler/} (дата обращения 01.04.2025 г.)
    \bibitem{lutz}
    Лутц, М. Изучаем Python. 5-е изд. / М. Лутц. — СПб.: Питер, 2019. — 1216 с.    
    \bibitem{friedl}
    Фридл, Дж. Регулярные выражения = Mastering Regular Expressions / Дж. Фридл. — СПб.: Питер, 2001. — 352 с. — (Библиотека программиста).
\end{thebibliography}

\end{document}