162
+ − 1 using System;
+ − 2 using System.Collections.Generic;
+ − 3 using System.Linq;
+ − 4 using System.Text;
+ − 5 using System.Threading.Tasks;
+ − 6
+ − 7 namespace Implab.Automaton {
+ − 8 /// <summary>
+ − 9 /// Алфавит. Множество символов, которые разбиты на классы, при этом классы имеют непрерывную нумерацию,
+ − 10 /// что позволяет использовать их в качестве индексов массивов.
+ − 11 /// </summary>
+ − 12 /// <remarks>
+ − 13 /// <para>Алфавит является сюрьективным отображением множества символов в множество индексов, это позволяет сократить размер таблицы переходов автомата
+ − 14 /// для входных символов, которые для него не различимы.</para>
+ − 15 /// </remarks>
+ − 16 /// <typeparam name="TSymbol">Тип символов.</typeparam>
+ − 17 public interface IAlphabet<TSymbol> {
+ − 18 /// <summary>
+ − 19 /// Количество классов символов в алфавите.
+ − 20 /// </summary>
+ − 21 int Count { get; }
+ − 22
+ − 23 /// <summary>
+ − 24 /// Создает карту обратного сопоставления класса символов алфавита и сопоставленным
+ − 25 /// ему исходным символам.
+ − 26 /// </summary>
+ − 27 /// <returns></returns>
+ − 28 List<TSymbol>[] CreateReverseMap();
+ − 29
+ − 30 /// <summary>
+ − 31 /// Создает новый алфавит на основе текущего, горппируя его сиволы в более
+ − 32 /// крупные непересекающиеся классы символов.
+ − 33 /// </summary>
+ − 34 /// <param name="newAlphabet">Новый, пустой алфавит, в котором быдут определены классы.</param>
+ − 35 /// <param name="classes">Множество классов символов текущего алфавита.</param>
+ − 36 /// <returns>Карта для перехода классов текущего
+ − 37 /// алфавита к классам нового.</returns>
+ − 38 /// <remarks>Ползволяет укрупнить алфавит, объединив классы в текущем алфавите. Используется при оптимизации автомата.</remarks>
+ − 39 int[] Reclassify(IAlphabetBuilder<TSymbol> newAlphabet, IEnumerable<IEnumerable<int>> classes);
+ − 40
+ − 41 /// <summary>
+ − 42 /// Преобразует входной символ в индекс символа из алфавита.
+ − 43 /// </summary>
+ − 44 /// <param name="symobl">Исходный символ</param>
+ − 45 /// <returns>Индекс в алфавите</returns>
+ − 46 int Translate(TSymbol symobl);
+ − 47 }
+ − 48 }