Как написать DFA на C#

250
22 октября 2017, 19:17

как эту схеиму перевести в код. Это DFA ( Детерминированные конечные автоматы )

Answer 1

Смотрите.

Для начала, вам нужно построить класс, описывающий состояние DFA. Что в нём есть? Список переходов, плюс признак того, заключительное ли это состояние.

Переходы проще всего кодировать словарём, отображающим символ входного алфавита на новое состояние. Символы входного алфавита закодируем как char.

Получаем:

class State
{
    public string Name;
    public Dictionary<char, State> Transitions;
    public bool IsAcceptState;
}

(я добавил ещё и имя, хотя оно по сути не нужно).

Вам нужно создать узлы, и связать их в таблицу состояний. Узлы будут наподобие такого:

State q4 = new State()
{
    Name = "Q4",
    IsAcceptState = false,
    Transitions = new Dictionary<char, State>()
    {
        ['0'] = q2 // если приходит 0, переходим в состояние q2
    }
};

(подумайте, как сделать так, чтобы первый узел мог ссылаться в таблице переходов на второй!)

Теперь, вам нужно определить класс для самого автомата, который содержит список состояний, и начальное состояние (это делайте сами, тут просто). Затем, что есть результат пробега DFA по строке? В конце мы либо оказываемся в финальном, либо в нефинальном состоянии. Ещё машина может остановиться, если перехода из какого-то состояние нет. Это удобно закодировать типом данных bool?.

Сам код пробега (интерпретатор конечного автомата) получается очень простым.

public bool? Run(IEnumerable<char> s)
{
    State current = InitialState;
    foreach (var c in s) // цикл по всем символам 
    {
        current = current.Transitions[c]; // меняем состояние на то, в которое у нас переход
        if (current == null)              // если его нет, возвращаем признак ошибки
            return null;
        // иначе переходим к следующему
    }
    return current.IsAcceptState;         // результат true если в конце финальное состояние 
}

Все части картины есть, собирайте!

READ ALSO
Как разбить строку на блоки Regex&#39;ами?

Как разбить строку на блоки Regex'ами?

Надо разбить строку на поляПоля выделены кавычками (двойными или одинарными):

254
Возврат значения из JS функции в CefSharp.Wpf

Возврат значения из JS функции в CefSharp.Wpf

Пытаюсь возвратить значение JS функции на странице, загруженной в CEF браузере, используя метод EvaluateScriptAsyncПосетил десятки веб-страниц и документаций,...

421
Задача на многопоточность [требует правки]

Задача на многопоточность [требует правки]

В институте задали задачу по с#Не могу решить ее:

418
Удаление пользователя ASP.NET Identity

Удаление пользователя ASP.NET Identity

Пытаюсь удалить пользователя:

280