BMF学习笔记

news/2024/12/20 20:31:44/文章来源:https://www.cnblogs.com/william555/p/18619932

引言

学习了Haskell、学习了Agda,我们已经初步掌握了使用函数式编程进行编写程序、编写证明的方法。
但是目前我们使用Agda进行的证明还是十分规范的代数形式的证明。如果想要严格地证明两个算法的等价性(而不是像OI题解里一样各种画图、感性理解之类的),我们就需要一种方法把算法写成代数的形式,再使用Agda之类的工具进行证明。
于是,我们有了BMF(Bird Meeterns Formalism)。简要来说,这是一种用于将程序代数风格化,以方便程序设计和程序转换的方法。

List

BMF建立在函数式编程的基础上,把计算描述为函数的复合。计算的一大特征是,一般要对一系列数据进行操作,不妨把这些数据按某种顺序排成一列,于是发现,我们的计算主要是建立在列表List上的。对List,我们有基本的操作 ++(append) ,即将 (x ++ y) 就是将List x,y 首尾相连拼起来。很明显,++具有结合律和单位元 [], 故(List,++,[])是一个幺半群。

先介绍在List上基本的高阶函数:map,reduce。
map:用 \(*\) 来表示,\(f * [a_1,\cdots,a_n] = [f (a_1),\cdots,f (a_n)]\)
reduce:用 / 来表示 \(\oplus / [a_1,\cdots,a_n] = a_1 \oplus a_2 \oplus \cdots \oplus a_n\)
对应命令式编程里的循环,定义foldl,foldr:
\(\oplus \to _e [a_1,\cdots,a_n] = e \oplus a_1 \oplus \cdots \oplus a_n\)
\(\oplus \leftarrow _e [a_1,\cdots,a_n] = (a_1 \oplus \cdots \oplus (a_n \oplus e))\)
又定义scanl,scanr
\(⊕→// _e[a_1, a_2, . . . , a_n] = [e, e ⊕ a_1, . . . ,((e ⊕ a_1)⊕)· · · ⊕ a_n]\)
\(⊕ ←// _e[a_1, a_2, . . . , a_n] = [a_1 ⊕ (a_2 ⊕ · · · ⊕ (a_n ⊕ e)), . . . , a_n ⊕ e, e]\)

Homo

在幺半群上定义同态映射(homomorphism),\(h\),定义如下:
对函数 \(h : A \to B\) ,其中 \((A,\oplus,e_1),(B,\otimes,e_2)\)为两个幺半群,以下两条成立,则称 \(h\) 为同态映射:

  1. \(h (e_1) = e_2\)
  2. \(h(x \oplus y) = h(x) \otimes h(y), \forall x,y \in A\)

List是幺半群,于是我们可以定义在 List 上的homo \(h : [A] \to B\),只要满足:

  1. \(h ([]) = e\)
  2. \(h ([x]) = f (x)\)
  3. \(h (xs ++ ys) = h(xs) \otimes h(ys)\)
    \(h (a)\) 按定义展开,可以发现 \(h =\otimes / \cdot f *\),其中 \(\cdot\) 表示函数复合。为什么要介绍homo?因为其计算过程是满足结合律的,适合并行计算!

一些等式

map&reduce promotion

有map和reduce的定义可以得:

  1. \(f * \cdot ++ / = ++ / \cdot (f *)*\)
  2. \(\oplus / \cdot ++ /= \oplus / \cdot (\oplus /) *\)
    这个等式可以让我们把 ++ 往左移或去掉,可以尽量减少++的次数,减少对数据结构的改动

Accumulation lemma

  1. \(\oplus \to// _e =\oplus \to _e * \cdot inits\)
  2. \(\oplus \leftarrow // _e =\oplus \leftarrow _e * \cdot tails\)
    这个等式十分强大,可以发现从复杂度的角度来看,左边的计算是线性的,而右边的是平方。我们可以通过这个等式变换降低计算的复杂度

Horner's rule

如果两个homo \(\oplus,\otimes\),满足分配率: \((a\oplus b) \otimes c = (a\otimes c) \oplus (b\otimes c)\)则以下等式成立:
\(\oplus / \cdot \otimes / * \cdot tails = \odot \to _e,a \odot b = (a \otimes b) \oplus id_\otimes\)
这条性质同样可以降低复杂度。

Maxium Segment Sum

先在BMF的形式下写出从定义直接得到的算法:\(mss = \uparrow / \cdot +/* \cdot segs\)
其中segs表示虽有子段,\(segs = ++ / \cdot tails * \cdot inits\)
然后类似Agda等式推理的形式,我们进行推理:

\[\begin{aligned} mss =& \uparrow / \cdot +/* \cdot segs \\ =&\uparrow / \cdot +/* \cdot ++/ \cdot tails * \cdot inits \\ =&\{map \; promotion\}\\ &\uparrow / \cdot ++/ \cdot (+/*)* \cdot tails * \cdot inits \\ =& \{ (f*) \cdot (g*) = (f \cdot g) *\} \\ &\uparrow / \cdot ++/ \cdot ((+/*) \cdot tails) * \cdot inits \\ =& \{reduce promotion\} \\ &\uparrow / \cdot( \uparrow / \cdot +/* \cdot tails) * \cdot inits \\ =& \{Horn's \; rule \}\\ &\uparrow / \cdot (\odot \to _0 )* \cdot inits ,a \odot b= (a+b) \uparrow 0\\ =& \{accumulation \; lemma\} \\ &\uparrow \cdot (\odot \to // _0) \end{aligned} \]

(好麻烦,我手敲了半个小时)。

然后只需使用agda编写上面所说的所有性质即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/856057.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20222418 2024-2025-1《网络与系统攻防技术》实验八实验报告

1.实验内容 (1)Web前端HTML 能正常安装、启停Apache。理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML。 (2)Web前端javascipt 理解JavaScript的基本功能,理解DOM。 在(1)的基础上,编写JavaScript验证用户名、密码的规则。在用户点击登陆按钮后回显“欢迎+…

Java 基础概览

1. Java 语言概述 1.1 Java 简史 Java是一种高级程序设计语言,由SUN(Stanford University Network,斯坦福大学网络公司)公司于1995年推出,James Gosling设计Java语言,并开发了Java编译器和Java虚拟机,因此也被人尊称为“Java 之父”。SUN公司在2009年被Oracle(甲骨文)…

Linux学习笔记(一) Linux目录结构

下图显示的为Linux中的目录结构:/bin[常用](/usr/bin、/usr/local/bin) 是Binary(二进制)的缩写,这个目录存放着经常使用的命令。 /sbin(/usr/sbin、/usr/local/sbin) s就是Super User的意思,这里存放的是系统管理员使用的系统管理程序。 /home[常用] 存放普通用户的家目…

数据库审计与监控

title: 数据库审计与监控 date: 2024/12/20 updated: 2024/12/20 author: cmdragon excerpt: 数据库审计与监控是确保数据库安全性和性能的关键环节。通过实施有效的审计策略,可以追踪用户活动,监控数据访问与修改,从而及时发现潜在的安全威胁和性能瓶颈。探讨数据库审计的基…

Java实现单词的翻译(详解爬虫操作)

JAVA通过Crawler实现英语单词的翻译首先声明一点,这种方法仅限于低频次的交互来获取翻译信息,一旦一秒内大量的请求会被重定向,那就直接不能用了 如果希望可以批量查询英语单词翻译,可以查看我的下一篇博客。接着我们上一讲Java如何用HaspMap统计次数并排序详解 - ivanlee7…

实用工具:Calibre 7.22最新版 一款Window电子书管理工具和阅读器便携版

📢提示:文章排版原因,链接放在文章结尾👇👇,往下翻就行 📢提示:文章排版原因,链接放在文章结尾👇👇,往下翻就行 前言 初识Calibre 最近有几本epub格式的电子书要看发现电脑上没有可以打开的软件,所以最近找到了这个软件。功能 功能亮点电子书管理:Calib…

VS2022 C++QT 中文乱码 设置UTF-8编码

说明 所有内容来源于网络 通过插件调整源文件编码FileEncoding:查看编码 Force UTF-8:用于保存为UTF-8 C++项目设置为utf-8 项目-属性-配置属性-C/C++-命令行-其它选项 中 增加/utf-8、

雷池 WAF 配置了多条人机验证规则,命中规则是怎样的?

优先级说明 频率限制(1 小时) > 自定义规则(1 小时) > 站点 BOT 防护(自定义时长) 配置人机验证的地方 【防护配置-频率限制】限制结果选择【人机验证】【防护配置-自定义规则】规则类型选择【人机验证】【防护站点-站点管理】的【BOT 防护】中开启【人机验证】命中…

如何在C#.NET中使用LINX(arduino的LabView库)

思路:使用LabView的导出为.NET互操作程序集,导出COM给.NET调用在LabView安装HubMaker插件,将预编译固件刷入Arduino设备中。这不是本文的重点,省略 根据需要,编写VI。注意:必须在此处使用全局变量或者其它方法避免LinxResource簇在C#中出现,否则在程序运行时有概率出现堆…

C#.Net NModbus库 简单代码案例(非Nmodbus4库)

在NuGet管理器中搜索NModbus。注意,如果需要使用串口通信需要同时选中相关包

EyeSoothe荣登中国区“健康健美”类第32名! ✨

眼睛疲劳、视力变化、色盲检测、虚拟眼镜试戴……这些问题,EyeSoothe都能帮你解决!作为一款全能眼健康应用,EyeSoothe集成了多个强大功能,旨在帮助你更好地保护视力,缓解眼部疲劳,随时关注眼健康。📱💡 https://apps.apple.com/app/eyesoothe/id6478070048 为什么选择…

腾讯云 AI 代码助手:代码诊断应用实践

代码诊断是指通过分析和检查源代码,发现并定位其中的错误、缺陷或不规范之处。传统的代码诊断方法主要依赖于人工审查和简单的静态分析工具,结合流水线的自动化能力并且结合质量门禁建立不同的质量阈值关卡。基于 AI 赋能代码诊断是在传统的能力基础上在次进行质量左移,通过…