【发布时间】:2018-07-29 17:44:36
【问题描述】:
我是haskell的新手。我的 java 知道怎么帮不了我很多。
我需要任何帮助或指导来完成代码。我已经尝试了大部分部分,并且还指出了我倾向于实现的目标。
DFA 的定义如下 (original image of DFA definition):
Q = {q1,q2,q3,q4,q5}
qs = q1
F = {q4}
delta = {
<q1,0,q2>,<q1,1,q2>,<q1,.,q3>,
<q2,0,q2>,<q2,1,q2>,<q2,.,q4>,
<q3,0,q4>,<q3,1,q4>,<q3,.,q5>,
<q4,0,q4>,<q4,1,q4>,<q4,.,q5>,
<q5,0,q5>,<q5,1,q5>,<q5,.,q5>
}
Sigma = {0,1,.}
任务:
-
创建一个 Haskell 语言程序,可以用来执行任意 对应于上述 FDA 定义的确定性有限自动机。代表 DFA 作为一个四元组
一个。用字符串表示每个状态
b.将所有状态表示为状态列表
c。将每个转换表示为三个元组,将转换列表表示为 列表。
-
为了帮助您,请在您的解决方案中实现以下功能:
一个。 stateFactory – 返回一个 DFA 定义(即一个四元组)
b. allStates、firstState、finalStates 和 allTransitions——获取 DFA 并返回 DFA 的相应组件。例如,在上述 DFA 实例中, allStates 将返回状态列表 q₁、q₂、q₃、q₄ 和 q₅。
c。 transFrom、transInput 和 transTo – 进行转换并返回转换的相应组件
d。 findTransition – 接受一个状态、一个标签和一个转换列表并返回一个列表 包含与给定状态和字符匹配的单个转换(请注意,从状态发出的转换由每个字符标签唯一确定
e。 findNextState – 接受一个 DFA、一个标签和一个状态并返回一个状态
f。 dfaAccept – 接受一个 DFA 和一个输入字符串,如果 DFA 接受输入,则返回 True,否则返回 False(即一次分解一个字符,不要 匹配整个字符串,因为您的解决方案必须适用于任何 DFA)。这有助于 将它分成两个函数,每个函数都有不同的参数集(一个用于 一个空列表,一个用于非空列表)。一个函数需要一个当前状态,一个 只需要一个 DFA,其状态被假定为 DFA 的初始状态。
这是我的代码有很多错误,但我正在尝试修复它们
allStates = ["q1","q2","q3","q4","q5"] -- iniitialize all states
firstState = "q1"
finalStates = "q4"
--define all transitions as a tuple
t1 = ("q1",'0',"q2")
t2 = ("q1",'1',"q2")
t3 = ("q1",'.',"q3")
-- place all transitions in a list
allTransitions = [t1,t2,t3]
lst =[]
stateFactory = (allStates, firstState, finalStates, allTransitions)
findTransition state label listOfTransition =
if (state , label , "q1") elem listOfTransition
then lst ++ [] -- if the tuple matches the one in transition add to list
else
lst -- no match dont add
if (state , label , "q2") elem listOfTransition
then lst ++ [] -- if the tuple matches the one in transition add to list
else
lst -- no match dont add
if (state , label , "q3") elem listOfTransition
then lst ++ [] -- if the tuple matches the one in transition add to list
else
lst -- no match dont add
findNextState DFA label state =
--get the transition and extract the last element which is the state
last findTransition state label allTransitions
dfaAccept DFA inputString =
if inputString == null then False
预期输出
Prelude> dfaAccept stateFactory “”
False
Prelude> dfaAccept stateFactory “1”
False
Prelude> dfaAccept stateFactory “1.0”
True
Prelude> dfaAccept stateFactory “11.11”
True
Prelude> dfaAccept stateFactory “10.10.10”
False
【问题讨论】:
-
这主要是问题陈述的副本,而不是问题。你有什么问题?问一个问题。
-
从您的代码中,很明显您使用的是命令式方法,这在haskell 中对您没有帮助。你有函数式编程和 haskell 方面的资源来帮助你了解 FP 的基础知识吗?
-
@Cubic 我该如何使用 findtransition 函数
-
我需要比较第一个状态,传递的标签与转换列表中的元素。我知道如何在 java 中做到这一点,但在尝试使用 haskell 处理它时遇到了困难
-
@kennedykolute 您了解 DFA 是什么以及它是如何工作的吗?那将是第一个开始的地方。另外,阅读 Haskell 教程。你是对的,你的 Java 知识不会对你有很大的帮助,因为它是一个完全不同的范式。你现在所拥有的并不是特别接近实际的 Haskell 代码,它似乎是某种与 Haskell 语法相似的命令式伪代码。
标签: haskell dfa declarative