Мне поручено определить (минимальный) 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, поэтому не совсем уверен, как подойти к этому. Любой совет будет принята с благодарностью!