بايثون غير حتمية إبسيلون أوتوماتون:الكائن غير قابل للتكرار
-
21-12-2019 - |
سؤال
لا بد لي من صنع إنسان آلي محدود غير حتمي باستخدام انتقالات إبسيلون.أنا أحب لغة البرمجة c وc# وجافا سكريبت، لكن جامعتي تعتقد أن لغة بايثون هي الطريقة الوحيدة للذهاب لسبب ما، لذلك تعلمت اليوم لغة بايثون، ولكن من الواضح أنها ليست كافية.
على أي حال.المشكلة في "automaton
" وظيفة.أسميها بقائمة الحالة الأولية بعنصر واحد (stanje1
) ومجموعة من الأحرف التي يجب على الإنسان قراءتها (inputArrays[0]
) مع القاموس الذي يحدد وظيفة الانتقال (مفتاح القاموس هو سلسلة currentState,inputCharacter
والقيمة هي مجموعة من الحالات التالية).
يعمل التكرار الأول بشكل جيد، ولكن عندما أرغب في التحقق بشكل متكرر من جميع الحالات التي حصلت عليها عبر انتقال epsilon مقابل الحرف التالي، أحصل على خطأ:
TypeError: 'NoneType' object is not iterable
يتم استدعاء التكرار التلقائي مع تعريف جميع الوسائط بشكل مشابه كما هو الحال في الاستدعاء العلوي، ومع ذلك يظهر الخطأ بطريقة ما.
هنا رابط إلى الكود الخاص بي, ، وكذلك ملف الاختبار ذلك يحدد الإنسان الآلي (تحتاج إلى تشغيله بهذه الطريقة 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
المحلول
تلميحك هو أن العطل يحدث على هذا السطر:
states += eNKA(s, ir[0], fn)
وليس أعمق داخل eNKA
وظيفة.قد تشك في أن هناك شيئًا ما على هذا الخط None
, ، بدلاً من التكرار. ir
لا يمكن أن يكون None
لأنك تحققت من هذا الاحتمال سابقًا، لذلك يجب أن تكون القيمة المرجعة لـ eNKA
يكون None
(وأنتم تفعلون بفعالية states += None
).
في الواقع، هذا هو الحال. eNKA
لا return
قيمة في كل حالة ممكنة، مما قد يؤدي إلى القيمة الافتراضية لـ None
يجب إعادته.
وبالتالي، فإن الإصلاح سيكون لمعرفة لماذا كل if
حالة في eNKA
يفشل، وأصلح ذلك بشكل مناسب (أو قم بإرجاع شيء أكثر منطقية في حالة فشل كل شرط).