Równoważność osiągalnych stanów DFA
Pogrupuj osiągalne stany pełnego DFA o najwyżej 16 stanach i czterech symbolach według akceptowanych sufiksów.
def dfa_classes(table, accepting):
if type(table) is not list or not 1 <= len(table) <= 16:
raise ValueError("state count")
n = len(table)
if type(table[0]) is not list or not 1 <= len(table[0]) <= 4:
raise ValueError("alphabet size")
width = len(table[0])
if any(type(row) is not list or len(row) != width or
any(type(x) is not int or not 0 <= x < n for x in row)
for row in table):
raise ValueError("complete transition table")
if type(accepting) is not set or any(
type(x) is not int or not 0 <= x < n for x in accepting):
raise ValueError("accepting states")
seen, pending = {0}, [0]
while pending:
for dest in table[pending.pop()]:
if dest not in seen:
seen.add(dest); pending.append(dest)
groups = [g for g in (seen & accepting, seen - accepting) if g]
while True:
owner = {s: i for i, g in enumerate(groups) for s in g}
refined = []
for group in groups:
buckets = {}
for state in sorted(group):
key = tuple(owner[d] for d in table[state])
buckets.setdefault(key, set()).add(state)
refined.extend(buckets.values())
if len(refined) == len(groups):
return sorted([sorted(g) for g in refined])
groups = refined| Projekt | Sprawdź stany równoważne i rozróżnialne, pomijając nieosiągalne oraz odrzucając niepoprawne przejścia. |
|---|---|
| Sprawdź przed zastosowaniem | Porównaj rzeczywiste zachowanie z oczekiwanym wynikiem. Jeśli sprawdzenie się nie powiedzie, wyjaśnij przyczynę przed kolejnymi zmianami. |
| Modele | Dodaj endpoint zgodny z OpenAI lub Anthropic, podając bazowy URL i klucz API, jeśli jest wymagany. Sprawdź połączenie. Lokalny serwer modelu musi działać; zdalne narzędzia mogą przesyłać dane oddzielnie. |
def dfa_classes(table, accepting):
if type(table) is not list or not 1 <= len(table) <= 16:
raise ValueError("state count")
n = len(table)
if type(table[0]) is not list or not 1 <= len(table[0]) <= 4:
raise ValueError("alphabet size")
width = len(table[0])
if any(type(row) is not list or len(row) != width or
any(type(x) is not int or not 0 <= x < n for x in row)
for row in table):
raise ValueError("complete transition table")
if type(accepting) is not set or any(
type(x) is not int or not 0 <= x < n for x in accepting):
raise ValueError("accepting states")
seen, pending = {0}, [0]
while pending:
for dest in table[pending.pop()]:
if dest not in seen:
seen.add(dest); pending.append(dest)
groups = [g for g in (seen & accepting, seen - accepting) if g]
while True:
owner = {s: i for i, g in enumerate(groups) for s in g}
refined = []
for group in groups:
buckets = {}
for state in sorted(group):
key = tuple(owner[d] for d in table[state])
buckets.setdefault(key, set()).add(state)
refined.extend(buckets.values())
if len(refined) == len(groups):
return sorted([sorted(g) for g in refined])
groups = refinedUpraszczaj kod stanowy, zachowując obserwowalne zachowanie
StateAmaranth to środowisko programowania dla Windows do badania oprogramowania stanowego z podłączonym modelem AI. Zacznij od zdarzeń przyjmowanych przez system i wyników obserwowalnych dla kodu wywołującego. Prośba o uproszczenie stanów wymaga tego kontekstu, aby mniejsza reprezentacja nie stała się celem kosztem zachowania aplikacji.
Dostarczony przykład automatu deterministycznego daje konkretne zadanie: badanie równoważności osiągalnych stanów przy zachowaniu akceptacji. Wprowadź do rozmowy tabelę przejść i zamierzony stan początkowy. Poproś model o wyjaśnienie, które rozróżnienia mają znaczenie, zanim zażądasz zmian, zwłaszcza jeśli otaczająca aplikacja ujawnia coś więcej niż prosty wynik akceptacji lub odrzucenia.
Oceń każde proponowane grupowanie na krótkich sekwencjach zdarzeń o znanych wynikach. Uwzględnij ścieżki docierające do różnych stanów i przypadki nieosiągalnych wpisów, a następnie uruchom kontrole w projekcie. Sprawdź również interfejs korzystający z grupowania, ponieważ zmiana numeracji lub reprezentacji stanów może zepsuć kod wywołujący nawet przy zachowaniu akceptacji.
Model AI bez ograniczeń można wybrać przez obsługiwany punkt końcowy zgodny z OpenAI lub Anthropic, który go oferuje. Skonfiguruj dane uwierzytelniające według potrzeb i sprawdź limity kontekstu oraz dostępność narzędzi. Sposób odpowiadania modelu nadal zależy od punktu końcowego; dowody bezpieczeństwa uproszczenia pochodzą z określonych przez Ciebie obserwacji i przeprowadzonych kontroli.
Pytania dotyczące refaktoryzacji automatu stanów
- Co uznać za obserwowalne zachowanie w poleceniu?
Wymień wyniki lub decyzje, na których polega kod wywołujący, a nie tylko wewnętrzne nazwy stanów. Jeśli przejścia emitują działania lub błędy, uwzględnij je. Przykład oparty na akceptacji może mieć węższy zakres niż zachowanie, które musi zachować rzeczywista aplikacja.
- Czy w mojej aplikacji zawsze można scalić stany równoważne pod względem akceptacji?
Nie bez sprawdzenia reszty kontraktu. Aplikacja może ujawniać identyfikatory, działania lub inne efekty zależne od stanu. Poproś asystenta o zbadanie tych odbiorców przed zastosowaniem argumentu równoważności opartego wyłącznie na akceptacji.
- Jak traktować nieosiągalne stany podczas przeglądu?
Określ stan początkowy i sposób ustalania osiągalności. Dodaj dane testowe z nieosiągalnymi wpisami i zamierzonym wynikiem. Przed przyjęciem usunięcia lub przegrupowania sprawdź, czy kod wywołujący oczekuje zachowania możliwości identyfikacji tych wpisów.
- Co testować po zmianie identyfikatorów stanów?
Sprawdź przejścia, zapisane odwołania i każdy interfejs wyświetlający lub wykorzystujący identyfikatory. Uruchom sekwencje behawioralne oraz kontrole struktury zwracanego grupowania. Samo zachowanie akceptacji nie dowodzi, że zależny kod nadal poprawnie interpretuje reprezentację.
StateAmaranth · Zaktualizowano 2026-10-25