Реализация кода для моделирования недетерминированных конечных автоматов в 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
};