2013-02-16 5 views
0

Я пытаюсь создать метод, при котором аббревиатуры пропускаются с одной точки на другую.Сокращения в NFA, python

Я создал НКА с текущими краями

EDGES = [ 
(0, 'h', 1), 
(1,'a',2), 
(2,'z', 3), 
(3,'a',4), 
(4, 'r', 5), 
(5, 'd', 6) 
)] 

Пример того, что я пытаюсь выполнить nrec("h-rd", nfa, 1) должен вернуть accept

nrec является метод, который обрабатывает строку для НЛА и проверяет, принимает ли он или отклоняет.

def nrec(tape, nfa, trace=0): 
"""Recognize in linear time similarly to transform NFA to DFA """ 
char = "-" 
index = 0 
states = [nfa.start] 
while True: 
    if trace > 0: print " Tape:", tape[index:], " States:", states 
    if index == len(tape): # End of input reached 
     successtates = [s for s in states 
          if s in nfa.finals] 
     # If this is nonempty return True, otherwise False. 
     return len(successtates)> 0 
    elif len(states) == 0: 
     # Not reached end of string, but no states. 
     return False 
    elif char is tape[index]: 

    # the add on method to take in abreviations by sign: - 
    else: 
     # Calculate the new states. 
     states = set([e[2] for e in nfa.edges 
          if e[0] in states and 
           tape[index] == e[1] 
         ]) 
     # Move one step in the string 
     index += 1 

Мне нужно добавить метод, который принимает сокращения в учетной записи. Я не совсем уверен, как я могу перейти из одного состояния в другое. Это то, что в классе НКЕ:

def __init__(self,start=None, finals=None, edges=None): 
    """Read in an automaton from python shell""" 
    self.start = start 
    self.edges = edges 
    self.finals = finals 
    self.abrs = {} 

Я учил об использовании ОБРСА, но я constatly получить-й ошибку при попытке определить свой собственный ОБРС, такие как

nfa = NFA(
start = 0, 
finals = [6], 
abrs = {0:4, 2:5}, 
edges=[ 
(0,'h', 1), 
(1,'a', 2), 
(2,'z', 3), 
(3,'a', 4), 
(4,'r', 5), 
(5,'d', 6) 
]) 

I Получать ошибку «TypeError : init() получил неожиданный аргумент ключевого слова 'abrs' " Почему я получаю эту ошибку?

для модификации я учил я сделать что-то вроде этого

elif char is tape[index]: 
#get the next char in tape tape[index+1] so 
#for loop this.char with abrs states and then continue from that point. 

разумного выбора или любых лучших решений?

ответ

0

Ошибка вызвана __init__ не принимает параметр ключевого слова abrs, как он определен.

def __init__(self,start=None, finals=None, edges=None):

Вы должны были бы abrs=None (или другое значение), чтобы сделать его ключевое слово аргумент или abrs, чтобы сделать его обязательным аргументом.