解析python中DFA的Transition状态列表

时间:2014-10-29 19:34:56

标签: dfa

课程DFA:

#Q=list of strings, alphabet = list of single char strings, s = start
#state, F = list of states(strings) from Q, delta = list of lists
def __init__(self, Q, alphabet, s, F, delta):
    self.states = Q
    self.alphabet = alphabet
    self.startS = s
    self.finalS = F
    self.delta = delta
    self.currentState = self.startS
    return

def transition_to_nextState(self,input_value):           
    if ((self.currentState + input_value) not in self.delta):
        self.currentState = None
        return self.currentState
    self.currentState = self.delta[self.currentState]
    return self.currentState

#go to start state
def isStartState(self):
    self.currentState = self.startS
    #print(self.startS)

#check in final state
def isAcceptState(self):
    if (self.currentState in self.finalS):
        print("accepted")
        return True
    else:
        print("not accepted")
        return False

#return True if inputStr is accepted and False if not
def processInputStr(self,inputStr):
    self.isStartState()
    for letter in inputStr:
        print("input:",letter)
        self.currentState = self.transition_to_nextState(letter)
        print("current state:", self.currentState)
        if (self.currentState == None):
            return self.isAcceptState()
        continue
    return self.isAcceptState()

我的transition_to_nextState函数无效。

正在发送DFA: 问:['q1','q2','q3'] 字母:['0','1'] s:'q1' F:['q2'] delta:[['q1','a','q1'],['q1','b','q2]]

我无法解析列表以找到机器应转换到的下一个状态。任何想法都会受到欢迎!

2 个答案:

答案 0 :(得分:0)

我认为问题出在这一行

if ((self.currentState + input_value) not in self.delta)

表达式self.currentState + input_value会给你一个连接的字符串,即如果input_value ='1'那么这将给你q11

虽然self.delta是列表列表,但您无法将字符串与列表匹配。

答案 1 :(得分:0)

我猜你正在使用delta列表作为状态转换。因此,如果给出self.currentState =" q1"和input_value =" a",我想你想在列表中找到下一个状态" q1"根据您的输入。也许将delta更改为元组=状态字典将有助于

# input to self.delta
delta = {('q1','a'):'q1', ('q1','b'): 'q2'}

# modify this line 
def transition_to_nextState(self,input_value):           
    if ((self.currentState, input_value) not in self.delta):
        self.currentState = None
        return self.currentState
    self.currentState = self.delta[(self.currentState,input_value)]
    return self.currentState