当我第一次遇到它时,这是我的推理路线:
我别无选择,只能使用猜测来达成解决方案。这是我想出的结果(1,2,3是完成状态,3是开始状态,如果收到输入' a,则7和9都变为1): 我还在这个上使用了DFA最小化,并发现它已经很小了。但是,教科书提供了另一种解决方案:
但我不明白这是怎么回事!我无法弄明白:(。我甚至不知道我的解决方案是否100%正确。请帮助我,非常感谢你:)。
答案 0 :(得分:2)
您的回答似乎是正确的。我没有仔细证明它,但逻辑相当清楚。此外,我写了一个Python程序来测试它:
def accepts(transitions,initial,accepting,s):
state = initial
for c in s:
state = transitions[state][c]
return state in accepting
dfa = {1:{'a':4, 'b':2},
2:{'a':10, 'b':3},
3:{'a':4, 'b':3},
4:{'a':7, 'b':5},
5:{'a':10, 'b':6},
6:{'a':7, 'b':6},
7:{'a':1, 'b':8},
8:{'a':10, 'b':9},
9:{'a':1, 'b':9},
10:{'a':10, 'b':10}}
def dfaTest(s):
return accepts(dfa,3,{1,2,3},s)
def valid(s):
return s.count('a') % 3 == 0 and not 'aba' in s
import random
tests = [''.join(random.choice(['a','b']) for j in range(100)) for i in range(1,1001)]
print(all(valid(s) == dfaTest(s) for s in tests))
this answer中解释了函数accepts
的操作。我根据您的图表进行了定制。为了对其进行压力测试,我生成了100,000个随机输入,其长度范围为1到1000,然后将DFA的输出与条件的直接验证进行比较。每次运行此代码时,输出都是令人满意的True
。
测试单个字符串:
>>> dfaTest('ababba')
False
>>> dfaTest('abbabba')
True