Buchi自动机/有限状态机在haskell上的实现
Haskell是个新手,我必须实现一个buchi自动机 我最初的实现是这样的Buchi自动机/有限状态机在haskell上的实现,haskell,Haskell,Haskell是个新手,我必须实现一个buchi自动机 我最初的实现是这样的 data NBA s a = NBA { states :: [s]; finalStates :: [s]; initialStates :: [s]; delta :: Data.Map s [(a, s)]} 使用Data.Map作为转换函数。所述映射所
data NBA s a = NBA { states :: [s];
finalStates :: [s];
initialStates :: [s];
delta :: Data.Map s [(a, s)]}
使用Data.Map作为转换函数。所述映射所做的是针对给定状态返回一个包含元组(a,s)的列表,其中a是字母符号,s是目标状态
然而,我最近看到有人在实现自动化,比如
data NBA s a = NBA { states :: [s];
finalStates :: [s];
initialStates :: [s];
delta :: s -> [(a, s)]}
这就把转换函数留给了用户标准,用户可以使用他们想要的任何数据结构。例如,他们甚至可以使用模式匹配来定义增量。此外,所有与buchi一起工作的函数,例如,bfs可以使用delta自动机s
访问从s可访问的所有状态,而不是使用Map.lookup
这让我想知道,实现Buchi自动机最简单的方法是什么
thak认为第二次实施的一个明显缺点是取消一个州。除非有不同的执行方式,例如,删除一个国家
deleteState :: NBA -> s -> NBA
deleteState a s = { states = delete s (states a);
finalStates = delete s (states a);
initialStates = ...;
delta = filter (snd != s) (delta a)
}
在新的自动机中,每次调用
delta
都会伴随着应用过滤器。您能澄清一些问题吗?是什么激发了状态
、初始状态
和最终状态
记录字段?NBA是如何使用的?@IsaacvanBakel,最终状态只是一个包含接受状态的列表,初始状态只是一个包含初始状态的列表,就像在普通FSM中一样,但它们有什么用途?如果不了解您的类型是如何使用的,就很难给出如何“Haskell化”此解决方案的反馈。@IsaacvanBakel。它们用于模型检查问题,类似于LTL。我有计算强连接组件bfs的函数。我还需要删除和删除状态的函数,例如,对于从不接受的状态,即没有路径的状态,指向具有最终状态的强连接组件。您能否澄清一些问题?是什么激发了状态
、初始状态
和最终状态
记录字段?NBA是如何使用的?@IsaacvanBakel,最终状态只是一个包含接受状态的列表,初始状态只是一个包含初始状态的列表,就像在普通FSM中一样,但它们有什么用途?如果不了解您的类型是如何使用的,就很难给出如何“Haskell化”此解决方案的反馈。@IsaacvanBakel。它们用于模型检查问题,类似于LTL。我有计算强连接组件bfs的函数。我还需要函数来删除和删除状态,例如,对于从不接受的状态,即没有路径的状态,指向具有最终状态的强连接组件。