Недетерминированный эпсилон-автомат Python: объект не повторяется
Я должен сделать недетерминированный конечный автомат с эпсилон-переходами. Я в большей степени специалист по ac, C#, JavaScript, но мой университет считает, что питон - это единственный путь, по которому я почему-то работал, поэтому сегодня я выучил python, но этого явно недостаточно.
Тем не мение. Проблема в "automaton
"функция. Я называю это списком начальных состояний с одним элементом (stanje1
) и массив символов, которые должен прочитать автомат (inputArrays[0]
) вместе со словарем, который определяет функцию перехода (ключом словаря является строка currentState,inputCharacter
и значение является массивом следующих состояний).
Первая итерация работает нормально, но когда я хочу рекурсивно проверить все состояния, которые я получил с помощью перехода epsilon на следующий символ, я получаю ошибку:
TypeError: 'NoneType' object is not iterable
Автоматическая рекурсия вызывается со всеми аргументами, определенными так же, как в вызове top, но ошибка как-то просто выскакивает.
Вот ссылка на мой код, а также тестовый файл, который определяет автомат (вам нужно запустить его так myScript.py < automaton.txt
). Кроме того, вот полный отчет об ошибке:
C:\Users\Jinx\Desktop\UTRLabos1>sim.py < test.txt
['stanje1']
['st6']
Traceback (most recent call last):
File "C:\Users\Jinx\Desktop\UTRLabos1\sim.py", line 50, in <module>
print(automaton(['stanje1'], inputArrays[0], transitionFunction))
File "C:\Users\Jinx\Desktop\UTRLabos1\sim.py", line 45, in automaton
if estates : other = automaton(estates, ir[1:], fn)
File "C:\Users\Jinx\Desktop\UTRLabos1\sim.py", line 37, in automaton
states += eNKA(s, ir[0], fn)
TypeError: 'NoneType' object is not iterable
1 ответ
Ваш намек на то, что сбой происходит в этой строке:
states += eNKA(s, ir[0], fn)
и не глубже eNKA
функция. Вы можете подозревать, что что-то в этой строке None
вместо итерируемого. ir
не может быть None
потому что вы проверили эту возможность ранее, поэтому должно быть так, что возвращаемое значение eNKA
является None
(и вы эффективно делаете states += None
).
На самом деле, это так. eNKA
не return
значение в каждом возможном случае, что может привести к значению по умолчанию None
быть возвращенным.
Таким образом, исправление было бы видеть, почему каждый if
состояние в eNKA
не удается, и исправить это соответствующим образом (или вернуть что-то более разумное, если каждое условие не выполняется).