Last是免费的monoid吗?

如何解决Last是免费的monoid吗?

免费的类人动物通常被视为“列表类人动物”。但是,我对其他可能会给我们提供免费半身像的单字结构感兴趣。

首先,让我们回顾一下免费monoids 的定义。我从来没有完全理解过如何定义免费monoid 作为遵守monoid法则的结构。我们如何证明某事除上述规定外没有任何规则?还是这只是一种直觉?

无论如何,我们将要讲函子。如果某些Monoid是免费的,我们可以使用免费仿函数来获得。显然,列表在这里很方便:

free :: Set -> Mon
free a = ([a],(++),[])

但是,一个人可能会提出另外几个。例如,以下是LastData.Monoid的一个:

freeLast :: Set -> Mon
freeLast a = (Last a,(<>) :: Last a -> Last a -> Last a,Last Nothing) 

因此,此函子是否使Last成为免费的半身像?更一般而言,如果存在Monoid (T a)的守法实例,T免费的monoid 吗?

解决方法

这里是了解免费的半身像的一种方法:如果有人给您一个价值,那么您可以推断出多少价值?考虑自然数的加法mono素。我给你7,问你我怎么得到它。我可以添加4 + 3或3 + 4或2 + 5等。有很多可能性。此信息丢失。另一方面,如果我给您一个列表[4,3],则您知道它是由单例[4][3]创建的。除了可能涉及一个单元[]。可能是[4]<>[3]<>[][4]<>[]<>[]<>[3]。但这绝对不是[3]<>[4]

如果列表较长,[1,2,3],则有其他选项([1]<>[2]) <> [3][1] <> ([2]<>[3]),以及所有可能的空列表插入。因此,您丢失的信息遵循单位定律和关联性,但没有其他。一个免费的monoid值会记住其创建方式,模数定律和关联性。

,

为了举例,让我们采用非负整数,即0,1,...。我们可以制造多少个猩猩?

定义mempty = 0(<>) = (+)。您可以很容易地证明这是一个单面体。

定义mempty = 1(<>) = (*)。同样,这是一个monoid(证明它,很容易)

上面定义的两个等分线对称为自然数上的 additive multiplicative 单子对。它们的结构不同,例如,乘积mono半群中的元素0的行为与加法mono半群中的任何其他元素完全不同,因此自然数内部存在某些东西,这使得此mono半群不同(将此声明保留到下一段)。

存在我们可以创建的第三个monoid,我们称其为 concatenation monoid。

定义mempty = no-action(<>) = glue one integer beside the other

例如,3 <> mempty = 33 <> 2 = 32。请注意,元素是自然数这一事实与此处无关。如果我们使用自然数而不是自然数,或者采用您喜欢的任何符号,则该类将完全相同。(*阅读脚注)因此,基础集合内部没有任何东西使该类与其他。这就是为什么Monoid是自由的,因为它不依赖于Naturals的算术规则,也不依赖于Monoid规则以外的任何其他规则。

这是自由构建一个monoid的唯一方法,而不依赖于基础集合的内部规则。当然,串联表示为haskell中的列表。

  • 注意:唯一重要的一点是它们共享相同数量的元素。例如,具有三个元素abc的自由monoid将是这三个元素的任意连接,但是您可以选择以下任何一种符号:1,{ {1}},23αβ ...,而类人动物将是同一件事
,

这是Last满足的另一条法律:

forall (t :: Type) (x,y :: t).
  Last (Just x) <> Last (Just y) === Last (Just y)

因为它满足其他法律,所以它一定不能是免费的Monoid。

,

首先,让我们回顾一下免费monoid的定义。我从来没有完全理解如何将自由的monoid定义为遵守monoid法则而不是其他任何东西的结构。我们如何证明某物没有遵守任何规则,但上面已阐明?还是这只是一种直觉?

让我说明一下免费类人猿的目的。

如果我告诉您有一个包含一些元素abc的monoid,您可以从中得出什么?

  • 通过编写涉及 generators abc和monoid操作(+)的表达式,我们可以找到该类四面体的更多元素和0(又名(<>)mempty)。 (请参阅答案后半部分的定义1。)
  • 我们可以使用等分定律来证明某些表达式表示相同的元素:我们可以证明诸如((a + 0) + b) = (a + b)之类的方程式。 (定义2。)实际上,我们可以仅凭知识就可以证明方程组是在任何等式中对任何值abc持有的方程。 (定理1。)

我们不能仅从等分面定律中证明方程式吗?例如,我们无法证明(a + b) = (b + a)。但是,如果我们仅知道类半定律,我们也无法证明其否定(a + b) /= (b + a)。这意味着什么?事实证明,该方程式在某些等式(例如,交换式等式)中成立,但在其他等式中不成立:例如,选择一个x + y = y几乎所有xy的等号(是Haskell中的Last Monoid),如果我们选择不同的ab,则选择(a + b) /= (b + a)

但这只是一个例子。对于仅凭单半定律不能证明的方程式,我们可以大体说些什么?自由monoid提供了一个明确的答案,实际上是一个通用的反例:在自由monoid(由abc生成的情况下,无法证明的方程式是错误的)。换句话说,当且仅当在自由单面体中为真(强调“ if”)时,我们才可以使用单面体定律证明方程e = f。 (定理2。)这与直觉认为自由的类人动物“仅遵守类人动物法律而没有其他事情”的直觉相对应。

那么,这个仿函数使Last成为免费的半身像吗?更一般而言,如果存在Monoid(T a)的守法实例,T是自由的monoid吗?

Last单面体不是免费的,因为它使方程组的真实性超出了您只能从单面体定律中实际证明的方程式。参见other answer

forall (t :: Type) (x,y :: t).
  Last (Just x) <> Last (Just y) === Last (Just y)

这是上面的形式的草图。

定义1。由(一些原子符号)ABC生成的 monoid表达式的集合为由语法定义:

e ::=
  | A | B | C   -- generators
  | e + e       -- binary operation (<>)
  | 0           -- identity (mempty)

给出任何“合适的monoid”,即在(M,(+),0)中具有某些选定元素abc的monoid M(不必区分),表达式e表示eval e中的元素M

定义2。一个等式是一对表达式,写成e ~ f可证明方程组是满足以下条件的最小方程组(“最小”(按包含顺序排序)):

  1. 它包括类半定律:(e + 0) ~ e(0 + e) ~ e((e + f) + g) ~ (e + (f + g))是可证明的。
  2. 这是一个等价关系(将一组元组视为一个关系):例如,对于自反性,e ~ e是可证明的。
  3. 这是一个全等关系:如果e ~ f是可证明的,则(g + e) ~ (g + f)(e + g) ~ (f + g)是可证明的。

(该定义的想法是断言“ e ~ f是可证明的”成立且仅当可以通过“应用”这些规则推论得出。“最小集”是将其形式化的常规方法。 )

“可证明方程式”的定义似乎是任意的。那些定义“可证明性”的正确规则吗?为什么特别要遵循这三个规则?值得注意的是,在首次尝试给出这种定义时,一致性规则可能并不明显。这是以下定理,稳健性和完整性的重点。添加(非冗余)规则,我们将失去健全性。删除规则,我们将失去完整性。

定理1。(健全性)如果e ~ f是可证明的,则eval e = eval f在任何“合适的单半体” M中。

定理2。(完备性)如果e ~ f不可证明,则它们的表示形式在Feval e /= eval f中不同,其中F是由ABC生成的免费monoid。

(声音听起来比完整性更容易证明。练习供读者阅读。)

该完备性定理是对自由等分形的刻画:使该定理的陈述为真的任何其他等分形F与该自由等分形是同构的(从技术上讲,这既需要完整性,又需要表示函数的假设) eval : Expr -> M是排斥的)。这就是为什么我们可以说“免费的monoid”而不是“列表的monoid”;在这种表示形式无关紧要的情况下(“达到同构”),这种做法最准确。

实际上,如果通过等价关系“ _ ~ _是可证明的”将“自由monoid”定义为等分表达式的商,则完整性是微不足道的。艰苦的工作实际上存在于一个单独的证明中,即该等式与列表的等式同构。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-