在他的“软件基础”一书中,Benjamin Pierce notes that
函数
的右反split
是combine
其中split
为unzip
,combine
为zip
。我想知道函数的“正逆”是什么意思,如果还有zip
的左逆。
答案 0 :(得分:6)
r
是一个标识函数,则{p> f
与f . r
正确相反(其中.
表示合成)。
如果l
是身份函数,则 f
是l . f
的左反。
在这里,他正在滥用命名,因为函数combine
并没有将这对列表作为输入,而是将其分别用于每个列表。
split
是combine
的右逆,而不是完全逆的原因是combine
函数在其大小不同时会丢弃其输入列表之一的元素。从这个意义上讲,split
会丢失combine
无法生成的信息。
也就是说,如果你从:
开始l1 = [1]
l2 = [2; 3; 4]
然后:
combine l1 l2 = [(1, 2)]
和
split (combine l1 l2) = ([1], [2])
由于split
刚刚删除元素combine
和combine
,3
无法成为4
的左反转。< / p>
另一方面,对于lp
对的任何列表:
let (l1, l2) := split lp in combine l1 l2
= lp
(如果(combine . split) lp = lp
将一对作为输入,则可以将其写为combine
答案 1 :(得分:2)
为了补充@ ptival的答案,流行图书馆中左/右逆的定义是:
Variables A B : Type.
Implicit Types (f : A -> B) (g : B -> A).
Definition cancel f g := forall x, g (f x) = x.
因此如果cancel f g
成立g
是f
的左反,而g
则是f
的右反。见http://math-comp.github.io/math-comp/htmldoc/mathcomp.ssreflect.ssrfun.html
请注意,由于Coq缺乏扩展性,因此需要f \o g = id
更方便。
在math-comp中,left_inverse
和right_inverse
保留给运营商。
答案 2 :(得分:-2)
你问这个问题是因为你没有意识到操作不一定是可交换的。
这是一个令人信服的例子:
设v是一个向量,让S为右移运算符,它将v一个位置的所有条目向右移动,然后将第一个条目设置为0。
设T为左移运算符,它丢弃v的第一个元素,然后将所有剩余元素向左移动一个位置。然后显然TSv = v,所以T表现为S的左反转,但是STv不一定等于v,因为Tv丢弃了后来由S无法恢复的v的第一个元素。因此T是不是S的正确反转。
答案 3 :(得分:-4)
指的是对中的顺序:
右反分裂是:
Fixpoint split {X Y : Type} (l : list (X*Y))
: (list X) * (list Y) :=
(* FILL IN HERE *) admit.
LEFT逆分割将具有相反顺序的输出列表:
Fixpoint split {X Y : Type} (l : list (X*Y))
: (list Y) * (list X) :=
(* FILL IN HERE *) admit.