Definition upd_compact_sum {A} {F} (l: list A) (v: compact_sum (map F l)) (a: A) (v0: F a) (H: forall a b: A, {a = b} + {a <> b}) : compact_sum (map F l).Definition proj_compact_prod {A: Type} {F: A -> Type} (a: A) (l: list A) (v: compact_prod (map F l)) (default: F a) (H: forall a b: A, {a = b} + {a <> b}) : F a.Definition proj_compact_sum {A: Type} {F: A -> Type} (a: A) (l: list A) (v: compact_sum (map F l)) (default: F a) (H: forall a b: A, {a = b} + {a <> b}) : F a.Definition compact_sum_inj {A: Type} {F: A -> Type} {l: list A} (v: compact_sum (map F l)) (a: A) (H: forall a b: A, {a = b} + {a <> b}): Prop.

(* Specifications: *)
Lemma compact_sum_inj_in: forall {A: Type} {F: A -> Type} {l: list A} (v: compact_sum (map F l)) (a: A) H, compact_sum_inj v a H -> In a l.
Lemma compact_prod_proj_gen: forall {A: Type} {F: A -> Type} {l: list A} a d (gen: forall a, F a) (H: forall a b : A, {a = b} + {a <> b}), In a l -> proj_compact_prod a l (compact_prod_gen gen l) d H = gen a.
Lemma compact_sum_proj_gen: forall {A: Type} {F: A -> Type} {l: list A} a df (filter: A -> bool) (gen: forall a, F a) (H: forall a b : A, {a = b} + {a <> b}), compact_sum_inj (compact_sum_gen filter gen l) a H -> proj_compact_sum a l (compact_sum_gen filter gen l) df H = gen a.
Lemma proj_compact_prod_JMeq: forall A i (l: list A) {F1: A -> Type} {F2: A -> Type} d1 d2 (v1: compact_prod (map F1 l)) (v2: compact_prod (map F2 l)) H, (forall i, In i l -> @eq Type (F1 i) (F2 i)) -> In i l -> JMeq v1 v2 -> JMeq (proj_compact_prod i l v1 d1 H) (proj_compact_prod i l v2 d2 H).
Lemma proj_compact_sum_JMeq': forall A i (l: list A) {F1: A -> Type} {F2: A -> Type} d1 d2 (v1: compact_sum (map F1 l)) (v2: compact_sum (map F2 l)) H, (forall i, In i l -> @eq Type (F1 i) (F2 i)) -> JMeq d1 d2 -> JMeq v1 v2 -> JMeq (proj_compact_sum i l v1 d1 H) (proj_compact_sum i l v2 d2 H).
Lemma proj_compact_sum_JMeq: forall A i (l: list A) {F1: A -> Type} {F2: A -> Type} d1 d2 (v1: compact_sum (map F1 l)) (v2: compact_sum (map F2 l)) H, (forall i, In i l -> @eq Type (F1 i) (F2 i)) -> compact_sum_inj v1 i H -> JMeq v1 v2 -> JMeq (proj_compact_sum i l v1 d1 H) (proj_compact_sum i l v2 d2 H).
Lemma compact_sum_inj_JMeq: forall {A} (l: list A) {F1: A -> Type} {F2: A -> Type} (v1: compact_sum (map F1 l)) (v2: compact_sum (map F2 l)) H, (forall i, In i l -> @eq Type (F1 i) (F2 i)) -> JMeq v1 v2 -> (forall i, compact_sum_inj v1 i H <-> compact_sum_inj v2 i H).
Lemma upd_compact_prod_JMeq: forall A i (l: list A) {F1: A -> Type} {F2: A -> Type} d1 d2 (v1: compact_prod (map F1 l)) (v2: compact_prod (map F2 l)) H, (forall i, In i l -> @eq Type (F1 i) (F2 i)) -> JMeq d1 d2 -> JMeq v1 v2 -> JMeq (upd_compact_prod l v1 i d1 H) (upd_compact_prod l v2 i d2 H).
Lemma upd_compact_sum_JMeq: forall A i (l: list A) {F1: A -> Type} {F2: A -> Type} d1 d2 (v1: compact_sum (map F1 l)) (v2: compact_sum (map F2 l)) H, (forall i, In i l -> @eq Type (F1 i) (F2 i)) -> JMeq d1 d2 -> JMeq v1 v2 -> JMeq (upd_compact_sum l v1 i d1 H) (upd_compact_sum l v2 i d2 H).