={0,1,2,3,4}
=0
={3}
=〈0,0,1〉,〈0,1,1〉,〈0,.,2〉,〈1,0,1〉,〈1,1,1〉,
〈1,.,3〉,〈2,0,3〉,〈2,1,3〉,〈2,.,4〉,〈3,0,3〉,〈3,1,3〉,
〈3,.,4〉〈4,0,4〉,〈4,1,4〉,〈4,.,4〉}
Where Σ={0,1,.}.
我正在研究一个Haskell程序,该程序可以根据上述定义处理任何确定性的有限自动机。我应该将每个状态的名称表示为字符串,将所有状态表示为状态列表,并将每个转换表示为三个元组,并将转换列表表示为列表。
我已经修改了我的代码,它可以运行,但是我可以告诉我,就要求而言,我的工作并不正确。 我对Haskell还是很陌生,非常感谢您提供一些有关如何改进我的代码或完全不熟悉它的指导。我真的是想了解这一切是如何工作的。我经历了许多不同的示例和教程,但我只是在特别努力地处理我的代码。
编辑:具体来说,当我输入以下示例时,除dfaAccept dfaFactory "10.11"
之外,我得到的都是正确的输出。这返回为false而不是true,并且dfaAccept dfaFactory ""
的结果为true而不是false。我看不到我的错误在哪里导致了此问题。另外,我想确保我的代码在可读性方面有意义。
type State = Int
type DFA = ([State], [Char], State->Char->State, State, [State])
dfaFactory :: DFA
dfaFactory = (states, alphabet, delta, s, fs)
where states = [1,2,3]
alphabet= ['1','0','.']
s = 1
fs = [1]
delta 1 '1' = 2
delta 1 '0' = 2
delta 1 '.' = 2
delta 2 '1' = 3
delta 2 '0' = 3
delta 2 '.' = 3
delta 3 '1' = 1
delta 3 '0' = 1
delta 3 '.' = 1
extendDelta :: (State -> Char -> State) -> (State -> String -> State)
extendDelta delta = deltaStar
where deltaStar q [] = q
deltaStar q (a:w) = deltaStar (delta q a) w
dfaAccept :: DFA -> String -> Bool
dfaAccept (qs,alpha,delta,s,fs) w =
let deltaStar = extendDelta delta
q = deltaStar s w
in elem q fs
示例输出如下:
Prelude> dfaAccept dfaFactory “”
False
Prelude> dfaAccept dfaFactory “1”
False
Prelude> dfaAccept dfaFactory “1.0”
True
Prelude> dfaAccept dfaFactory “10.11”
True
Prelude> dfaAccept dfaFactory “10.10.10”
False
编辑我正在努力实现这些最终要求...只是不确定如何到达那里。 一种。用字符串名称表示每个州 b。将所有状态表示为状态列表 C。将每个转换表示为三个元组,将转换列表表示为列表。 一种。 dfaFactory –返回“硬编码” DFA定义(即四个元组)b。 getStates,getFirstState,getFinalStates和getTransitions –使用单个DFA参数并返回DFA的相应组件。 C。 getFromState,getLabel和getToState –使用单个过渡参数并返回过渡的相应组件 d。 matchTransition –接受状态,输入字符和过渡,如果给定状态和输入与给定过渡的from状态和标签匹配,则返回True e。 findNextState –接收DFA,输入字符和当前状态,并根据此输入和状态在DFA中返回状态。 F。 dfaAccept –接受DFA和输入String,如果DFA接受输入,则返回True,否则返回False。使用它来调用dfaAccept1帮助器函数 G。 dfaAccept1 –接受输入字符串,当前状态和DFA。一次将输入字符串分解为一个字符,请勿匹配整个字符串,因为您的解决方案必须适用于任何DFA)。这是具有基本和递归情况的递归函数。