Buchi自动机/有限状态机在haskell上的实现

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作为转换函数。所述映射所

Haskell是个新手,我必须实现一个buchi自动机

我最初的实现是这样的

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的函数。我还需要函数来删除和删除状态,例如,对于从不接受的状态,即没有路径的状态,指向具有最终状态的强连接组件。