Реализация кода для моделирования недетерминированных конечных автоматов в C++

Я делаю задание для теории автоматов, которое я должен определить, принято ли слово или нет переходной функцией для детерминированного конечного автомата

у меня есть этот входной файл:

6 8 0 2
2
5
0 0 a
0 1 a
1 1 b
1 2 c
1 3 c
3 4 d
4 4 d
4 5 d
3
aaabcccc
aabbbbcdc
acdddddd

вход начинается с 4 целых чисел, первое-это число состояний для автомата, следующее-число переходов автомата, третье-начальное состояние, а затем число конечных состояний. затем наступают заключительные состояния (в пример конечного состояния 2 и 5).

затем приходят N строк (N-количество переходов), каждая с 2 целыми числами и символом, I, J и C, представляющими состояния, в которых переход, т. е. переход идет из состояния i в состояние J с символом C. После этой строки приходят с одним целым числом S, которое будет содержать количество строк для проверки, затем s строк с соответствующими строками.

выход этой программы должен быть:

Case #2:
aaabcccc Rejected
aabbbbcdc Rejected
acdddddd Accepted

он должен сказать, принята ли строка или отклонена. До сих пор я кодировал работу только с помощью ввода.

я не знаю, как было бы удобнее всего представлять автомат. Должен ли я просто использовать массивы? Какую логику я применил бы к массивам?. Есть ли способ сделать это, не зная заранее алфавита автомата? Нужна ли структура данных для представления автоматов?. Я немного застрял с этим заданием, и хотел бы некоторые идеи, какой-то псевдокод или идеи для этого. Код на другом языке? Мне не нужно решение, потому что я хочу выполнить свое задание, но если бы я мог использовать некоторую помощь

1 ответов


Я думаю, вы можете иметь картуtr для переходов, где tr[(i, c)] = j Если есть переход от i государство j государство через c массив для конечных состояний fs[m] здесь m - число конечных состояний и целое число для начального состояния s0.

Ниже приведен фрейм класса с такими свойствами:

class Automata
{
public:
    Automata(int start) : s0(start)
    {}

    void add_transition(int i, int j, char c) {
        //...
    }

    void add_final_state(int i) {
        //...
    }

    bool validate_string(const std::string& str) {
        //...
    }
private:
    std::map<std::pair<int, char>, int> tr; // transitions
    std::vector<int> fs; // final states
    int s0; // initial state
};