Math 什么';函数的右/左倒数是多少?

Math 什么';函数的右/左倒数是多少?,math,coq,Math,Coq,在他的书《软件基础》中 函数split是combine 其中split是unzip,combine是zip。我想知道一个函数的“右逆”是什么意思,如果还有一个zip的左逆,它指的是成对的顺序: 右反向拆分为: Fixpoint split {X Y : Type} (l : list (X*Y)) : (list X) * (list Y) := (* FILL IN HERE *) admit. 左反向拆分的输出列表顺序相反: Fixpoint split {X

在他的书《软件基础》中

函数
split
combine


其中
split
unzip
combine
zip
。我想知道一个函数的“右逆”是什么意思,如果还有一个
zip

的左逆,它指的是成对的顺序:

右反向拆分为:

Fixpoint split {X Y : Type} (l : list (X*Y))
               : (list X) * (list Y) :=
(* FILL IN HERE *) admit.
左反向拆分的输出列表顺序相反:

Fixpoint split {X Y : Type} (l : list (X*Y))
               : (list Y) * (list X) :=
(* FILL IN HERE *) admit.

r
f
if
f的右逆。r
是一个标识函数(其中
表示合成)

l
f
if
l的左倒数。f
是一个标识函数

在这里,他有点滥用命名,因为函数
combine
没有将这对列表作为输入,而是将它们分别作为输入

split
combine
的右反转,而不是完全反转的原因是
combine
函数会在其输入列表中的某个元素大小不同时删除这些元素。从这个意义上说,
split
丢失了
combine
无法产生的信息

也就是说,如果您从以下内容开始:

l1 = [1]
l2 = [2; 3; 4]
然后:

以及:

split
无法成为
combine
的左逆,因为
combine
刚刚删除了
3
4
元素

另一方面,对于任何配对列表
lp

let (l1, l2) := split lp in combine l1 l2
= lp

(如果
combine
将一对作为输入,您可以编写它
(combine.split)lp=lp

为了补充@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
的右逆。看

注意,由于Coq中缺乏扩展性,这比要求
f\o g=id
更方便


在数学计算中,
左逆
右逆
是为运算符保留的。

你问这个问题是因为你没有意识到运算不一定是可交换的

下面是一个令人信服的例子:

设v为向量,设S为右移运算符,它将v的所有条目向右移动一个位置,然后将第一个条目设置为0

设T为左移位运算符,它丢弃v的第一个元素,然后将所有剩余元素向左移位一个位置。很明显,TSv=v,所以T表现为S的左逆,但STv不一定等于v,因为Tv丢弃了v的第一个元素,后者不能由S恢复。因此T不是S的右逆

见:

let (l1, l2) := split lp in combine l1 l2
= lp
Variables A B : Type.
Implicit Types (f : A -> B) (g : B -> A).
Definition cancel f g := forall x, g (f x) = x.