Руководство по правильному пути выполнения команд haskell

Я совершенно новичок в Haskell. Мой java ноу-хау мне мало помогает.

Мне нужна помощь или руководство по завершению кода. Я попробовал большинство частей, а также указал комментарии о том, чего я стремлюсь достичь.

DFA определяется следующим образом (исходное изображение определения DFA):

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 в виде четырех кортежей

    а. представить каждое состояние с его именем в виде строки

    б. представляет все состояния в виде списка состояний

    в. представить каждый переход в виде трех кортежей и список переходов в виде списка.

  2. Чтобы помочь вам, реализуйте следующие функции в своем решении:

    а. stateFactory — возвращает определение DFA (т. е. четыре кортежа)

    б. allStates, firstState, finalStates и allTransitions — берут DFA и возвращают соответствующий компонент DFA. Например, в приведенном выше экземпляре DFA allStates вернет список состояний q₁, q₂, q₃, q₄ и q₅.

    в. transFrom, transInput и transTo — взять переход и вернуть соответствующий компонент перехода

    д. findTransition — принимает состояние, метку и список переходов и возвращает список, содержащий одиночный переход, соответствующий заданному состоянию и символу (обратите внимание, что переходы, исходящие из состояния, однозначно определяются меткой каждого символа).

    е. findNextState — принимает DFA, метку и состояние и возвращает состояние.

    ф. dfaAccept — принимает DFA и входную строку и возвращает True, если DFA принимает ввод, и 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

person kennedy kolute    schedule 19.02.2018    source источник
comment
В основном это просто копия постановки задачи, а не вопроса. С какой частью у вас проблемы? Задайте вопрос об этом.   -  person Cubic    schedule 19.02.2018
comment
Из вашего кода очевидно, что вы используете императивный подход, который не поможет вам в хаскеле. Есть ли у вас какие-либо ресурсы по функциональному программированию и хаскелю, которые помогут вам понять основы FP?   -  person Paul Georg Podlech    schedule 19.02.2018
comment
@Cubic, как я могу использовать функцию findtransition   -  person kennedy kolute    schedule 19.02.2018
comment
мне нужно сравнить первое состояние, переданную метку с элементами в списке переходов. я знаю, как это сделать в java, но я изо всех сил пытаюсь справиться с этим с помощью haskell   -  person kennedy kolute    schedule 19.02.2018
comment
@kennedykolute Вы понимаете, что такое DFA и как он работает? Это было бы первым местом для начала. Также прочитайте учебник по Haskell. Вы правы, ваши знания Java не сильно помогут вам с Haskell, так как это совершенно другая парадигма. То, что у вас сейчас есть, не особенно близко к реальному коду на Haskell, похоже, это какой-то императивный псевдокод с синтаксисом, похожим на Haskell.   -  person Cubic    schedule 19.02.2018
comment
Я понимаю, что такое DFA. Я обработал конкретную проблему перед использованием java. Я прошел через множество руководств, у меня есть идея, но я продолжаю получать ошибки.   -  person kennedy kolute    schedule 19.02.2018
comment
lst = [] и позже lst [], что вы пытаетесь сделать?   -  person Willem Van Onsem    schedule 19.02.2018
comment
Извините, это ошибка, которая означает пустой список. я обновлю это   -  person kennedy kolute    schedule 19.02.2018
comment
могу ли я получить помощь по функции findTransition. это действительно поможет мне понять больше   -  person kennedy kolute    schedule 19.02.2018
comment
@kennedykolute Вы должны начать с учебника по Haskell, особенно о типах и подписях типов. Знание того, какую сигнатуру типа должна иметь функция, поможет вам в реализации. Я предлагаю вам проверить http://learnyouahaskell.com/.   -  person Paul Georg Podlech    schedule 20.02.2018


Ответы (1)


Это домашнее задание для курса, который вы посещаете, или это самостоятельное изучение Haskell? Если это самонаведение, я думаю, вы пытаетесь выполнить упражнение, которое слишком сложно для вас на данном этапе. Я бы посоветовал взглянуть на этот ответ: Начало работы с Haskell. Несмотря на то, что это старый ответ, он время от времени обновлялся, и большинство ресурсов по-прежнему полезны. На веб-сайте http://www.haskell.org также есть ссылки на множество ресурсов для изучения Haskell в разделе " Раздел «Документация».

Если это домашнее задание для курса, который вы посещаете, у вас могут быть проблемы. Вы делаете несколько довольно простых ошибок в своем коде (используете elem там, где вам нужно `elem`; пытаетесь применить last к четырем аргументам; используете идентификатор верхнего регистра DFA в качестве имени переменной), которые показывают, что вы не владеете основами Haskell. все же.

Возможно, вам следует поговорить со своим профессором и сообщить ему или ей, что это задание вам не по силам. Может быть, вы можете получить расширение или, может быть, вы можете предложить сдать решение Java для частичного кредита (при условии, что этот курс не является конкретно курсом Haskell).

Если вы настаиваете на продвижении вперед, вот подсказка. Вы просите помощи в написании одной из самых сложных функций, findTransition, но вы даже не написали «простых», таких как allStates, firstState и так далее. (Вы использовали те же имена в своем решении, но определили их как константы для конкретного DFA вместо того, чтобы сделать их функциями, применяемыми к общему кортежу DFA, что требуется для назначения).

Итак, можете ли вы заполнить следующий шаблон, заполнив символы подчеркивания, чтобы ответить на части 1 и 2 (б)?

-- 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. На этом этапе вам, вероятно, потребуется узнать о функциях find или filter, или же вам нужно научиться писать функции рекурсивного списка.

person K. A. Buhr    schedule 19.02.2018