什么是函数的右/左反?

时间:2016-05-20 03:42:25

标签: math coq

在他的“软件基础”一书中,Benjamin Pierce notes that

  

函数splitcombine

的右反

其中splitunzipcombinezip。我想知道函数的“正逆”是什么意思,如果还有zip的左逆。

4 个答案:

答案 0 :(得分:6)

如果r是一个标识函数,则{p> ff . r正确相反(其中.表示合成)。

如果l是身份函数,则

fl . f的左反。

在这里,他正在滥用命名,因为函数combine并没有将这对列表作为输入,而是将其分别用于每个列表。

splitcombine的右逆,而不是完全逆的原因是combine函数在其大小不同时会丢弃其输入列表之一的元素。从这个意义上讲,split会丢失combine无法生成的信息。

也就是说,如果你从:

开始
l1 = [1]
l2 = [2; 3; 4]

然后:

combine l1 l2 = [(1, 2)]

split (combine l1 l2) = ([1], [2])

由于split刚刚删除元素combinecombine3无法成为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成立gf的左反,而g则是f的右反。见http://math-comp.github.io/math-comp/htmldoc/mathcomp.ssreflect.ssrfun.html

请注意,由于Coq缺乏扩展性,因此需要f \o g = id更方便。

在math-comp中,left_inverseright_inverse保留给运营商。

答案 2 :(得分:-2)

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

这是一个令人信服的例子:

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

设T为左移运算符,它丢弃v的第一个元素,然后将所有剩余元素向左移动一个位置。然后显然TSv = v,所以T表现为S的反转,但是STv不一定等于v,因为Tv丢弃了后来由S无法恢复的v的第一个元素。因此T是不是S的正确反转。

请参阅:Generalized inverse (Wikipedia)

答案 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.