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| プロジェクト | 同値状態と識別可能状態を確認し、到達不能状態を除外して無効な遷移を拒否します。 |
|---|---|
| 適用前に確認 | 実際の動作を期待する結果と比較します。検証に失敗した場合は、次の変更を加える前に原因を調べてください。 |
| モデル | OpenAI互換またはAnthropicのエンドポイントを、ベースURLと必要なAPIキーで設定し、接続をテストします。ローカルのモデルサーバーは起動が必要です。リモートツールは別途データを送信する場合があります。 |
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観測可能な動作を保ち状態を持つコードを簡素化する
StateAmaranthは、接続したAIモデルと状態を持つソフトウェアを調べるWindows向けコーディングワークスペースです。システムが受け付けるイベントと呼び出し側が観測できる結果から始めます。状態の簡素化にはその文脈が必要であり、表現を小さくする目標がアプリケーションの動作を犠牲にしないようにします。
提供された決定的状態の例は、受理動作を保ちながら到達可能な状態の同値性を調べる具体的な課題です。遷移表と意図する初期状態を対話に含めます。特に周囲のアプリケーションが単なる受理・拒否以外を公開する場合、変更依頼の前にどの区別が重要か説明を求めてください。
結果が既知の短いイベント列でグループ分け案をレビューします。異なる状態に達する経路と到達不能な項目を含むケースを用意し、プロジェクトでチェックしてください。受理動作が保たれても状態番号や表現の変更は呼び出し側を壊し得るため、グループ分けを利用するインターフェースも調べます。
提供している対応済みのOpenAI互換またはAnthropicのエンドポイントを通じて、制限のないAIモデルを選択できます。必要な認証情報を設定し、コンテキストの上限とツールの利用可否を確認してください。モデルの応答動作はエンドポイントに依存します。安全な簡素化の証拠は、明示した観測事項と実行するチェックから得られます。
状態機械のリファクタリングに関する質問
- 依頼では何を観測可能な動作とすべきですか?
内部状態名だけでなく、呼び出し側が依存する出力や判断を列挙します。遷移がアクションやエラーを出すなら含めてください。例の受理ベースの動作は、実際のアプリケーションが保つべき動作より狭い可能性があります。
- 受理が同値の状態は常にアプリ内で統合できますか?
契約の残りを確認せずにはできません。識別子、アクション、その他の状態依存の影響を公開している可能性があります。受理だけに基づく同値性の議論を適用する前に、その利用側を調べるよう依頼してください。
- 到達不能な状態はレビューでどう扱うべきですか?
初期状態と到達可能性の決め方を示します。到達不能な項目を含むテストデータと期待出力を用意してください。削除や再グループ化の案を採用する前に、呼び出し側がそれらの識別を必要とするかレビューします。
- 状態識別子の変更後に何をテストすべきですか?
遷移、保存された参照、識別子を表示・利用するインターフェースを確認します。返されたグループ構造のチェックとともに動作列も実行してください。受理の維持だけでは依存コードが表現を正しく解釈する証明にはなりません。
StateAmaranth · 更新日 2026-10-25