我如何构建这个有限自动机?

时间:2009-05-19 22:50:22

标签: regex discrete-mathematics finite-automata

我正在攻读离散数学考试,我发现这个练习是我无法弄清楚的。

“为字母表中的语言Sigma = {0,1,2}构建一个基本的有限自动机(DFA,NFA,NFA-lambda),其中字符串中元素的总和是并且此总和大于3"

我尝试使用Kleene的Theorem连接两种语言,例如连接与此正则表达式相关联的语言:

(00 U 11 U 22 U 02 U 20)* - 偶数元素

这一个

(22 U 1111 U 222 U 2222)* - 总和大于3的那些

这有什么意义吗?我认为我的正则表达式是松弛的。

4 个答案:

答案 0 :(得分:9)

我发现你的符号有点模糊,所以也许我完全误会了。如果是这样,请忽略以下内容。好像你还没到那里:

  • 我认为*表示'0次或更多次'。但是,必须出现sum> = 3的字符串之一。这就是说你需要一个+('1次或更多次')。
  • 112和211在字符串列表中缺少,并且> = 3。
  • 该列表中的
  • 222和2222是多余的。
  • 所有这些字符串可以任意穿插0。
  • 00的总和不等于0的总和。

修改:这是怎样的( acc 是唯一接受的州,dot-source):

automaton http://student.science.uva.nl/~sschroev/so/885411.png

在状态 a c 时,字符串sum总是奇数。在状态开始 b acc ,总和始终是偶数。此外,在 start 处,总和为0,在 b 处为2且在 d 处为> = 4.这可以证明相当容易。因此,接受状态 acc 符合所有标准。

编辑2:我会说这是一个接受所请求语言的正则表达式:

0*(2|(1(0|2)*1))(0*(2|(1(0|2)*1))+

答案 1 :(得分:2)

不确定这是否正在回答您的问题,但是:您是否需要提交正则表达式?或FSM会这样做吗?

无论如何,首先绘制FSM可能会有所帮助,我认为这是正确的DFA:

FSM http://img254.imageshack.us/img254/5324/fsm.png

如果是这种情况,那么在构造正则表达式时(记住,它的语法与编程“正则表达式”不同):

0*表示“0您想要的次数”。这是有道理的,因为你的字符串中的0不会改变机器的状态。 (参见,在FSM中,0只是循环回到自身)

您需要考虑“112”或“22”等的不同组合 - 直到您的总金额至少达到4。

如果你的总和大于3,甚至,那么(0 | 2)*会让你处于最终状态。否则(总和> 3,奇数)你需要像1(0 | 2)*这样的东西才能让你处于接受状态。

(不知道这是否有帮助,或者它是否正确 - 但它可能是一个开始!)

答案 2 :(得分:0)

在Stephan的指导下,每个表达可能是:

(0 * U 2 * U 11)* - 偶数总和

这一个

(22 U 11 U 222 U 112 U 211 U 121)+ - 总和大于3的那些

我不知道它是否可以更简单,它有助于设计自动机。

答案 3 :(得分:0)

我觉得从国家角度来思考就更容易了。使用五种状态:0,1,2,偶数,奇数

过渡:

State, Input -> New State

(0, 0) -> 0
(0, 1) -> 1
(0, 2) -> 2

(1, 0) -> 1
(1, 1) -> 2
(1, 2) -> ODD

(2, 0) -> 2
(2, 1) -> ODD
(2, 2) -> EVEN

(ODD, 0) -> ODD
(ODD, 1) -> EVEN
(ODD, 2) -> ODD

(EVEN, 0) -> EVEN
(EVEN, 1) -> ODD
(EVEN, 2) -> EVEN

只有EVEN才是接受国。