以下代码来自Ssreflect Coq库中的perm.v
。
我想知道这个结果是什么。
Lemma perm_invK s : cancel (fun x => iinv (perm_onto s x)) s.
Proof. by move=> x /=; rewrite f_iinv. Qed.
答案 0 :(得分:3)
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}
类{{1}}的元素,使{{1}}成为{{1}}。因此,您可以将其视为表示类型{{1}}在反转下关闭,这允许您使用许多ssr机制,例如,有限群和幺半群。