The following code is from perm.v
in the Ssreflect Coq library.
I want to know what this result is.
Lemma perm_invK s : cancel (fun x => iinv (perm_onto s x)) s.
Proof. by move=> x /=; rewrite f_iinv. Qed.
The following code is from perm.v
in the Ssreflect Coq library.
I want to know what this result is.
Lemma perm_invK s : cancel (fun x => iinv (perm_onto s x)) s.
Proof. by move=> x /=; rewrite f_iinv. Qed.
Definitions in Ssreflect can involve lots of concepts, and sometimes it is hard to understand what is actually going on. Let's analyze this by parts.
iinv
(defined in fintype.v
) has type
iinv : forall (T : finType) (T' : eqType) (f : T -> T')
(A : pred T) (y : T'),
y \in [seq f x | x in A] -> T
What this does is to invert any function f : T -> T'
whose restriction to a subdomain A \subset T
is surjective on T'
. Put in other words, if you give me an y
that is in the list of results of applying f
to all elements of A
, then I can find you an x \in A
such that f x = y
. Notice that this relies crucially on the fact that T
is a finite type and that T'
has decidable equality. The correctness of iinv
is stated in lemma f_iinv
, which is used above.
perm_onto
has type codom s =i predT
, where s
is some permutation defined on a finite type T
. This is saying, as its name implies, that s
is surjective (which is obvious, since it is injective, by the definition of permutations in perm.v
, and by the fact that the domain and codomain are the same). Thus, fun x => iinv (perm_onto s x)
is a function that maps an element x
to an element y
such that s y = x
. In other words, its the inverse of s
. perm_invK
is simply stating that this function is indeed the inverse (to be more precise, it is saying that it is the left inverse of s
).
The definition that is actually useful, however, is perm_inv
, which appears right below. What it does is that it packages fun x => iinv (perm_onto s x)
with its proof of correctness perm_invK
to define an element of perm_inv s
of type {perm T}
such that perm_inv s * s = s * perm_inv s = 1
. Thus, you can view it as saying that the type {perm T}
is closed under inverses, which allows you to use a lot of the ssr machinery for e.g. finite groups and monoids.