Files
mathlogic/lab2/programm/finite_automaton.py
2025-04-23 20:24:23 +03:00

64 lines
2.0 KiB
Python

import random
class FiniteAutomaton:
def __init__(
self,
transitions: dict[str, list[tuple[str, str]]],
initial_state: str,
final_states: set[str],
alphabet: set[str],
):
self.transitions = transitions
self.initial_state = initial_state
self.final_states = final_states
self.alphabet = alphabet
def _get_next_state(self, current_state: str, char: str) -> str | None:
if current_state in self.transitions:
for transition, next_state in self.transitions[current_state]:
if char in transition:
return next_state
return None
def process_input(self, input_string: str) -> tuple[str, list[str]]:
current_state = self.initial_state
transitions_path = [current_state]
for char in input_string:
if char not in self.alphabet:
return f"Символ '{char}' не из алфавита", transitions_path
next_state = self._get_next_state(current_state, char)
if next_state is None:
return "Строка не соответствует", transitions_path
transitions_path.append(next_state)
current_state = next_state
return (
"Строка соответствует"
if current_state in self.final_states
else "Строка не соответствует"
), transitions_path
def generate_random_string(self, stop_probability: float = 0.3) -> str:
result = []
current_state = self.initial_state
while True:
if (
current_state in self.final_states
and random.random() < stop_probability
):
break
transition, next_state = random.choice(self.transitions[current_state])
char = random.choice(transition)
result.append(char)
current_state = next_state
return "".join(result)