如何解决Last是免费的monoid吗?
免费的类人动物通常被视为“列表类人动物”。但是,我对其他可能会给我们提供免费半身像的单字结构感兴趣。
首先,让我们回顾一下免费monoids 的定义。我从来没有完全理解过如何定义免费monoid 作为遵守monoid法则的结构。我们如何证明某事除上述规定外没有任何规则?还是这只是一种直觉?
无论如何,我们将要讲函子。如果某些Monoid是免费的,我们可以使用免费仿函数来获得。显然,列表在这里很方便:
free :: Set -> Mon
free a = ([a],(++),[])
但是,一个人可能会提出另外几个。例如,以下是Last
中Data.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 = 3
和3 <> 2 = 32
。请注意,元素是自然数这一事实与此处无关。如果我们使用自然数而不是自然数,或者采用您喜欢的任何符号,则该类将完全相同。(*阅读脚注)因此,基础集合内部没有任何东西使该类与其他。这就是为什么Monoid是自由的,因为它不依赖于Naturals的算术规则,也不依赖于Monoid规则以外的任何其他规则。
这是自由构建一个monoid的唯一方法,而不依赖于基础集合的内部规则。当然,串联表示为haskell中的列表。
- 注意:唯一重要的一点是它们共享相同数量的元素。例如,具有三个元素
a
,b
和c
的自由monoid将是这三个元素的任意连接,但是您可以选择以下任何一种符号:1
,{ {1}},2
或3
,α
,β
...,而类人动物将是同一件事
这是Last
满足的另一条法律:
forall (t :: Type) (x,y :: t).
Last (Just x) <> Last (Just y) === Last (Just y)
因为它满足其他法律,所以它一定不能是免费的Monoid。
,首先,让我们回顾一下免费monoid的定义。我从来没有完全理解如何将自由的monoid定义为遵守monoid法则而不是其他任何东西的结构。我们如何证明某物没有遵守任何规则,但上面已阐明?还是这只是一种直觉?
让我说明一下免费类人猿的目的。
如果我告诉您有一个包含一些元素a
,b
,c
的monoid,您可以从中得出什么?
- 通过编写涉及 generators
a
,b
,c
和monoid操作(+)
的表达式,我们可以找到该类四面体的更多元素和0
(又名(<>)
和mempty
)。 (请参阅答案后半部分的定义1。) - 我们可以使用等分定律来证明某些表达式表示相同的元素:我们可以证明诸如
((a + 0) + b) = (a + b)
之类的方程式。 (定义2。)实际上,我们可以仅凭知识就可以证明方程组是在任何等式中对任何值a
,b
,c
持有的方程。 (定理1。)
我们不能仅从等分面定律中证明方程式吗?例如,我们无法证明(a + b) = (b + a)
。但是,如果我们仅知道类半定律,我们也无法证明其否定(a + b) /= (b + a)
。这意味着什么?事实证明,该方程式在某些等式(例如,交换式等式)中成立,但在其他等式中不成立:例如,选择一个x + y = y
几乎所有x
和y
的等号(是Haskell中的Last
Monoid),如果我们选择不同的a
和b
,则选择(a + b) /= (b + a)
。
但这只是一个例子。对于仅凭单半定律不能证明的方程式,我们可以大体说些什么?自由monoid提供了一个明确的答案,实际上是一个通用的反例:在自由monoid(由a
,b
,c
生成的情况下,无法证明的方程式是错误的)。换句话说,当且仅当在自由单面体中为真(强调“ 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。由(一些原子符号)A
,B
,C
生成的 monoid表达式的集合为由语法定义:
e ::=
| A | B | C -- generators
| e + e -- binary operation (<>)
| 0 -- identity (mempty)
给出任何“合适的monoid”,即在(M,(+),0)
中具有某些选定元素a
,b
,c
的monoid M
(不必区分),表达式e
表示eval e
中的元素M
。
定义2。一个等式是一对表达式,写成e ~ f
。 可证明方程组是满足以下条件的最小方程组(“最小”(按包含顺序排序)):
- 它包括类半定律:
(e + 0) ~ e
,(0 + e) ~ e
,((e + f) + g) ~ (e + (f + g))
是可证明的。 - 这是一个等价关系(将一组元组视为一个关系):例如,对于自反性,
e ~ e
是可证明的。 - 这是一个全等关系:如果
e ~ f
是可证明的,则(g + e) ~ (g + f)
和(e + g) ~ (f + g)
是可证明的。
(该定义的想法是断言“ e ~ f
是可证明的”成立且仅当可以通过“应用”这些规则推论得出。“最小集”是将其形式化的常规方法。 )
“可证明方程式”的定义似乎是任意的。那些定义“可证明性”的正确规则吗?为什么特别要遵循这三个规则?值得注意的是,在首次尝试给出这种定义时,一致性规则可能并不明显。这是以下定理,稳健性和完整性的重点。添加(非冗余)规则,我们将失去健全性。删除规则,我们将失去完整性。
定理1。(健全性)如果e ~ f
是可证明的,则eval e = eval f
在任何“合适的单半体” M
中。
定理2。(完备性)如果e ~ f
不可证明,则它们的表示形式在F
,eval e /= eval f
中不同,其中F
是由A
,B
,C
生成的免费monoid。
(声音听起来比完整性更容易证明。练习供读者阅读。)
该完备性定理是对自由等分形的刻画:使该定理的陈述为真的任何其他等分形F
与该自由等分形是同构的(从技术上讲,这既需要完整性,又需要表示函数的假设) eval : Expr -> M
是排斥的)。这就是为什么我们可以说“免费的monoid”而不是“列表的monoid”;在这种表示形式无关紧要的情况下(“达到同构”),这种做法最准确。
实际上,如果通过等价关系“ _ ~ _
是可证明的”将“自由monoid”定义为等分表达式的商,则完整性是微不足道的。艰苦的工作实际上存在于一个单独的证明中,即该等式与列表的等式同构。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。