First version of text
This commit is contained in:
204
text.tex
Normal file
204
text.tex
Normal file
@@ -0,0 +1,204 @@
|
||||
\documentclass[11pt,a4paper]{scrartcl}
|
||||
\usepackage[affil-it]{authblk} % для указания ВУЗа
|
||||
\usepackage{fontspec}
|
||||
\usepackage{minted} % для включения исходников
|
||||
\defaultfontfeatures{Mapping=tex-text}
|
||||
\usepackage{xunicode}
|
||||
\usepackage{xltxtra}
|
||||
|
||||
\setsansfont{CMU Sans Serif}
|
||||
\setmainfont{CMU Serif}
|
||||
\setmonofont{Ubuntu Mono}
|
||||
\newfontfamily{\cyrillicfonttt}{Ubuntu Mono}
|
||||
|
||||
\defaultfontfeatures{Scale=MatchLowercase,Mapping=tex-text}
|
||||
\usepackage{polyglossia}
|
||||
\setdefaultlanguage{russian}
|
||||
\usepackage{amsmath}
|
||||
\usepackage{amsfonts}
|
||||
\usepackage{amssymb}
|
||||
\usepackage{amsthm}
|
||||
\usepackage{yfonts}
|
||||
\usepackage{theoremref}
|
||||
\usepackage{hyperref}
|
||||
\usepackage{graphicx}
|
||||
\usepackage{algorithm}
|
||||
\usepackage{algpseudocode}
|
||||
|
||||
\newtheorem{stm}{Утверждение}
|
||||
|
||||
\author{Алексей Лобанов, 318 группа%
|
||||
\thanks{E-mail: \texttt{i@likemath.ru}}}
|
||||
\affil{МГУ им. М.В.Ломоносова}
|
||||
|
||||
\author{Научный руководитель \\ доцент, д.ф.-м.н. С.Н.Селезнёва%
|
||||
\thanks{E-mail: \texttt{selezn@cs.msu.ru}}}
|
||||
\affil{ } % хак, чтобы не печатать ВУЗ дважды
|
||||
|
||||
\date{Москва, 2018}
|
||||
\title{Нахождение минимальных клонов двухзначных и трёхзначных логик}
|
||||
\addto\captionsrussian{\def\refname{Список используемых источников}}
|
||||
|
||||
\makeindex
|
||||
\begin{document}
|
||||
\maketitle
|
||||
\newpage
|
||||
|
||||
\section{Введение}
|
||||
По данной теме, для случая трёхзначной логики уже есть результаты \cite{csakany} и \cite{machida}. Для случаё четырёхзначной логики есть работа \cite{scholzel}, однако в данной курсовой работе проверяются только два условия:
|
||||
отсутствие функции большинства и полупроекции.
|
||||
|
||||
\section{Постановка задачи}
|
||||
В рамках данной курсовой работы рассмотриваются следующие задачи:
|
||||
\begin{enumerate}
|
||||
\item Написать программу,
|
||||
которая строит все минимальные клоны,
|
||||
порождаемые какой-то идемпотентной двухместной функцией
|
||||
$f$ трёхзначной логики.
|
||||
Получить экспериментальный результат
|
||||
в виде списка функций от двух переменных,
|
||||
содержащихся в каждом таком клоне.
|
||||
|
||||
\item Написать программу,
|
||||
которая строит все клоны,
|
||||
порождаемые какой-то идемпотентной двухместной функцией
|
||||
$f$ четырехзначной логики, не содержащие функций большинства и полупроекций. Получить экспериментальный результат
|
||||
в виде списка функций двух переменных,
|
||||
содержащихся в каждом таком клоне.
|
||||
\end{enumerate}
|
||||
|
||||
\section{Основная часть}
|
||||
Введём некоторые обозначения: $I_k^2$ -- все идемпотентные функции k-значной логики, $f_k^x$, $f_k^y$ -- функции k-значной логики, тождественно равные своему первому и второму аргументу соответсвенно
|
||||
|
||||
Простейшая реализация алгоритма решения данной задачи может не приветси к успеху: для $k=4$ количество функций в $I_4^2 = 4^{4\cdot4 - 4} = 4^{12} = 16777216$. Построение класса по каждой из них слишком трудоёмко, если знать, что некоторая часть этих классов по размеру сопоставимы с самим $I_4^2$. Таким образом, уже для $k=4$ необходим более быстрый алгоритм.
|
||||
|
||||
Для написания алгоритма решения поставленной задачи, воспользуемся следующими утверждениями.
|
||||
\begin{stm}
|
||||
Любая функция из $I_k^2$, кроме, быть может, $f_k^x$ и $f_k^y$ встречается не более, чем в одном минимальном классе
|
||||
\end{stm}
|
||||
|
||||
Алгоритм представим в виде трёх частей:
|
||||
\begin{enumerate}
|
||||
\item \textbf{Генерация функций для перебора} В этой части мы должны оставить для рассмотрения только те функции $f\left( x, y\right)$ из $I_k^2$, которые удовлетворяют следующим свойствам:
|
||||
\begin{enumerate}
|
||||
\item $f\left( x, y\right) = f_k^x$ или $f\left( x, y\right) = f_k^y$
|
||||
\item Из $f\left( x, y\right)$ можно получить $h(x, y, z)$, существенно зависящую от 3-х переменных, для которой $h(x, x, y) = h(x, y, x) = h(y, x, x) = x$
|
||||
%\item Из $f\left( x, y\right)$ можно получить $h(x, y, z) = x - y + z$,
|
||||
%где $+$ операция коммутативной группы на $\mathbb{E}_k$
|
||||
\item Из $f\left( x, y\right)$ можно получить $h(x_1, \ldots, x_k)$, $k \ge 3$, не равную $x_1, ..., x_k$,
|
||||
для которой верно: существует такое $i$, $1 \le i \le k$,
|
||||
что если среди элементов $x_1, \ldots, x_k$ хотя бы два совпадающих,
|
||||
то $f(x_1, \ldots, x_k) =x_i$. Такая функция называется \emph{полупроекцией}.
|
||||
\end{enumerate}
|
||||
Проверка каждого из этих свойств тривиальна, в том числе и вычислительно, относительно других частей.
|
||||
|
||||
Полученные функции мы кладём в очередь $d$.
|
||||
\item \textbf{Расширение множеств функций} В этой части мы берём один элемент из очереди, производим "расширение" класса функций \ref{alg:extending} и кладём в конец очереди. Причём расширение происходит таким образом, что на каждом расширении для одного и того же множества, $\frac{\texttt{max}_{n+1}}{\texttt{max}_n} = \lambda$, где $1 < \lambda < 2$, а $n$ -- номер расширения. Это необходимого для экономного расхода памяти ЭВМ.
|
||||
|
||||
\item \textbf{Обработка множеств функций после расширения} В этой части мы должны рассмотреть все обработанные множества функций и обработать их, псевдокод ниже \ref{alg:queue}. Это самая концептуально сложная часть алгоритма.
|
||||
\end{enumerate}
|
||||
|
||||
При такой декомпозиции возможно использовать многоядерность современных ЭВМ для распараллеливания расширения множеств функций, что позволяет почти линейно уменьшить время работы.
|
||||
|
||||
Опишем работу некоторых ключевых процедур.
|
||||
Главной такой является "расширение" множества функций \ref{alg:extending}.
|
||||
\begin{algorithm}
|
||||
\caption{Расширение множества функций}\label{alg:extending}
|
||||
\begin{algorithmic}
|
||||
\Function{ExtendFunctionClass}{class, max}
|
||||
\If {size(class) $\geq$ max}
|
||||
|
||||
\Return (class, False)
|
||||
\EndIf
|
||||
\State is\_finished $\gets$ False
|
||||
\State last\_size $\gets$ 0
|
||||
\While{True}
|
||||
\State new\_funcs $\gets \{\}$
|
||||
\Comment{Пустое множество}
|
||||
\ForAll{$f_1 \in$ class}
|
||||
\State new\_funcs.add(reversed($f_1$))
|
||||
\Comment{Для всех $f_1(x,y)$ добавим $f_1'(y,x)$}
|
||||
|
||||
\ForAll{$f_2 \in$ class}
|
||||
\State new\_funcs.add($f_1\left(f_2, y \right)$)
|
||||
\EndFor
|
||||
\EndFor
|
||||
\State new\_funcs.remove($f_k^x$)
|
||||
\State new\_funcs.remove($f_k^y$)
|
||||
\Comment{Могли добавиться тождественные функции, их нужно убрать}
|
||||
\If {size(new\_funcs) $=$ last\_size}
|
||||
\State is\_finished $\gets$ True
|
||||
\State \textbf{break}
|
||||
\Comment{Мы закончили построение этого класса функций}
|
||||
\EndIf
|
||||
|
||||
\State class $\gets$ class $\cup$ new\_funcs
|
||||
\State last\_size $\gets$ size(new\_funcs)
|
||||
|
||||
\If {size(class) $>$ max}
|
||||
\State \textbf{break}
|
||||
\Comment{Класс стал достаточно большим -- нужно выходить}
|
||||
\EndIf
|
||||
\EndWhile
|
||||
|
||||
\Return (class, is\_finished)
|
||||
|
||||
\EndFunction
|
||||
\end{algorithmic}
|
||||
\end{algorithm}
|
||||
|
||||
Также важной функцией является обработка новых \ref{alg:queue}
|
||||
\begin{algorithm}
|
||||
\caption{Обработка расширенных множеств}\label{alg:queue}
|
||||
\begin{algorithmic}
|
||||
\Function{ProcessSets}{class, max}
|
||||
\State заглушка
|
||||
|
||||
\Return (42)
|
||||
\EndFunction
|
||||
\end{algorithmic}
|
||||
\end{algorithm}
|
||||
Для реализации полученных алгоритмов для выполнения на ЭВМ был выбран язык программирования C++14.
|
||||
|
||||
\section{Полученные результаты}
|
||||
С помощью написанных программ для ЭВМ на языке программирования C++14 удалось получить решения поставленных задач.
|
||||
|
||||
Опишем кодирование решения. Пусть исходная функция имеет значения
|
||||
$$
|
||||
f\left( x, y \right) = \left( 0ab \: c1d \: et2 \right)
|
||||
$$
|
||||
тогда число $\overline{abcdet}$
|
||||
рассмотрим в десятичной системе и назовём \emph{номером функции}.
|
||||
|
||||
Для трехзначной логике список номеров порождающих функций ниже:
|
||||
|
||||
0, 8, 10, 11, 16,
|
||||
17, 20, 26, 33, 35,
|
||||
36, 37, 38, 40, 41,
|
||||
42, 43, 47, 53, 68,
|
||||
71, 80, 116,122, 125,
|
||||
178, 179, 188, 206, 215,
|
||||
280, 281, 286, 287, 290,
|
||||
296, 364, 368, 448, 449,
|
||||
458, 528, 530, 557, 624,
|
||||
692, 728. Всего 42 функции.
|
||||
|
||||
Для случая четырёхзначной логики таких функций 2279.
|
||||
|
||||
\section*{Приложение. Исходный код программы на C++14}
|
||||
\subsection*{main.cpp}
|
||||
\inputminted{C++}{main.cpp}
|
||||
\subsection*{al\_utility.hpp}
|
||||
\inputminted{C++}{al_utility.hpp}
|
||||
\subsection*{al\_utility.cpp}
|
||||
\inputminted{C++}{al_utility.cpp}
|
||||
\subsection*{finite\_function.hpp}
|
||||
\inputminted{C++}{finite_function.hpp}
|
||||
|
||||
\begin{thebibliography}{}
|
||||
\bibitem{csakany} B.Csakany -- All minimal clones on three-element set
|
||||
\bibitem{machida} Hajime Machida, Michael Pinsker -- Polynomials as Generators of Minimal Clones
|
||||
\bibitem{scholzel} Karsten Schölzel -- The minimal clones generated by semiprojections on a four-element set
|
||||
\end{thebibliography}
|
||||
|
||||
\end{document}
|
||||
Reference in New Issue
Block a user