我正在攻读离散数学考试,我发现这个练习是我无法弄清楚的。
“为字母表中的语言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的那些
这有什么意义吗?我认为我的正则表达式是松弛的。
答案 0 :(得分:9)
我发现你的符号有点模糊,所以也许我完全误会了。如果是这样,请忽略以下内容。好像你还没到那里:
修改:这是怎样的( 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才是接受国。