(* Here we have an unfortunate detour to develop a theory of many-hole contexts, which allows us to prove that relativization is injective on the left. *)
Inductive Sctx : Set :=
| NodeB : Sctx -> Sctx -> Sctx
| NodeR : ShareTree -> Sctx -> Sctx
| NodeL : Sctx -> ShareTree -> Sctx
| Hole : Sctx
.
Fixpoint Sctx_app (c1 c2:Sctx) {struct c1} : Sctx :=
match c1 with
| NodeB l r => NodeB (Sctx_app l c2) (Sctx_app r c2)
| NodeR l r => NodeR l (Sctx_app r c2)
| NodeL l r => NodeL (Sctx_app l c2) r
| Hole      => c2
end.
Fixpoint fill (c:Sctx) (x:ShareTree) {struct c} : ShareTree :=
match c with
| NodeR l r => Node l (fill r x)
| NodeL l r => Node (fill l x) r
| NodeB l r => Node (fill l x) (fill r x)
| Hole      => x
end.

(* Specifications: *)
Lemma fill_app : forall c1 c2 x,
fill c1 (fill c2 x) = fill (Sctx_app c1 c2) x.
Lemma fill_id : forall x c,
fill c x = x -> c = Hole.