Разница между Мили и Муром

Имеет ли какое-либо реальное значение разница между конечными автоматами Мили и Мура, когда речь идет о реализации на C? В чем обычно заключается эта разница?

Давным-давно мне было гораздо проще понять преимущества/недостатки Мили/Мура, когда дело доходит до RTL. Весь вывод, зависящий от текущего состояния/вывод, зависящий от разницы текущего состояния + текущего ввода, имел смысл, как и тот факт, что Мили можно было сделать с одним состоянием меньше, в некоторых случаях также имел смысл. Связывание временных диаграмм с каждой реализацией FSM также сделало разницу между ними более ясной.

Скажем, я делаю конечный автомат на C. В одном случае LUT зависит от состояния/текущего ввода (Мили), а в Moore LUT просто ищет текущее состояние и возвращает следующее. В любом случае выход происходит после возврата из ЛУТ (думаю, хотя могу ошибаться). Я не придумал четкого способа, которым Мили имеет преимущество при кодировании на C. Такие темы, как читабельность кода, скорость, плотность кода, простота проектирования, могут быть важными темами - с моей точки зрения, две модели кажутся почти одинаковыми.

Может быть, эта разница просто тема для академиков — и на практике в реализациях C разница незначительна. Если вы знаете основные отличия реализации конечного автомата C между Мили и Муром, и если есть реальные преимущества (которые также значительны), мне было бы любопытно узнать. Я хотел бы подчеркнуть - я не спрашиваю о реализации RTL.

Я видел еще один пост Мили/Мура здесь: Мили v/s. Мур

Но это не совсем тот уровень объяснения, которого я ищу.


person user1461251    schedule 17.06.2012    source источник
comment
LUT = таблица поиска (en.wikipedia.org/wiki/Lookup_table)   -  person Axel Kemper    schedule 14.12.2014


Ответы (2)


У вас есть механическая процедура преобразования одного формализма в другой, поэтому между ними нет структурной разницы.

Говоря о различиях в реализации, эти два формализма отличаются только выходной функцией, которая говорит вам, какой символ должен быть выведен. Конкретно:

  1. В машине Мура вывод зависит только от текущего состояния.
  2. В машине Мили вывод зависит от текущего состояния и текущего ввода.

машину Мура может быть немного проще реализовать, потому что у вас меньше информации для отслеживания, когда дело доходит до генерирования выходных данных, но разница будет очень небольшой.

Вот как будет выглядеть простая машина Мура на C:

int state = INITIAL;
while (!isTerminal(state)) {
    char input = nextInputSymbol();
    fprintf(output, "%c", nextOutputSymbol(state));
    state = nextState(state, input);
}

а вот машина Мили:

int state = INITIAL;
while (!isTerminal(state)) {
    char input = nextInputSymbol();
    fprintf(output, "%c", nextOutputSymbol(input, state));
    state = nextState(state, input);
}

как видите, единственная разница в определении nextOutputSymbol(). Является ли реализация указанной функции проще для того или иного формализма, это действительно зависит от конкретного приложения.

nextInputSymbol — это просто процедура для получения нового символа (может быть scanf или что-то подобное), а nextState будет зависеть от конкретной машины, но его сложность не сильно изменится между Мили и эквивалентным Муром.

В частности, и nextOutputSymbol, и nextState сводятся к поиску в таблице или к цепочке switch или if/else без каких-либо реальных трудностей реализации. Их просто скучно писать, правда.

ПРИМЕЧАНИЕ. Я пропустил проверку ошибок во фрагментах кода, чтобы мы сосредоточились на главном вопросе обсуждения. Код реального мира будет выполнять некоторые дополнительные проверки, такие как обработка EOF в nextInputSymbol или breaking в состояниях ошибки.

person Stefano Sanfilippo    schedule 26.07.2014
comment
Отличный ответ. Актуально: inf.u-szeged.hu/actacybernetica/prevvols/ 14_4/14_4_541_552.pdf - person Tobia Tesan; 25.04.2015

Машина Мура: вывод зависит только от текущего состояния. Машина Мили: вывод зависит как от текущего состояния, так и от текущего ввода.

person Zeeshan Ali Zeeshu    schedule 25.04.2015