我的任务是在haskell中定义(最小)DFA。它采用以下形式([状态],“语言”,过渡函数,开始状态,[接受状态]),并应采用一个整数,并为可被该数字整除的二进制数字为其创建DFA。 。例如,函数4将为可被4整除的二进制数字创建DFA。
我从创建1到6的DFA开始,以某种方式了解它所采用的模式,并且我发现,如果它处于一种状态并接收到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的新手,因此不确定如何解决这个问题。任何建议将不胜感激!
答案 0 :(得分:2)
提示:列表推导是一种循环。所以,你可以写
ts =
[ {- this part is your job -}
| x <- [0..n-1]
, char <- ['0', '1']
]
,这将是一种嵌套循环,它循环遍历0
至n-1
范围内的所有数字以及所有二进制数字。在{- this part is your job -}
点,可以将名称x
和char
分别用于两个循环的当前值。