先决条件——有限自动机简介
问题 –绘制包含 {a, b} 上所有字符串集合的语言的确定性有限自动机 (DFA),其中来自 RHS 的第二个符号是“a”。
倒数第二个符号是“a”的字符串是:
aa, ab, aab, aaa, aabbaa, bbbab etc
例如:
INPUT : baba
OUTPUT: NOT ACCEPTED
INPUT: aaab
OUTPUT: ACCEPTED
直接构造给定问题的 DFA 非常复杂。因此,在这里我们将设计非确定性有限自动机(NFA),然后将其转换为确定性有限自动机(DFA)。
包含来自 RHS 的第二个符号为“a”的所有字符串的语言的 NFA 是:
这里,A 是初始状态,C 是最终状态。
现在,我们要构建上述 NFA 的状态转移表。
之后我们将在NFA的状态转移表上使用子集配置绘制DFA的状态转移表。我们将提及 a 和 b 的所有可能转换。
现在,借助转换表绘制 DFA 变得非常容易。在这个 DFA 中,我们有四种不同的状态 A、AB、ABC 和 AC,其中 ABC 和 AC 是最终状态,A 是 DFA 的初始状态。
这是我们所需的语言 DFA,其中包含 {a, b} 上的所有字符串的集合,其中来自 RHS 的第二个符号是“a”。
过渡表:
STATES | INPUT (a) | INPUT (b) |
—> A (initial state) | AB | A |
AB | ABC* (final state) | AC* (final state) |
AC* (final state) | AB | A |
ABC* (final state) | ABC* (final state) | AC* (final state) |
Python实现:
def stateA(n):
#if length found 0
#print not accepted
if (len(n)==0):
print("string not accepted")
else:
#if at index 0
#'a' found call
#function stateAB
if(n[0]=='a'):
stateAB(n[1:])
#else if 'b' found
#call function A.
elif (n[0]=='b'):
stateA(n[1:])
def stateAB(n):
#if length found 0
#print not accepted
if (len(n)==0):
print("string not accepted")
else:
#if at index 0
#'a' found call
#function stateABC
if(n[0]=='a'):
stateABC(n[1:])
#else if 'b' found
#call function AC.
elif (n[0]=='b'):
stateAC(n[1:])
def stateABC(n):
#if length found 0
#print accepted
if (len(n)==0):
print("string accepted")
else:
#if at index 0
#'a' found call
#function stateABC
if(n[0]=='a'):
stateABC(n[1:])
#else if 'b' found
#call function AC.
elif (n[0]=='b'):
stateAC(n[1:])
def stateAC(n):
#if length found 0
#print accepted
if (len(n)==0):
print("string accepted")
else:
#if at index 0
#'a' found call
#function stateAB
if(n[0]=='a'):
stateAB(n[1:])
#else if 'b' found
#call function A.
elif (n[0]=='b'):
stateA(n[1:])
#take string input
n=input()
#call stateA
#to check the input
stateA(n)