表示自动机的数据结构

时间:2012-05-09 12:56:21

标签: haskell data-structures dfa

我目前正在尝试提出一种数据结构,以满足我想在Haskell中实现的两种自动机学习算法的需求:RPNIEDSM。< / p>

直观地说,拉链与树木接近的东西是完美的:那些算法是状态合并算法,它们在状态上保持某种焦点(蓝色条纹),因此可以从某种拉链中获益,快速达到有趣的点。但是我有点失落,因为DFA(确定性有限自动机)更像是一个类似于树状结构的图形结构:过渡可以让你回到结构中,这不太可能使拉链成为可能。 / p>

所以我的问题是:你将如何表示DFA(或至少它的过渡),以便你可以快速操纵它?

4 个答案:

答案 0 :(得分:9)

让我先从Haskell中自动机的通常不透明表示开始:

newtype Auto a b = Auto (a -> (b, Auto a b))

这表示一个函数,它接受一些输入并产生一些输出以及它自身的新版本。为方便起见,它既是一个类别,也是一个箭头。它也是一个应用函子家族。不幸的是这种类型是不透明的。没有办法分析这个自动机的内部。但是,如果用透明表达式替换opaque函数,则应该得到可以分析和操作的自动机:

data Expr :: * -> * -> * where
    -- Stateless
    Id      :: Expr a a

    -- Combinators
    Connect :: Expr a b -> Expr b c -> Expr a c

    -- Stateful
    Counter :: (Enum b) => b -> Expr a b

这使您可以访问计算结构。它也是一个类别,但不是箭头。一旦它成为箭头,你就会在某处出现不透明的功能。

答案 1 :(得分:5)

您可以使用图表开始使用吗?我认为fgl包是Haskell平台的一部分。

否则,您可以尝试使用'derived(Data)'定义自己的结构,并使用"Scrap Your Zipper"库来获取Zipper。

答案 2 :(得分:0)

如果您不需要任何花式图算法,则可以将DFA表示为Map State State。这为您提供了快速访问和操作。您还可以通过跟踪当前状态来获得焦点。

答案 3 :(得分:0)

查看regex-tdfa包:http://hackage.haskell.org/package/regex-tdfa

源代码非常复杂,但它是带有标记DFA的正则表达式的实现,因此它应该说明一些有效表示DFA的良好实践。