Как перебрать список, чтобы получить значения в функции перехода в haskell? - PullRequest
1 голос
/ 20 октября 2019

Мне поручено определить (минимальный) DFA в haskell. Он находится в форме ([состояния], «язык», функция перехода, начальное состояние, [принимать состояния]) и должен принимать целое число и создавать для него DFA для двоичных чисел, которые делятся на это число,Например, функция 4 создаст DFA для двоичных чисел, которые делятся на 4.

Я начал с создания DFA с 1 по 6, чтобы посмотреть, какой шаблон он использует, и я выяснил,что если он находится в состоянии и получает 0, двоичное число удваивается, поэтому это означает, что состояние удваивается, а если он получает 1, состояние удваивается и добавляется со значением 1.

Здесьэто пример того, что я сделал для всех чисел, делимых на 4.

create 4
  = ([0,1,2,3], "01", ts, 0, [0])
    where
      ts = [ ((0, '0'), 0)
           , ((0, '1'), 1)
           , ((1, '0'), 2)
           , ((1, '1'), 3)
           , ((2, '0'), 0)
           , ((2, '1'), 1)
           , ((3, '0'), 2)
           , ((3, '1'), 3)
           ] 

Вот начало моего обобщенного создателя DFA, который принимает целое число n.

create n
  = ([0..(n-1)], "01", ts, 0, [0])
    where
      ts = [ ((x, '0'), x `mod` n)
           , ((x, '1'), (x*2 + 1) `mod` n)
           ] 
        #where x is an iterated number through the states array

Я неконечно, если это лучший или правильный способ сделать это ..

Я, по сути, хочу, чтобы он перебирал массив состояний, и для каждого состояния создавал 2 функции перехода по одной, если он получает '0', иодин, если он получает '1', и примените приведенную выше логику.

Я новичок в haskell, поэтому не совсем уверен, как подойти к этому. Любой совет будет принята с благодарностью!

1 Ответ

2 голосов
/ 20 октября 2019

Подсказка: списки - это своего рода цикл. Таким образом, вы можете написать

ts =
    [ {- this part is your job -}
    | x <- [0..n-1]
    , char <- ['0', '1']
    ]

, и это будет своего рода вложенный цикл, который перебирает все числа в диапазоне от 0 до n-1 и все двоичные цифры. В месте {- this part is your job -} вы можете использовать имена x и char для текущих значений двух циклов соответственно.

...