Сокращения в NFA, питоне
Я пытаюсь создать метод пропуска аббревиатур из одной точки в другую.
Я создал 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 = {}
Я думал об использовании abrs, но я постоянно получаю ошибку, когда пытаюсь определить свои собственные 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.
разумный выбор или лучшие решения?
1 ответ
Ошибка вызвана __init__
не принимая abrs
Параметр ключевого слова, как он определен.
def __init__(self,start=None, finals=None, edges=None):
Вам нужно abrs=None
(или другое значение), чтобы сделать его ключевым аргументом или abrs
сделать это обязательным аргументом.