Создание полноценного исполнителя для упрощения создания конечных автоматов Мура и Мили, получающих на вход двоичное число.
- Полноценная реализация автоматов Мили и Мура
- Поддержка generic-типов (вход, выход)
- Гибкое API: добавление состояний и переходов через методы или конструктор
- Поддержка кортежей и готовых объектов при создании переходов
- Общие
kwargsдля всех функций (условий, выходов, процессоров) - Условия остановки выполнения
- Подробная история выполнения шагов
- Валидация целостности автомата
from src.state_machines import MealyMachine
def zero_condition(input: str) -> bool:
return input[-1] == "0"
def add_one(previous_output: str) -> str:
return "1" + previous_output
def shift(input: str) -> str:
return input[:-1]
machine = MealyMachine(
transitions=[
("S0", "S0", zero_condition, add_one, shift),
],
initial_state="S0",
initial_output="",
initial_input="100",
stop_condition=lambda input: len(input) == 0,
)
machine.run_all()
result = machine.get_final_result()from src.state_machines import MooreMachine
def zero_condition(input: str) -> bool:
return input[-1] == "0"
def add_nothing(previous_output: str) -> str:
return previous_output
def add_one(previous_output: str) -> str:
return "1" + previous_output
def shift(input: str) -> str:
return input[:-1]
machine = MooreMachine(
states=[
("S0", add_nothing),
("S1", add_one),
],
transitions=[
("S0", "S1", zero_condition, shift),
],
initial_state="S0",
initial_output="",
initial_input="100",
stop_condition=lambda input: len(input) == 0,
)
machine.run_all()
result = machine.get_final_result()В папке examples/ находятся готовые примеры использования:
| Файл | Автомат | Описание |
|---|---|---|
mealy_mul_three.py |
Мили | Умножение двоичного числа на 3 |
moore_plus_three.py |
Мура | Прибавление 3 к двоичному числу |
Запустить примеры можно так:
uv run -m examples.mealy_mul_three
uv run -m examples.moore_plus_threeВ классической теории автоматов Мили и Мура выходное значение вычисляется на основе текущего состояния и входа (Мили) или только состояния (Мура). В данной реализации выходная функция также получает предыдущее выходное значение. Это сделано намеренно.
При обработке последовательности входных символов (например, битов числа) результат часто нужно накапливать. Проще всего передавать накопленный результат в следующую итерацию как аргумент выходной функции. Такой подход позволяет:
- Формировать единый выходной результат за всё время работы автомата
- Не хранить историю выходов внутри автомата
- Писать чистые выходные функции вида
previous_output -> new_output
# Накопление результата через previous_output
def add_bit(previous_output: str) -> str:
return previous_output + "1" # добавляем бит в конец
# Альтернатива без previous_output: пришлось бы хранить результат где-то ещёЕсли вам нужна классическая модель без зависимости от предыдущего выхода, просто игнорируйте этот аргумент в своей функции:
def my_output(previous_output: int) -> int:
return 42 # всегда 42, независимо от previous_outputФактически, previous_output — это аккумулятор, а выходная функция выполняет роль свёртки (fold). Это расширяет классическую модель, сохраняя при этом полную совместимость с ней (достаточно не использовать previous_output).
uv run pytest- Реализовать новое API для автоматов Мура
- Улучшить GUI-редактор (добавить возможность редактирования переходов)
- Создать примеры использования для нового API
- Доработать GUI-редактор до состояния полноценного приложения
-
Детерминированные конечные автоматы. — Текст : электронный // Викиконспекты кафедры компьютерных технологий Университета ИТМО : сайт
-
Недетерминированные конечные автоматы. — Текст : электронный // Викиконспекты кафедры компьютерных технологий Университета ИТМО : сайт
-
Автоматы Мура и Мили. — Текст : электронный // Викиконспекты кафедры компьютерных технологий Университета ИТМО : сайт