Mercury でシミュレートされた決定論的有限オートマトン (DFA) を使用したいと考えています。しかし、私はいくつかの場所でうんざりしています。
正式には、DFA は次の特性で記述されます。
- setOfStates S、
- inputAlphabet E <-- 合計記号、
- transitionFunction : S × E --> S,
- a startState s € S,
setOfAcceptableFinalStates F =C S.
DFA は常に開始状態で開始されます。次に、DFA は入力のすべての文字を 1 つずつ読み取ります。現在の入力文字と現在の状態に基づいて、新しい状態が作成されます。これらのトランジションは、transitions 関数で定義されます。DFA が許容可能な最終状態の 1 つにある場合、最後の文字を読み取った後、DFA は入力を受け入れます。そうでない場合、入力は拒否されます。
この図は、0 の数が 3 の複数である文字列を受け入れる DFA を示しています。条件 1 は初期状態であり、唯一許容される状態でもあります。各入力文字は、次の状態に続く対応するアークです。
しなければならないこと
状態を表す型「mystate」。各州には、識別に使用される番号があります。
状態間の可能な遷移を表す型「遷移」。各遷移には、source_state、input_character、および final_state があります。
DFA 全体を表すタイプ「ステートマシン」。このソリューションでは、DFA に次のプロパティが必要です。
- すべての状態のセット、
- 入力アルファベット、
- 可能な遷移のセットとして表される遷移関数、
- 受け入れる最終状態のセット、
- DFA の現在の状態
図に示すように、彼の引数を DFA と統合する述語「init_machine (state machine :: out)」。DFA の現在の状態は、初期状態、つまり 1 に設定されています。DFA の入力アルファベットは、文字 '0' と '1' で構成されています。
ユーザーは、DFA によって制御されるテキストを入力できます。プログラムは、ユーザーが Ctrl-D を入力して EOF をシミュレートするまで続行されます。ユーザーが DFA の入力アルファベットに許可されていない文字を使用すると、エラー メッセージが表示され、プログラムが終了します。(事前に必要)
例
Enter a sentence: 0110
String is not ok!
Enter a sentence: 011101
String is not ok!
Enter a sentence: 110100
String is ok!
Enter a sentence: 000110010
String is ok!
Enter a sentence: 011102
Uncaught exception Mercury:
Software Error: Character does not belong to the input alphabet!
私が持っているもの。
:- module dfa.
:- interface.
:- import_module io.
:- pred main(io.state::di, io.state::uo) is det.
:- implementation.
:- import_module int,string,list,bool.
1
:- type mystate ---> state(int).
2
:- type transition
---> trans(
source_state::mystate,
input_character::bool,
final_state::mystate
).
3 (エラー、finale_state および current_state および input_character)
:- type statemachine
---> dfa(
list(mystate),
list(input_character),
list(transition),
list(final_state),
current_state(mystate)
).
4たくさん欠けている
:- pred init_machine(statemachine :: out) is det.
%init_machine(statemachine(L_Mystate,0,L_transition,L_final_state,1)) :- <-probably fault
5完璧ではない
main(!IO) :-
io.write_string("\nEnter a sentence: ", !IO),
io.read_line_as_string(Input, !IO),
(
Invoer = ok(StringVar),
S1 = string.strip(StringVar),
(if S1 = "mustbeabool" then
io.write_string("Sentenceis Ok! ", !IO)
else
io.write_string("Sentence is not Ok!.", !IO)),
main(!IO)
;
Invoer = eof
;
Invoer = error(ErrorCode),
io.format("%s\n", [s(io.error_message(ErrorCode))], !IO)
).
あなたが私を助けてくれることを願っています
敬具