Недетерминированный эпсилон-автомат 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 не удается, и исправить это соответствующим образом (или вернуть что-то более разумное, если каждое условие не выполняется).

Другие вопросы по тегам