【问题标题】:A guide to the right path on accomplishing the haskell commands完成haskell命令的正确路径指南
【发布时间】: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,.}

任务:

  1. 创建一个 Haskell 语言程序,可以用来执行任意 对应于上述 FDA 定义的确定性有限自动机。代表 DFA 作为一个四元组

    一个。用字符串表示每个状态

    b.将所有状态表示为状态列表

    c。将每个转换表示为三个元组,将转换列表表示为 列表。

  2. 为了帮助您,请在您的解决方案中实现以下功能:

    一个。 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


【解决方案1】:

这是您正在学习的课程的作业,还是自学的 Haskell 学习?如果这是自学的,我想你可能正在尝试在这个阶段对你来说太难的练习。我建议看看这个答案:Getting started with Haskell。尽管这是一个旧答案,但它已经一次又一次地更新,并且那里的大部分资源仍然有用。 http://www.haskell.org 网站的“文档”部分还提供了许多学习 Haskell 资源的链接。

如果这是你正在上课的家庭作业,你可能会遇到麻烦。您在代码中犯了一些非常基本的错误(在需要 `elem` 的地方使用 elem;尝试将 last 应用于四个参数;使用大写标识符 DFA 作为变量名),这表明您没有'Haskell 基础还没有确定下来。

也许你应该和你的教授谈谈,让他或她知道这项任务超出了你的范围。也许你可以得到一个扩展,或者你可以提供一个 Java 解决方案来获得部分学分(假设这门课程不是专门的 Haskell 课程)。

如果你坚持进取,这里有一个提示。您正在寻求帮助编写最难的函数之一 findTransition,但您甚至还没有编写“简单”的函数,例如 allStatesfirstState 等等。 (您在解决方案中使用了相同的名称,但您已将它们定义为特定 DFA 的常量,而不是使它们成为应用于通用 DFA 元组的函数,这是分配所需要的)。

那么,你能通过填写下划线来完成下面的模板,以便回答第 1 部分和第 2(b) 部分吗?

-- simple type synonyms to make things easier to read
type State = String
type Symbol = Char

-- some more complicated type synonyms
type Transition = (State, Symbol, State)
type DFA = ( [State]        -- all states
           , State          -- first state
           , [State]        -- final states
           , [Transition]   -- all transitions
           )

allStates :: DFA -> [State]
allStates _ = _

firstState :: DFA -> State
firstState _ = _

finalStates :: DFA -> [State]
finalStates _ = _

allTransitions :: DFA -> [Transition]
allTransitions _ = _

一旦你能够做到这一点,请编写第 2(c) 部分中的函数。一旦你完成了所有,你可能已经准备好处理findTransition。此时,您可能需要了解findfilter 函数,否则您需要学习如何编写递归列表函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多