using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Implab.Automaton { /// /// Алфавит. Множество символов, которые разбиты на классы, при этом классы имеют непрерывную нумерацию, /// что позволяет использовать их в качестве индексов массивов. /// /// /// Алфавит является сюрьективным отображением множества символов в множество индексов, это позволяет сократить размер таблицы переходов автомата /// для входных символов, которые для него не различимы. /// /// Тип символов. public interface IAlphabet { /// /// Количество классов символов в алфавите. /// int Count { get; } /// /// Создает карту обратного сопоставления класса символов алфавита и сопоставленным /// ему исходным символам. /// /// List[] CreateReverseMap(); /// /// Создает новый алфавит на основе текущего, горппируя его сиволы в более /// крупные непересекающиеся классы символов. /// /// Новый, пустой алфавит, в котором быдут определены классы. /// Множество классов символов текущего алфавита. /// Карта для перехода классов текущего /// алфавита к классам нового. /// Ползволяет укрупнить алфавит, объединив классы в текущем алфавите. Используется при оптимизации автомата. int[] Reclassify(IAlphabetBuilder newAlphabet, IEnumerable> classes); /// /// Преобразует входной символ в индекс символа из алфавита. /// /// Исходный символ /// Индекс в алфавите int Translate(TSymbol symobl); } }