ДКА в основном определяется transition table
. Эта таблица переходов отображает каждый (действительный) сочетание текущего состояния и тока вход в соответствующее состояние-преемник.Такую таблицу можно смоделировать как словарь словарей.Например: внешний dict содержит состояния как ключи и словари как значения, эти словари, в свою очередь, имеют действительные входы как ключи и состояние преемника как значение.
EDIT: Ваш выбранный пример не идеален, так как он имеет довольно большой алфавит (т.е. все возможные входные символы) не менее, связанный ответ ограничился [01]
по причине ;-) Тем не менее здесь нет, как я бы начать:
{
# in state '' we have not yet processed/consumed any input
# it is the start state
# the only valid input is a 'w'
'': {'w': 'w'},
# in state 'w' we a have already consumed a 'w'
# the only valid input is another 'w'
'w': {'w': 'ww'},
# in state 'ww' we have previously consumed 'ww'
# the only valid input is still only a 'w'
'ww': {'w': 'www'},
# now the only valid input is a '.'
'www': {'.': 'www.'},
# this is where your example becomes unpractical:
# we have to add a transition for every valid input
# (you could get around this by using a defaultdict and some kind of special signal value, but im not quite sure you are up to that)
'www.': {'a': 'www.*', 'b': 'www.*', ...},
# I used the star in this state name to symbolize multiple (at least one) valid character
# we only leave this state if we encounter a '.'
'www.*': {'.': 'www.*.', 'a': 'www.*', 'b': 'www.*', ...},
# it should be obvious how to continue from here
'www.*.': ...
}
EDIT2: Реализация после чата.
from collections import defaultdict
dfa = {
'initial': defaultdict(lambda: 'invalid', w='w'),
'w': defaultdict(lambda: 'invalid', w='ww'),
'ww': defaultdict(lambda: 'invalid', w='www'),
'www': defaultdict(lambda: 'invalid', [('.','www.')]),
'www.': defaultdict(lambda: 'www.*', [('.','invalid')]),
'www.*': defaultdict(lambda: 'www.*', [('.','www.*.')]),
'www.*.': defaultdict(lambda: 'www.*', [('c','www.*.c')]),
'www.*.c': defaultdict(lambda: 'www.*', [('o','www.*.co')]),
'www.*.co': defaultdict(lambda: 'www.*', [('m','www.*.com'), ('.','www.*.')]),
'www.*.com': defaultdict(lambda: 'www.*', [('.','www.*.')]),
'invalid': defaultdict(lambda: 'invalid')
}
def accepts(transitions,initial,accepting,s):
state = initial
for c in s:
state = transitions[state][c]
print(c, '->', state)
return state in accepting
print(accepts(dfa,'initial',{'www.*.com', 'www.*.co'},"www.hi.com"))
[Searching Google для "DFA в Python"] (https://encrypted.google.com/search?q=DFA+in+Python) сразу предлагает несколько примеров (в том числе [один для переполнения стека] (http://stackoverflow.com/questions/35272592/how-are- конечно-автоматный реализовано в-коде)). Что с ними случилось? –
Я понимаю концепцию лучше с этим переполнением стека, которое вы связали (не знаю, почему я не мог его найти раньше), но применение его к символам по сравнению с ints сбивает меня с толку. – witcheR