Haskell 中的有限自动机

2024-04-12

在 Haskell 中表示有限自动机的好方法是什么?它的数据类型是什么样的?

在我们学院,自动机被定义为 5 元组

(Q, X, delta, q_0, F)

其中 Q 是自动机状态的集合,X 是字母表(这部分是否必要),delta 是从 (Q,X) 获取 2 元组并返回状态/-s 的转换函数(在非确定性版本中), F 是接受/结束状态的集合。

最重要的是,我不知道什么类型delta应该有...


有两个基本选项:

  • 显式函数delta :: Q -> X -> Q (or [Q]正如斯文·海格所建议的那样。
  • A map delta :: Map (Q, X) Q例如使用Data.Map,或者如果您的州/字母表可以按升序数字索引Data.Array or Data.Vector.

请注意,这两种方法本质上是等效的,可以从映射版本转换为函数版本(由于额外的原因,这略有不同)Maybe来自lookup调用)相对容易

delta_func q x = Data.Map.lookup (q,x) delta_map

(或者针对您使用的任何映射类型的查找函数的适当柯里化版本。)


如果您在编译时构造自动机(因此知道可能的状态并可以将它们编码为数据类型),那么使用函数版本可以为您提供更好的类型安全性,因为编译器可以验证您是否已涵盖所有情况。

如果您在运行时构建自动机(例如,根据用户输入),则存储delta作为映射(并且可能执行上面的函数转换)并具有适当的输入验证来保证正确性,以便fromJust是安全的(即地图中总是有一个条目用于任何可能的(Q,X)元组,因此查找永远不会失败(永远不会返回Nothing)).

非确定性自动机与映射选项配合得很好,因为查找失败与没有状态可去相同,即空的[Q]列表,所以不需要any的特殊处理Maybe除了打电话给join . maybeToList (join来自Data.Monad and maybeToList来自Data.Maybe).


另一方面,字母表绝对是必要的:它是自动机接收输入的方式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Haskell 中的有限自动机 的相关文章

  • 不同编程语言中的浮点数学

    我知道浮点数学充其量可能是丑陋的 但我想知道是否有人可以解释以下怪癖 在大多数编程语言中 我测试了 0 4 到 0 2 的加法会产生轻微的错误 而 0 4 0 1 0 1 则不会产生错误 两者计算不平等的原因是什么 在各自的编程语言中可以采
  • 我是否需要采取明确的操作来促进与持久数据结构的共享?

    我来自命令式背景 正在尝试实现一个简单的不相交集 并集查找 数据结构 以获得在 Haskell 中创建和修改 持久 数据结构的一些练习 目标是有一个简单的实现 但我也关心效率 我的问题与此相关 首先 我创建了一个按等级并集的不相交集森林实现
  • 纯 Haskell 代码需要线程池吗?

    In 现实世界 Haskell 第 28 章 软件事务内存 http book realworldhaskell org read software transactional memory html 开发了一个并发网络链接检查器 它获取网
  • RankN多态性和令人发指的克莱斯利之箭

    我不明白为什么 demobind1 的定义会产生一些编译器错误 它看起来像一个愚蠢的翻转 但不知何故 LANGUAGE GADTs LANGUAGE RankNTypes ScopedTypeVariables TypeOperators
  • Haskell 处理负参数

    尝试对两个值求和 其中只有一个为负值 例如 1 and 2 soma Float gt Float gt Float soma x1 x2 x1 x2 结果出现错误 为什么
  • 如何同时将透镜(或任何其他光学器件)视为吸气剂和设置剂?

    我正在尝试编写一个通用记录更新程序 它允许人们轻松更新记录中的字段existing记录 字段形状相似incoming记录 这是我到目前为止所拥有的 applyUpdater fields existing incoming let gett
  • 自定义 monad 的 MonadTransControl 实例

    的文档monad control提供有关如何创建实例的示例MonadTransControl using defaultLiftWith and defaultRestoreT 该示例适用于以下情况newtype newtype Count
  • 如何使用foldr为列表创建显示实例?

    我想为我的数据类型 我的列表 编写自己的显示实例 到目前为止 我的方法是有效的 但我总是在末尾有一个逗号 我已经尝试用最后一个元素启动折叠并将其从列表中删除 但它很麻烦而且不起作用 有没有更简单的方法来获得正确的解决方案 实际 1 2 3
  • 如何让 do 块提前返回?

    我正在尝试使用 Haskell 抓取网页并将结果编译到一个对象中 如果出于某种原因 我无法从页面获取所有项目 我想停止尝试处理页面并提前返回 例如 scrapePage String gt IO scrapePage url do doc
  • Data.Array 有多快?

    The 文档 http haskell org ghc docs latest html libraries array 0 3 0 3 Data Array html of Data Array reads Haskell 提供了可索引数
  • 你将如何在 Haskell 中(重新)实现迭代?

    iterate a gt a gt a gt a 你可能知道 iterate是一个接受函数和起始值的函数 然后它将函数应用于起始值 然后将相同的函数应用于最后的结果 依此类推 Prelude gt take 5 iterate 2 2 2
  • Haskell 中多核编程的现状如何?

    Haskell 中多核编程的现状如何 现在有哪些项目 工具和库可用 有哪些经验报道 2009年至2012年期间 发生了以下事件 2012 从 2012 年开始 并行 Haskell 状态更新开始出现在并行 Haskell 摘要 http w
  • 如何从具有函数依赖关系的类型类中获取和使用依赖类型?

    如何从具有函数依赖关系的类型类中获取和使用依赖类型 为了澄清并给出我最近的尝试的一个例子 从我正在编写的实际代码中最小化 class Identifiable a b a gt b where if you know a you know
  • 在列表中查找元素及其索引

    我需要让列表的两个元素都满足谓词and这些元素的索引 我可以通过以下方式实现这一点 import Data List findIndices list Int list 3 2 4 1 9 indices findIndices gt 2
  • 如何与更高级别的类型合作

    玩弄教堂的数字 我遇到了无法指导 GHC 类型检查器处理高阶类型的情况 首先我写了一个版本 没有任何类型签名 module ChurchStripped where zero z z inc n z s s n z s natInteger
  • 在ghci中,如何删除现有的绑定?

    我收到一个 绑定影响现有绑定 错误 类似于以下错误this https stackoverflow com questions 2902716 in haskell what does it mean if a binding shadow
  • Haskell 中的内部爆炸模式是否总是强制使用外部构造函数?

    在 Haskell 中 是否存在对于数据类型 LANGUAGE BangPatterns import Control DeepSeq data D D Int 实例 instance NFData D where rnf D 与具有另一个
  • 为什么 GHC 在这里推断出单态类型,即使禁用了单态限制?

    这是由解析 f f pure 的类型 https stackoverflow com questions 55388119 resolving the type of f f pure 55388309 noredirect 1 comme
  • Haskell/Idris 中的开放类型级别证明

    在 Idris Haskell 中 可以通过注释类型并使用 GADT 构造函数 例如使用 Vect 来证明数据的属性 但这需要将属性硬编码到类型中 例如 Vect 必须是与 List 不同的类型 是否有可能拥有具有开放属性集的类型 例如同时
  • Haskell:确定函数数量的函数?

    可以写一个函数吗arity a gt Integer确定任意函数的数量 使得 gt arity map 2 gt arity foldr 3 gt arity id 1 gt arity hello 0 是的 这可以非常非常容易地完成 ar

随机推荐

  • .net core PGP加密解密

    上遇到错误void Encryption public void Encryption region PGP Encryption PgpEncryptionKeys encryptionKeys new PgpEncryptionKeys
  • 如何以人类可读的方式打开 Java .class 文件?

    我试图弄清楚 Java applet 类文件在幕后的作用 用记事本或文本板打开它只会显示一堆官样文章 有什么方法可以将其恢复为可读的格式 以便我可以尝试弄清楚它在做什么 环境 安装了 VS 2008 的 Windows jd gui htt
  • FFMPEG - 以特定时间间隔在视频上叠加多个视频

    我想以指定的时间间隔将多个视频叠加在单个视频上 尝试过不同的解决方案 但它不会像我一样工作 我使用下面的命令将视频叠加在视频上 String cmdWorking3 new String i yourRealPath i gifVideoF
  • 自动链接属性与实际链接不同的文本(setAutoLinkMask)

    例如 TextView tv TextView this findViewById R id tv tv setAutoLinkMask Linkify ALL tv setText visit website http www googl
  • 在 IIS7 上将多个域指向一个网站

    这与 SEO 没有任何关系 请不要发布任何有关 SEO 排名的内容 因为它不是这里的一个因素 我有2个网址 old websitename com 和 new websitename com 我需要在一定的时间内支持这两个 url 而不是在
  • 通过Python中的selenium驱动程序将图像导入谷歌表单

    我正在尝试将图像导入谷歌表单 我无法通过 xpath 将密钥传递给元素 看来这是一个隐藏的元素 我尝试执行脚本来取消隐藏它 但没有成功 也尝试过这个解决方案 如何使用 Selenium WebDriver python 访问隐藏的文件上传字
  • C++ 中的 Stringstream 解析单词和数字字符串

    我有这样的字符串 123加43次7 其中数字后面跟着字典中的单词 我知道我可以使用以下命令提取 int numbers gt gt 操作员 StringStream gt gt number 我可以拿到号码 然而 Stream 中仍然有该号
  • 将 JFrame 方向设置为从右到左!

    为了从右到左对齐我的 JFrame 我使用 setComponentOrientation ComponentOrientation RIGHT TO LEFT 但这仅当我使用 JFrame 的以下样式 装饰 时才有效 public cla
  • 如何使用 JaCoCo 忽略内部/嵌套类?

    我试图忽略一些生成的类 并且这些类被很好地忽略 但是 如果这些类具有内部类 则尽管父类被排除 但这些类仍然会被包含在内 这是我的配置
  • Asp.Net 3.5 路由到 Web 服务?

    我一直在寻找一种路线http www example com WebService asmx http www example com WebService asmx to http www example com service http
  • PhoneGap支持普通网络吗?

    phoneGap是否支持普通网页 如果支持的话我可以给我一个可以浏览的链接吗 thanks sri 当然 它可以加载到您现有的 UIWebView 实例中 或者加载到 ChildBrowser 中plugin http github com
  • 在 vim 中全局追加到具有匹配术语的行

    我确信这很容易 我只是缺少一两个字符 我需要在文件中搜索特定术语 当找到它时 我需要在该行添加一些内容 我想对比赛的每一行都这样做 要执行一次 我可以这样做 Thing to find s Stuff to append 简单的 如果我的
  • Java SSLHandshakeException:没有共同的密码套件

    我正在尝试使用 Java SSLSockets 将安全性应用于简单的聊天应用程序 我创建了一个自签名 CA 并用它签署了两个证书 全部使用 RSA 密钥 一个用于服务器 一个用于客户端 之后 我将证书导入到服务器的密钥库和客户端的另一个密钥
  • OS X 下 JRE 8 的 /lib/security 文件夹在哪里? [复制]

    这个问题在这里已经有答案了 我正在 OS X 下从 Java JRE 8 搜索文件夹 lib security 在 Windows 下 fodler 位于 java 安装目录的子文件夹 lib security 中 例如 C Program
  • ObservationCollection 使用 MVVM 架构在 PCL 内的 ViewModel 中实现 ISupportIncrementalLoading 以支持 WinRT 和 WP8/WinPRT

    我的 ViewModel 位于 PCL 内 因为我正在并行开发 Windows 8 1 和 Windows Phone 应用程序 我的 ViewModel 中有一个作为 ObservableCollection 的内容列表 我在 Windo
  • 深入学习 C# 表达式树的最佳资源是什么?

    当我第一次输入这个问题时 我这样做是为了找到重复的问题 我确信一定有人已经问过这个问题 我的计划是关注那些重复的链接 而不是发布这个问题 但据我所知 这个问题以前没有被问过 它没有出现在 相关问题 列表中 您找到了哪些用于深入了解 C 表达
  • Git 文件超出了符号链接范围

    我遇到了一个问题 Git 认为文件超出了符号链接的范围 因此无法对其进行版本控制 但它似乎是一个真实的文件 root r1 h stat f conf core site xml File conf core site xml ID 5c7
  • AQL 构建域对象不返回结果

    我遇到了一个问题 即使用 AQL 时无法返回对构建域对象进行的任何查询 当我进行以下卷曲时 curl X GET H X JFrog Art Api myArtifactroyKey H Cache Control no cache htt
  • .value_counts() 给出截断的结果

    我有一个 Excel 文件 其中有一列包含多个单词 我正在尝试计算每个单词出现的频率 所以如果我有一个清单 Labels a a b b c c c 输出应该是 c 3 b 2 a 2 我正在使用以下代码片段 import pandas a
  • Haskell 中的有限自动机

    在 Haskell 中表示有限自动机的好方法是什么 它的数据类型是什么样的 在我们学院 自动机被定义为 5 元组 Q X delta q 0 F 其中 Q 是自动机状态的集合 X 是字母表 这部分是否必要 delta 是从 Q X 获取 2