Сокращения в NFA, python

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

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

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 — это метод, обрабатывающий строку для NFA и проверяющий, принимает она или отклоняет.

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 

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

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 = {}

Я думал об использовании сокращений, но постоянно получаю ошибку при попытке определить свои собственные сокращения, такие как

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)
])

Я получаю сообщение об ошибке "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.

разумный выбор или какие-либо лучшие решения?


person user2079185    schedule 16.02.2013    source источник


Ответы (1)


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

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

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

person sapht    schedule 16.02.2013