我试图在编程环境中理解同构和同态,需要一些帮助。
在FPiS一书中,它解释说:
让我们从同态开始:
"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}}是同构?
答案 0 :(得分:5)
为什么这是同态?
根据定义。
为什么它会保留幺半群结构?
由于上面表达式中的==
。
例如,列表上的映射函数是同态吗?
是。将"foo"
和"bar"
替换为两个列表,将.length
替换为.map(f)
。然后很容易看出(并证明)等式成立。
为什么(false,||),(true,&&)和String和List [Char] monoid连接是同构的?
根据定义。证明是微不足道的,留作练习。 (提示:采用同构的定义,用具体对象替换所有抽象对象,证明结果数学表达式是正确的)
编辑:以下是您在评论中提出的几个定义:
同态:将一组转换为另一组,在第二组中保留第一组元素之间的关系。正式f: A → B
A
和B
都有*
操作,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 = 0
和x.length ⊕ y.length = (x ⊗ y).length
的属性。在这里,我故意为两个monoid操作使用了两个不同的符号,强调我们要对应用length
的结果应用加法运算与字符串连接操作在应用length
之前的两个参数上。不幸的是,您正在查看的示例对两个操作使用相同的符号+
。
编辑添加:问题海报要求提供有关幺半群同态的确切内容的更多细节。
好的,假设我们有两个monoids (A,⊕,a)和(B,⊗,b),意思是 A 和 B 是我们的两个载体,⊕:A×A→A 和⊗:B×B→B 是我们的两个二元运算符,a∈A和b∈B是我们的两个中性元素。这两个幺半群之间的幺半群同态是一个函数 f:A→B 具有以下属性:
关键是monoid同态是一种保留结构的映射(这就是homomorphism;将这个词分解为古希腊词根,你会看到它意味着'同形异形' “)。
好的,你问了一些例子,这里有一些例子!
length
是从自由幺半群(A ,·,ε)*到(ℕ,+,0)的幺半群同态/ em>的