我已经在这个项目上工作了将近一个星期,但是老实说它超出了我的理解,我在其他地方找不到帮助。
我现在的问题是,我只是不知道如何结合FSA' s。根据我的理解,我必须结合我的2个FSA,即主要的FSA和Odd 0 Parity FSA。
我对这个近一个星期的项目感到困惑,而且已经有一段时间了,所以现在提交它还为时已晚,但我仍然坚持下去,我真的很想要关闭它。
也有人可以解释为什么这个表达不起作用? (拒绝0100)
((00100|00011|010)(00100|00011|010))*0|((00100|00011|010)(00100|00011|010))*(00100|00011|010)1
答案 0 :(得分:1)
我不知道像这样合并FSA的一般方法,但这是针对您的具体问题的方法。
制作原始FSA的两份副本,然后打电话给他们。甚至'并且'奇怪'。不变量是,只要您处于其中一个子FSA的状态,奇偶校验就会由其名称指示。为此,每个0
转换必须跳转到另一个FSA中的相应节点; 1
转换在同一FSA中继续。
开始状态是Even。 Odd中的相应节点无法访问,可以删除。
所有原始接受状态都不再有效,因为您尚未验证奇偶校验位。在Odd中,每个州都需要1
过渡到新的接受状态。在Even中,来自前接受国的0
需要成为接受国;所有这些转换都已存在,因此它们的目标(节点#1)成为新的接受状态。
至于为什么你的正则表达式解决方案不起作用,请考虑其中的第一个子组:(00100|00011|010)
。这包括偶数和奇数0
s的子模式;你无法分辨哪一个匹配,所以你已经永久地忘记了最终的平价。你必须以某种方式安排整个正则表达式的每个部分只匹配具有相同奇偶校验的东西 - 我不完全确定这在传统的正则表达式中是可能的。 (如果我使用正则表达式的现代计算机实现来解决这个问题,我会使用先行断言来验证整体奇偶校验是一个完全独立的过程,而不是验证三种模式的串联。)
编辑:插图!
我们首先制作原始FSA的两份副本,标记为偶校验或奇校验。您还可以将此视为在第二个FSA中为第一个FSA中的每个节点制作节点的副本。
起始状态为Even,因为您最初的归零值为零。状态o0不可达,在其他图中将省略。标签尚未生效,因为每次0
转换时,奇偶校验都会发生变化 - 这些转换需要转到FSA的另一个副本。我无法通过graphviz来生成所有这些交叉甚至可以理解的东西,所以我不得不在偶数/奇数状态下放下方框。这是应用了交叉的图表:
这个FSA与原始句子的句子完全相同,只是你总是知道每个州是否有奇数或偶数奇偶校验。接受状态仍然与原始状态相同:为了处理最终的奇偶校验位,我们需要从每个状态添加一个最终转换到新的接受状态。从所有三个奇数接受状态开始,1
转换到标记为" o"的新状态。从所有四个偶数接受状态开始,最终的奇偶校验位将是0
转换 - 这恰好对应于现有的" o1"州。以下是最终图表,其中包含更新的接受状态:
答案 1 :(得分:0)
好的,这是我的想法jason很好地指出了你将遇到的问题,首先我会创建一个包含我的代码的表,并创建一组可以接受的字符串
A = 00100
B = 00011
c = 010
根据您的指南,可以使用一组可接受的字符串 000110 001000100001110
给你的字母代码表达式 使用偶数0奇偶校验属性可以接受001000。请注意,这只是A,因此A或C消息不会被接受。我建议您重做字母代码,3位代码会更容易,因为您将拥有更多可接受的字符串,而您的DFA可能会更小。
提供您的代码,很难实施仅限DFA的解决方案或仅使用简单的DFA解决方案。还要记住,字母之间的代码不应该是其他代码的前缀,这样可以简化您的问题。
我们的代码是
A = 101
B = 001
C = 110
然后我们有一组可接受的消息,其配对属性为0:
1010
1011010
1100
0011100
注意到在人类语言中,您将拥有一定数量的A,然后是0,任意数量的BC,然后是0,依此类推。你可以从那里开始形成你的正则表达式。我希望这很清楚。
答案 2 :(得分:0)
你想要的是一个接受两种语言所谓的交叉点的DFA:
(注意:我添加(0 + 1)代表你想要添加到最后的额外位。如果这不是你的意思,请忽略)。
我发布了一个经过深思熟虑的回答,讨论如何以这种方式组合DFA:请参阅here。简要总结:
在您的情况下,您将获得的DFA状态是第一个DFA的两倍。第一个"副本"那个DFA代表偶数平价,第二个"副本"将代表奇数平价。您的机器将像以前一样工作,但会在"副本之间来回反弹"每当你看到0时,只有奇数奇偶校验副本才会保持其接受状态。