以下是一个简单的自动机(Finite Automaton)的代码示例,它实现了一个确定性有限自动机(DFA)。这个 DFA 接受字符串“ab”的正则语言,表示包含“ab”子串的字符串。我们将创建一个 DFA 类,它能够接受一个输入字符串,并检查该字符串是否符合 DFA 的规则。
Python 代码实现:
class DFA:
def __init__(self, states, alphabet, transition_function, start_state, accept_states):
"""
初始化 DFA
:param states: 状态集合
:param alphabet: 字母表(输入符号集合)
:param transition_function: 转移函数,字典形式 {state: {symbol: next_state}}
:param start_state: 初始状态
:param accept_states: 接受状态集合
"""
self.states = states
self.alphabet = alphabet
self.transition_function = transition_function
self.start_state = start_state
self.accept_states = accept_states
def process(self, input_string):
"""
处理输入字符串,并判断是否接受
:param input_string: 输入字符串
:return: 如果接受该字符串则返回 True,否则返回 False
"""
current_state = self.start_state
for symbol in input_string:
if symbol not in self.alphabet:
raise ValueError(f"输入符号 {symbol} 不在字母表中")
current_state = self.transition_function[current_state].get(symbol)
if current_state is None:
return False
return current_state in self.accept_states
# 定义 DFA 的状态、字母表、转移函数等
states = {'q0', 'q1', 'q2'} # 三个状态
alphabet = {'a', 'b'} # 字母表
start_state = 'q0' # 初始状态
accept_states = {'q2'} # 接受状态
# 定义转移函数
transition_function = {
'q0': {'a': 'q1', 'b': 'q0'},
'q1': {'a': 'q1', 'b': 'q2'},
'q2': {'a': 'q2', 'b': 'q2'}
}
# 创建 DFA 实例
dfa = DFA(states, alphabet, transition_function, start_state, accept_states)
# 测试输入
input_string = "aab"
print(f"输入字符串 '{input_string}' 是否被接受: {dfa.process(input_string)}")
input_string = "baba"
print(f"输入字符串 '{input_string}' 是否被接受: {dfa.process(input_string)}")代码说明:
-
状态(States): DFA 有三个状态:
q0,q1,q2。q0是初始状态。q2是接受状态。
-
字母表(Alphabet): DFA 只接受
a和b两个符号。 -
转移函数(Transition Function):
- 从
q0读取a会转移到q1,读取b会留在q0。 - 从
q1读取a会留在q1,读取b会转移到q2。 - 从
q2读取a或b都会留在q2。
- 从
-
接受状态(Accept States): 只有当 DFA 结束时位于
q2状态时,它才会接受输入字符串。 -
处理输入:
process方法根据转移函数和输入字符串检查是否接受该字符串。
示例输出:
输入字符串 'aab' 是否被接受: True
输入字符串 'baba' 是否被接受: True
总结:
这个自动机实现了一个简单的 DFA,检查输入字符串是否包含 ab 子串。这个例子可以扩展为更复杂的自动机,例如非确定性有限自动机(NFA),或者更复杂的正则语言识别。