我想在 Mercury 中模拟一个确定性有限自动机 (DFA)。但我在几个地方都很讨厌。
形式上,DFA 具有以下特征:
- 一组状态 S,
- 输入字母 E <-- 求和符号,
- 一个转换函数:S × E --> S,
- 一个 startState s € S,
一个 setOfAcceptableFinalStates F =C S。
DFA 将始终以启动状态启动。然后 DFA 会一一读取输入中的所有字符。根据当前输入的字符和当前状态,将有一个新的状态。这些转换在转换函数中定义。当 DFA 处于其可接受的最终状态之一时,在读取最后一个字符后,DFA 将接受输入,如果不接受,则输入将被拒绝。
图中显示了一个 DFA 接受的字符串,其中零的数量是三个的复数。条件1是初始状态,也是唯一可接受的状态。对于每个输入字符,对应的弧是跟随到下一个状态。
必须做什么
代表状态的类型“mystate”。每个州都有一个用于识别的编号。
表示状态之间可能的转换的类型“转换”。每个转换都有一个 source_state、一个 input_character 和一个 final_state。
一种表示整个 DFA 的“状态机”类型。在解决方案中,DFA 必须具有以下属性:
- 所有状态的集合,
- 输入字母,
- 一个转换函数,表示为一组可能的转换,
- 一组接受的最终状态,
- DFA 的当前状态
一个谓词“init_machine(状态机::out)”将他的参数与DFA统一起来,如图所示。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)
).
希望你能帮我
亲切的问候