2

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 は初期状態であり、唯一許容される状態でもあります。各入力文字は、次の状態に続く対応するアークです。

図へのリンク

しなければならないこと

  1. 状態を表す型「mystate」。各州には、識別に使用される番号があります。

  2. 状態間の可能な遷移を表す型「遷移」。各遷移には、source_state、input_character、および final_state があります。

  3. DFA 全体を表すタイプ「ステートマシン」。このソリューションでは、DFA に次のプロパティが必要です。

    • すべての状態のセット、
    • 入力アルファベット、
    • 可能な遷移のセットとして表される遷移関数、
    • 受け入れる最終状態のセット、
    • DFA の現在の状態
  4. 図に示すように、彼の引数を DFA と統合する述語「init_machine (state machine :: out)」。DFA の現在の状態は、初期状態、つまり 1 に設定されています。DFA の入力アルファベットは、文字 '0' と '1' で構成されています。

  5. ユーザーは、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)
        ).

あなたが私を助けてくれることを願っています

敬具

4

1 に答える 1

1

mystateなどのタイプを作成する場合:

:- type transition ---> trans(source_state::mystate, input_character::bool, final_state::mystate).

一行で全部書き出さないでください。読みづらいです。

:- type transition
    --->    trans(
                source_state     :: mystate,
                input_character  :: bool,
                final_state      :: mystate
            ).

今でははるかに読みやすくなっています。また、タイプとフィールド名が間違った方向にあることもわかります。試す:

:- type transition
    --->    trans(
                mystate  :: source_state,
                bool     :: input_character,
                mystate  :: final_state
            ).
于 2012-12-16T03:41:43.370 に答える