【问题标题】:Implementing a code to simulate a finite automaton nondeterministic in c++在 C++ 中实现代码以模拟有限自动机非确定性
【发布时间】:2012-05-21 16:51:23
【问题描述】:

我正在为自动机理论做作业,我必须确定一个单词是否被确定性有限自动机的转移函数接受

我有这个输入文件:

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

它应该说明字符串是被接受还是被拒绝。到目前为止,我只对输入进行了编码。

我不知道如何最方便地表示自动机。我应该简单地使用数组吗?我会对数组应用什么逻辑?在事先不知道自动机字母表的情况下,有什么办法可以做到吗?我需要一个数据结构来表示自动机吗?我对这个任务有点坚持,并且想要一些想法,一些伪代码或想法来完成它。代码是另一种语言吗?我不想要这个解决方案,因为我想做我的任务,但如果我可以使用一些帮助

【问题讨论】:

  • 我不是该主题的专家,可能会在这里提出一个愚蠢的问题。为什么你有两个转换,你从同一个状态开始,你到达不同的状态,相同的事件/字符触发转换?这意味着状态本身也有内部状态?
  • @sergico:这就是为什么这样的图被称为非确定性的,有时会有几个转换。因此,您需要一些回溯。所有这样的自动机都可以用(更大的)确定性自动机来表示,但它可能不值得计算。

标签: c++ dfa automaton


【解决方案1】:

我认为你可以有一个 maptr 用于转换 where tr[(i, c)] = j 如果有从i 状态到j 状态的转换通过c,一个用于最终状态的数组fs[m] where m是最终状态的数量和初始状态的整数s0

Bellow 是具有此类属性的类的框架:

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

【讨论】:

  • 不错,transitions 数组除外。可能有几种方法可以从一种状态转换到另一种状态。更好的表示是有一个映射(状态,事件)-> 状态。 std::map&lt; std::pair&lt;int, char&gt;, int &gt; 自然适合这里。
  • 函数验证字符串是什么?
  • 也就是说,我想我必须继续尝试链,如果在此处理结束时字符串处于最终状态,则被接受,对吗?
  • @MihranHovsepyan Hovsepyan 我有一个疑问,自动机是不确定的,在条目的示例中,使用符号“a”你可以从状态 0 到状态 1。我如何处理这种确定性在我的代码中?我的意思是,我去什么状态来处理字符串?
  • @novaKid 对于每个有限非确定性自动机,您可以创建等效的有限确定性自动机。 en.wikipedia.org/wiki/…
猜你喜欢
  • 1970-01-01
  • 2020-09-01
  • 2018-07-14
  • 2019-06-23
  • 2017-11-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-17
  • 1970-01-01
相关资源
最近更新 更多