什么是同构和同态

时间:2017-05-30 15:25:13

标签: scala functional-programming

我试图在编程环境中理解同构和同态,需要一些帮助。

在FPiS一书中,它解释说:

enter image description here enter image description here

让我们从同态开始:

"foo".length + "bar".length == ("foo" + "bar").length

这里,长度是保留幺半群结构的String to Int的函数。

  • 为什么这是同态?

  • 为什么要保留幺半群结构?

  • 例如,map list上的(false, ||), (true, &&)是同态吗?

关于同构,我从一本书中得到了以下解释:

  

M和N之间的幺半群同构有两个同态       f和g,其中f和T g和g和T f都是同一性函数。       例如,串联的String和List [Char] monoid是同构的。       两个布尔幺半群(假,||)和(真,&&)也是同构的,       通过! (否定)功能。

为什么String and List[Char] monoids with concatenation和{{1}}是同构?

2 个答案:

答案 0 :(得分:5)

  

为什么这是同态?

根据定义。

  

为什么它会保留幺半群结构?

由于上面表达式中的==

  

例如,列表上的映射函数是同态吗?

是。将"foo""bar"替换为两个列表,将.length替换为.map(f)。然后很容易看出(并证明)等式成立。

  

为什么(false,||),(true,&&)和String和List [Char] monoid连接是同构的?

根据定义。证明是微不足道的,留作练习。 (提示:采用同构的定义,用具体对象替换所有抽象对象,证明结果数学表达式是正确的)

编辑:以下是您在评论中提出的几个定义:

  • 同态:将一组转换为另一组,在第二组中保留第一组元素之间的关系。正式f: A → B AB都有*操作,f(x * y) = f(x) * f(y)

  • Monoid:具有单个关联二元运算和标识元素的代数结构。正式(M, *, id)是一个Monoid iff (a * b) * c == a * (b * c) && a * id == a && id * a == a for all a, b, c in M

答案 1 :(得分:2)

"foo".length + "bar".length == ("foo" + "bar").length

准确地说,这就是说length是具有连接的字符串的幺半群和具有加法的自然数的幺半群之间的单一同态。如果你付出努力,这两个结构都是幺半群很容易看到。

length是monoid同态的原因是因为它具有"".length = 0x.length ⊕ y.length = (x ⊗ y).length的属性。在这里,我故意为两个monoid操作使用了两个不同的符号,强调我们要对应用length 的结果应用加法运算与字符串连接操作在应用length 之前的两个参数上。不幸的是,您正在查看的示例对两个操作使用相同的符号+

编辑添加:问题海报要求提供有关幺半群同态的确切内容的更多细节。

好的,假设我们有两个monoids (A,⊕,a)(B,⊗,b),意思是 A B 是我们的两个载体,⊕:A×A→A ⊗:B×B→B 是我们的两个二元运算符,a∈Ab∈B是我们的两个中性元素。这两个幺半群之间的幺半群同态是一个函数 f:A→B 具有以下属性:

  • f(a)= b ,即如果在 A 的中性元素上应用 f ,则会得到<的中性元素EM>乙
  • f(x⊕y)= f(x)⊗f(y),即如果对 A的运算符的结果应用 f 在两个元素上,与在两个 A 元素上应用两次相同,然后使用 B 的运算符组合结果。

关键是monoid同态是一种保留结构的映射(这就是homomorphism;将这个词分解为古希腊词根,你会看到它意味着'同形异形' “)。

好的,你问了一些例子,这里有一些例子!

  • 上例中的一个:length是从自由幺半群(A ,·,ε)*到(ℕ,+,0)的幺半群同态/ em>的
  • 否定是从(Bool,∨,false)(Bool,∧,true)和反之亦然的monoid同态。
  • exp is a monoid homomorphism(ℝ,+,0)(ℝ\ {0},*,1)
  • 事实上,每个群体的同态也是一个同构的同态。