
NFA(non-deterministic automaton)について質問させてください。
NFAからDFAへ変換するプログラムを作っています。
NFAの文法(状態数、アルファベット数、状態遷移表、終了状態)を別のデータファイルに入力し、それをプログラム中に読み込んで、NFAを登録したいと考えています。
しかし、状態遷移表だけがどのように取り込んでいいのか分からず途方に暮れています。
どうか教えていただけないでしょうか?
よろしく御願いいたします。
ファイルの中身(状態遷移表)としては、このような感じを考えています。
例えば、状態が3つ(q0, q1, q2)、3つのアルファベット(a,b,c)とε
0,1,2 E E E
E 1 E E
E E 2 1
q1から文字aのときにq0,q1,q2にそれぞれいくという意味。Eは何もなしという意味です。
No.2ベストアンサー
- 回答日時:
取りこみ方というよりは
データ構造について考慮中ということでしょうか?
>遷移の関数を用意したんですが、
>それに遷移元と遷移先とその時の文字
>そして次のデータへのポインタを一組
次のデータというのが良く分からないのですが、
ファイルの仕様として上のものをお考えでしたら
n行がq[n-1]状態を表し、
スペースで区切った時のm個目が(一般に言う)アルファベットのm番目の時の遷移先に対応するわけですよね。
Σ={a,b,c,,,z}、状態をq0・・・q99までと仮定し
状態のクラスを以下のように定義します。
#define E 100
// 状態を表すクラス
class State {
// 遷移先状態
int* pNextState['z' - 'a' + 1];
public State(int iStateCount) {
// 遷移先を状態の数分作成しEにする
for (int i = 0;i < 'z' - 'a' + 1;i++) {
pNextState[i] = new int [iStateCount];
for (int n = 0;n < iStateCount;n++) {
pNextState[i][n] = E;
}
}
}
public ~State() {
//デストラクタは略
}
// 次の遷移先を追加
// cAlh その時の文字
// iNextState 遷移先
// 遷移先のインデックス
public void AddState(char cAlh, int iNextState, int iIndex) {
pNextState[cAlh - 'a'][iIndex] = iNextState;
}
// 次の遷移先を取得
// cAlh その時の文字
// 非決定的に複数あった場合の遷移先のインデックス
public int GetNextState(char cAlh, int iIndex) {
return pNextState[cAlh - 'a'][iIndex];
}
}
このとき、あくまで配列を使って(STLを使えばいいのですが)上のファイルを読みこむと
まず状態を生成し
State sate[100];
1行目を読みこんで
初めのスペースまでで0,1,2と3つの遷移先が存在しますから、
sate[0].AddState('a',0,0);
sate[0].AddState('a',1,1);
sate[0].AddState('a',2,2);
となり、'a'の時はq0,q1,q2に行くという、q0状態が定義できます。
2行目を読みこんで
2番目のスペース前が1とありますので、
sate[1].AddState('b',1,0);
でq1状態が定義できます。
今q2状態で'b'が入ってきた時の遷移先は
state[2].GetNextState('b',0);
で取得できます。
とまぁこんなかんじで、状態遷移表と状態遷移関数を定義できないでしょうか(いまコンパイル環境がないのでソースは実行していませんが)。。
人によっていろいろ実装の仕方はありますし、上がベストではないですが、参考になれば幸いです。
No.1
- 回答日時:
ファイルの中身の仕様としては、
スペース区切りが次の遷移先状態(の集合)
カンマ区切りが非決定的に複数の遷移があった場合の遷移先状態
ということですから、
1)1行読む
2)スペースで区切る→あるアルファベット遷移先状態(の集合)
3)2)の文字(列)をカンマで区切る→複数の遷移先状態
ということですよね。
どのようの取り込んでいいのか分からない、というのは読み込み方ですか?
であれば、strtokを使えば良いと思います。
http://www9.plala.or.jp/sgwr-t/lib/strtok.html
取り込んでの保持の仕方ですか?
|Q|(←状態の数)は先にファイルから読み込めば分かりますから、
|Q|個の配列を作っておけば、非決定的に複数の遷移先があっても保持できますよね(STL使えばいいんですが)
見当違いだったらすみません。
この回答への補足
参考になる回答ありがとうございます。
取り込み方についてもう少し詳しくご解説願えないでしょうか(とくに、0,1,2のところ)
実際遷移の関数を用意したんですが、それに遷移元と遷移先とその時の文字そして次のデータへのポインタを一組にして取り込みたいなと考えています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 工学 NFAからDFAの変換について 1 2022/05/28 01:45
- その他(形式科学) 非決定性有限オートマトンの問題について 1 2022/07/21 21:10
- 宇宙科学・天文学・天気 銀河のハビタブルゾーンを確率的セルオートマトンという数値的にシミュレーションした結果、「群島」の様な 2 2023/06/06 23:10
- 化学 結晶場理論で真空状態から例えば8面体配位でt2gが安定化するのはなぜでしょうか? 1 2023/04/30 19:09
- 工学 順序回路と状態遷移表 1 2022/07/07 10:49
- 医学 サブリミナルの研究で「kコアパーコレーション(percolation、浸透の意)を使用して、人間の脳 1 2023/01/29 16:20
- Mac OS macが液晶割れしたのでデータを保護したいです 2 2023/03/27 18:36
- 化学 遷移金属でd5の半閉殻の状態が安定化する理由について教えてください。 0 2023/04/18 09:42
- システム 質問です。 仮分数はどういう状態ですか? プログラムについてです。 例えば、とあるプログラムで、アイ 1 2023/07/24 01:39
- その他(悩み相談・人生相談) 単身で地方移住し、環境に馴染めず適応障害になりかけている。 最近仕事にも集中できず、何事も上の空。 1 2023/08/25 13:11
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
画面遷移が不正ですと表示されます
-
"ビジョ"というソフトウェア
-
javascriptの質問です
-
Excel VBAで「こういう状態の時...
-
VBAでマウスの右クリックをロッ...
-
足跡が・・・
-
動きのあるホームページを作り...
-
フォームについて
-
おしえてgooのログインボタンに...
-
JavaScriptで可能かどうか分か...
-
オープンIDでのサービス間の...
-
iPODなどの値段
-
2つのページで片方を更新
-
ドコモの携帯サイトをPCから見...
-
ボタンの状態を送信するには?
-
画像の切り替えについて
-
formの入れ子を回避したい
-
ホームページの中での事
-
ログイン画面作成
-
携帯サイト制作 input type=bu...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ASPで画面間のパラメタ受け渡し
-
HTTPリクエストヘッダーの設定...
-
スマホで、左右にスワイプして...
-
VB.NET 画面遷移
-
ASP.NET による画面遷移で質問...
-
【ASP.NET】ページ遷移してもGr...
-
エクセルVBA 別のブックのユ...
-
画面遷移が不正ですと表示されます
-
違うサイトに移動した時にcooki...
-
Spreadのデータを別画面に引き渡す
-
request.QueryStringについて
-
WebBrowserのドラッグできるフ...
-
オートマトンNFAからDFAへの変換
-
C#でテキストボックスとスクロ...
-
短縮URLが遷移しません。
-
セッション変数への値の代入方...
-
Web制作にあたり
-
Access2013 VBA 複数の画面の遷移
-
aspからasp.netへの遷移(その...
-
プログラミング開発の質問です...
おすすめ情報