%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%% Definition 16 : Data-stack substitution
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

dstack_substT : ctriv -> stack -> ctriv -> stack -> type.

dstack_substE : cexp -> stack -> cexp -> type.

dstack_substC : ccont -> stack -> ccont -> type.

dstack_subst_xlam : dstack_substT (xlam R)
                                  Xi 
                                  (xlam R) 
                                  Xi. 

dstack_subst_cret : dstack_substE (cret C T) Xi (cret C' T')
                    <- dstack_substT T Xi T' Xi'
                    <- dstack_substC C Xi' C'.

dstack_subst_capp : dstack_substE (capp T0 T1 C) Xi (capp T0' T1' C')
                    <- dstack_substT T1 Xi T1' Xi1
                    <- dstack_substT T0 Xi1 T0' Xi0
                    <- dstack_substC C Xi0 C'.

dstack_subst_vlam : dstack_substC (vlam E) Xi (vlam E')
                    <- {v:ctriv}
                       {dsv:{xi:stack}{t:ctriv}dstack_substT v (xi , t) t xi}
                       dstack_substE (E v) (Xi , v) (E' v). 
