实施代码以模拟有限自动机在C ++不确定性(Implementing a code to simul

2019-06-24 10:04发布

我做了自动机理论的任务,我必须确定是否一个字是由过渡功能的确定性有限自动机接受或不

我有这个输入文件:

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到与字符C.状态j以下这条线来与一个整数S,其中将包含字符串进行测试,则S线与各个串的数目。

这个程序的输出应该是:

Case #2:
aaabcccc Rejected
aabbbbcdc Rejected
acdddddd Accepted

应该说,如果字符串被接受或拒绝。 到目前为止,我只编码和输入工作。

我不知道怎么会是最方便的代表自动机 。 我应该简单地使用数组? 我将适用于阵列逻辑是什么? 有没有办法做到这一点无需事先知道自动字母? 我需要一个数据结构来表示自动机? 我有点坚持了这项任务,并希望一些想法,一些伪代码或想法去做。 在另一种语言的代码? 我不想解决方案,因为我要尽我的任务,但如果我可以使用一些帮助

Answer 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
};


文章来源: Implementing a code to simulate a finite automaton nondeterministic in c++