Section ChoiceKeys.
Variable (K : choiceType).
Implicit Types (k : K) (ks : seq K).
Definition fset_sub_pickle x := index x fset_sub_enum.
Definition fset_sub_unpickle n := nth None (map some fset_sub_enum) n.
Definition fset_sub_countMixin := CountMixin fset_sub_pickleK.
Canonical fset_sub_countType := Eval hnf in CountType fset_sub_type fset_sub_countMixin.
Definition fset_sub_finMixin :=
Eval hnf in UniqFinMixin (undup_uniq _) mem_fset_sub_enum.
Canonical fset_sub_finType := Eval hnf in FinType fset_sub_type fset_sub_finMixin.
Canonical fset_sub_subfinType := [subFinType of fset_sub_type].

Lemma in_imfset2  (T1 : choiceType) (T2 : T1 -> choiceType)
(f : forall x, T2 x -> K) (p1 : finmempred T1)
(p2 : forall x, finmempred (T2 x)) (x : T1) (y : T2 x) :
in_mem x p1 -> in_mem y (p2 x) -> f x y \in imfset2 key f p1 p2.