表示自动机的数据结构

Posted

技术标签:

【中文标题】表示自动机的数据结构【英文标题】:Data structure to represent automata 【发布时间】:2012-05-17 23:58:03 【问题描述】:

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

直观地说,接近于 zippers 对树的东西将是完美的:这些算法是状态合并算法,它们保持对状态的某种关注(蓝边),因此将受益于某种 zippers 快速到达有趣的点.但我有点迷失了,因为 DFA(确定论有限自动机)更像是一种图形结构而不是树状结构:转换可以让你回到结构中,这不太可能使拉链正常。

所以我的问题是:您将如何表示 DFA(或至少是它的转换)以便您可以快速操作它?

【问题讨论】:

【参考方案1】:

让我从 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

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

【讨论】:

谢谢,这是一个有趣的答案。但是,恐怕我现在还不够习惯使用Arrows 和Categorys 抽象来真正使用它。不过我会把它放在角落里:)【参考方案2】:

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

否则,您可以尝试使用“派生(数据)”定义自己的结构并使用"Scrap Your Zipper" 库来获取 Zipper。

【讨论】:

感谢您的建议,我会尝试看看它是否符合我的需要:) 或者只是传入一对包含您自定义的 pred 和 succ 的函数。【参考方案3】:

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

【讨论】:

【参考方案4】:

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

源代码非常复杂,但它是带有标记 DFA 的正则表达式的实现,针对性能进行了调整,因此它应该说明一些有效表示 DFA 的良好做法。

【讨论】:

以上是关于表示自动机的数据结构的主要内容,如果未能解决你的问题,请参考以下文章

怎样在SQl数据库的表格里添加“序号”表示字段

数据类型转换

mysql自动备份影响数据库运行吗

mysql自动备份影响数据库运行吗

如何使用PHP自动备份数据库

2.5数据类型的转换