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
iff的右逆。r
是一个标识函数(其中
表示合成)
l
是f
ifl的左倒数。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.