Files
mathlogic/lab3/report.tex

462 lines
26 KiB
TeX
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

\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}