【順序回路】状態遷移表の簡単化(最小化)と例題

下記の状態遷移表にて、状態数の圧縮を行え。

状態遷移表次の状態次の状態出力出力
現状態入力 x=0入力 x=1入力 x=0入力 x=1
S0S2S300
S1S1S110
S2S1S610
S3S4S500
S4S1S010
S5S2S300
S6S4S500
ディジタルコンピューティング 亀山充隆(著) 第6章 演習問題問1より

状態数の最小化を行う利点

プログラムが簡潔になり、分かりやすい。必要な素子数が少なくなり、開発コストを低減できる。など、良いことばかりです。

大学の講義だけでなく、実際のソフト開発現場でも、状態とそれぞれの意味する内容の検討は多々行います。

院試でもたまに出題される本分野ですが、実業務とも親和性が高いです。

感覚的にまとめてしまう人が(筆者含め)多いですが、本記事で正当な方法を理解できれば、業務の質も上がると思います。

なお、状態遷移の概要については、こちらの記事でまとめています。

状態数の最小化方法

Huffman-Mealyの方法
  1. 状態遷移表の入力x=0,1に対する出力y(0,1)が同じ状態をグループ分けする。
  2. それぞれの状態の遷移先のグループを確認。x=0,1ともに同じならば、まとめた一つの状態にできる。
  3. 遷移先のグループが別の場合は、新たに別のグループを定義し、2.を再実施する。

平たく言えば、
1.入力に対する出力が他の状態と異なる状態は独立であること。
2.別の状態からある状態に遷移したとき、その状態も独立であること。

を厳密にチェックしていく方法になっています。

例えば、入力x=0,1に対する出力が(0,1),(1,0)になる状態が一つずつ存在したとします。

これをマージしてしまうと、出力がどちらに取れば良いか分からず、不定になってしまいます。
一方で、(0,1)を取る状態が複数個有るときは、まとめられる可能性が出てきます。

これをチェックすることが1.の過程ですね。

(0,1)を取る状態が複数個あった場合でも、遷移先が別の状態で異なる出力を出す場合、その状態をマージしてしまうと影響先が発生してしまう。

このため、遷移先含めてマージできるのか確認することが2.の過程を表しています。

実際に、問題を解いて確認していきます。

なお、問題内容自体は教科書から引用しましたが、略解しか無かったので、導出過程は全て管理人で作成しました。

解答例

手順1 出力が同じ状態のグループ分け

与えられた状態遷移表より、下記の2グループに分けられる。

グループG1S0,S3,S5,S6
グループG2S1,S4,S5

手順2、3 遷移先のグループの確認。分割

グループG1(S0,S3,S5,S6)について:

いずれの状態もx=0でグループG2x=1でグループG1に遷移する。

よって、全て同じ状態にまとめられる。

グループG2(S1,S2,S4)について:

x=0でグループG2に遷移は同じだが、S1のみ、x=1でグループG2に遷移する。

よって、S1のみ同じ状態にできないため、状態をさらに分割する。

G21S1G22(S2,S4)とすると、遷移先が全て同じのグループになる。

また、グループG1x=0遷移先は全てG22

以上より、下記の3状態にまとめることができる。

状態1:S0,S3,S5,S6
状態2:S1
状態3:S2,S4

補足:状態遷移図について

下記のようにまとめられます。

複雑だったものが3つにまとまり、分かりやすさが一目瞭然です。

タイトルとURLをコピーしました