以下代码来自perm.v
Ssreflect Coq 库。我想知道这个结果是什么。
Lemma perm_invK s : cancel (fun x => iinv (perm_onto s x)) s.
Proof. by move=> x /=; rewrite f_iinv. Qed.
以下代码来自perm.v
Ssreflect Coq 库。我想知道这个结果是什么。
Lemma perm_invK s : cancel (fun x => iinv (perm_onto s x)) s.
Proof. by move=> x /=; rewrite f_iinv. Qed.
Ssreflect 中的定义可能涉及很多概念,有时很难理解实际发生了什么。让我们分部分来分析。
iinv
(定义在fintype.v
)有类型
iinv : forall (T : finType) (T' : eqType) (f : T -> T')
(A : pred T) (y : T'),
y \in [seq f x | x in A] -> T
这样做是为了反转对子f : T -> T'
域的限制A \subset T
是满射的任何函数T'
。换句话说,如果你给我一个在应用于所有元素的y
结果列表中的那个,那么我可以找到你一个这样的那个。请注意,这主要依赖于一个有限类型且具有可判定相等性的事实。的正确性在上面使用的引理中说明。f
A
x \in A
f x = y
T
T'
iinv
f_iinv
perm_onto
有类型codom s =i predT
,其中s
是在有限类型上定义的一些排列T
。顾名思义,这s
是满射的(这很明显,因为它是单射的,根据 中排列的定义perm.v
,以及域和余域相同的事实)。因此,fun x => iinv (perm_onto s x)
是一个将元素映射到元素的函数x
,y
使得s y = x
. 换句话说,它是 的倒数s
。perm_invK
只是说这个函数确实是逆函数(更准确地说,它是 的左逆函数s
)。
然而,真正有用的定义是perm_inv
,它出现在下面。它所做的是将fun x => iinv (perm_onto s x)
其正确性证明打包perm_invK
以定义perm_inv s
类型{perm T}
为perm_inv s * s = s * perm_inv s = 1
. 因此,您可以将其视为说该类型{perm T}
在逆条件下是封闭的,这允许您将大量 ssr 机制用于有限群和幺半群。