我试图在Haskell中编写一个程序,该程序返回从初始状态开始的可达状态列表,类似于深度优先搜索。从初始状态开始返回DFA中的所有可达状态
states_reachable :: Eq st => DFA st -> [st]
states_reachable (qs, sigma, delta, s, inF) =
[delta q a | q <- qs, a <- sigma]
注:
- 适量是状态集合
- 西格玛的是字母表
- 增量是,需要一个状态和一个符号和一个过渡函数返回下一个状态
- 小号是初始状态
- INF是如果状态是接受状态,则返回true的函数,否则为假
作为功能现在被定义:
[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函数返回的所有新状态递归构建此列表。
让我想起本文http://matt.might.net/papers/might2011derivatives.pdf的,你也可以看看TDFA实现的灵感如何在Haskell中实现https://hackage.haskell.org/package/regex-tdfa – 2014-10-26 17:46:55