2

我想在 Mercury 中模拟一个确定性有限自动机 (DFA)。但我在几个地方都很讨厌。

形式上,DFA 具有以下特征:

  • 一组状态 S,
  • 输入字母 E <-- 求和符号,
  • 一个转换函数:S × E --> S,
  • 一个 startState s € S,
  • 一个 setOfAcceptableFinalStates F =C S。

    DFA 将始终以启动状态启动。然后 DFA 会一一读取输入中的所有字符。根据当前输入的字符和当前状态,将有一个新的状态。这些转换在转换函数中定义。当 DFA 处于其可接受的最终状态之一时,在读取最后一个字符后,DFA 将接受输入,如果不接受,则输入将被拒绝。

    图中显示了一个 DFA 接受的字符串,其中零的数量是三个的复数。条件1是初始状态,也是唯一可接受的状态。对于每个输入字符,对应的弧是跟随到下一个状态。

链接到图

必须做什么

  1. 代表状态的类型“mystate”。每个州都有一个用于识别的编号。

  2. 表示状态之间可能的转换的类型“转换”。每个转换都有一个 source_state、一个 input_character 和一个 final_state。

  3. 一种表示整个 DFA 的“状态机”类型。在解决方案中,DFA 必须具有以下属性:

    • 所有状态的集合,
    • 输入字母,
    • 一个转换函数,表示为一组可能的转换,
    • 一组接受的最终状态,
    • DFA 的当前状态
  4. 一个谓词“init_machine(状态机::out)”将他的参数与DFA统一起来,如图所示。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 回答