【发布时间】:2014-12-21 21:28:31
【问题描述】:
我正在尝试在 Haskell 中编写一个程序,它返回从初始状态开始的可达状态列表,类似于深度优先搜索。
states_reachable :: Eq st => DFA st -> [st]
states_reachable (qs, sigma, delta, s, inF) =
[delta q a | q <- qs, a <- sigma]
注意:
- qs 是状态集
- sigma 是字母表
- delta 是一个转换函数,它接受一个状态和一个符号并返回下一个状态
- s 是初始状态
- inF 是一个函数,如果状态是接受状态,则返回 true,否则返回 false
现在定义函数:
[delta q a | q <- qs, a <- sigma]
返回 DFA 中的所有状态(不正确)。
我想要的是通过从初始状态 s 开始并使用每个输入测试 delta 函数来填充列表。
例如:
// returns the states reachable from the initial state for all symbols in sigma
[delta s a | a <- sigma]
下一步将针对添加到列表中的每个新状态重复该过程。这可能会添加重复项,但我可以稍后将其删除。
然后我尝试了:
[delta q a | q <- [delta s a | a <- sigma], a <- sigma]
我认为这可能有效,但它不起作用,因为它正在创建内部列表,然后使用它来填充外部列表,然后停止。
我需要通过探索 delta 函数返回的所有新状态来递归地构建这个列表。
【问题讨论】:
-
让我想起了这篇论文matt.might.net/papers/might2011derivatives.pdf,您还可以查看 TDFA 实现以获取如何在 Haskell 中实现的灵感hackage.haskell.org/package/regex-tdfa