Set Bullet Behavior "Strict Subproofs".
Opaque upto.
(* The complement of make_shares. *)
Fixpoint make_shares_inv shs (lasts : list Z) i {struct lasts} : list share :=
match lasts with
| [] => []
| b :: rest => if eq_dec b i then hd Share.bot shs :: make_shares_inv (tl shs) rest i
else make_shares_inv (tl shs) rest i
end.

Lemma make_shares_join : forall i lasts shs sh0 j sh1 sh2
(Hlen : Zlength shs >= Zlength lasts)
(Hsh1 : sepalg_list.list_join sh0 shs sh1)
(Hsh2 : sepalg_list.list_join sh0 (make_shares shs lasts i) sh2)
(Hin : 0 <= j < Zlength shs)
(Hj : Znth j lasts = i),
exists sh', sepalg.join sh2 (Znth j shs) sh'.